/**********************************************************************/
struct get_public_ips_state {
- struct tevent_context *ev;
- struct ctdb_client_context *client;
uint32_t *pnns;
int count;
struct ctdb_public_ip_list *ips;
struct tevent_context *ev,
struct ctdb_client_context *client,
uint32_t *pnns,
- int count,
+ int count, int num_nodes,
bool available_only)
{
struct tevent_req *req, *subreq;
state->pnns = pnns;
state->count = count;
- state->ips = NULL;
+
+ state->ips = talloc_zero_array(state,
+ struct ctdb_public_ip_list,
+ num_nodes);
+ if (tevent_req_nomem(state->ips, req)) {
+ return tevent_req_post(req, ev);
+ }
+
+ /* Short circuit if no nodes being asked for IPs */
+ if (state->count == 0) {
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
+ }
ctdb_req_control_get_public_ips(&request, available_only);
subreq = ctdb_client_control_multi_send(mem_ctx, ev, client,
return;
}
- state->ips = talloc_zero_array(state, struct ctdb_public_ip_list,
- state->count);
- if (tevent_req_nomem(state->ips, req)) {
- return;
- }
-
for (i = 0; i < state->count; i++) {
uint32_t pnn;
struct ctdb_public_ip_list *ips;
}
}
+ if (substate->count == 0) {
+ /* No releases to send for this address... */
+ TALLOC_FREE(substate);
+ continue;
+ }
+
ip.pnn = tmp_ip->pnn;
ip.addr = tmp_ip->addr;
ctdb_req_control_release_ip(&request, &ip);
state->num_sent++;
}
+ /* None sent, finished... */
+ if (state->num_sent == 0) {
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
+ }
+
return req;
}
subreq = get_public_ips_send(state, state->ev, state->client,
state->pnns_active, state->num_active,
- false);
+ state->num_nodes, false);
if (tevent_req_nomem(subreq, req)) {
return;
}
subreq = get_public_ips_send(state, state->ev, state->client,
state->pnns_active, state->num_active,
- true);
+ state->num_nodes, true);
if (tevent_req_nomem(subreq, req)) {
return;
}
force_rebalance_nodes = parse_node_list(mem_ctx, argv[3]);
if (force_rebalance_nodes == NULL) {
usage(argv[0]);
- exit(1);
+ ret = EINVAL;
+ goto done;
}
}