static lcb_error_t schedule_next_request(cccp_provider *cccp, lcb_error_t err, int can_rollover) { lcb_server_t *server = NULL; lcb_size_t ii; lcb_host_t *next_host = hostlist_shift_next(cccp->nodes, can_rollover); if (!next_host) { lcb_timer_disarm(cccp->timer); lcb_confmon_provider_failed(&cccp->base, err); cccp->server_active = 0; return err; } /** See if we can find a server */ for (ii = 0; ii < cccp->instance->nservers; ii++) { lcb_server_t *cur = cccp->instance->servers + ii; if (lcb_host_equals(&cur->curhost, next_host)) { server = cur; break; } } if (server) { protocol_binary_request_get_cluster_config req; cccp_cookie *cookie = calloc(1, sizeof(*cookie)); lcb_log(LOGARGS(cccp, INFO), "Re-Issuing CCCP Command on server struct %p", server); cookie->parent = cccp; memset(&req, 0, sizeof(req)); req.message.header.request.magic = PROTOCOL_BINARY_REQ; req.message.header.request.opcode = CMD_GET_CLUSTER_CONFIG; req.message.header.request.opaque = ++cccp->instance->seqno; lcb_server_start_packet(server, cookie, &req, sizeof(req.bytes)); lcb_server_end_packet(server); lcb_server_send_packets(server); lcb_timer_rearm(cccp->timer, PROVIDER_SETTING(&cccp->base, config_node_timeout)); } else { cccp->cur_connreq = calloc(1, sizeof(*cccp->cur_connreq)); connmgr_req_init(cccp->cur_connreq, next_host->host, next_host->port, socket_connected); cccp->cur_connreq->data = cccp; connmgr_get(cccp->instance->memd_sockpool, cccp->cur_connreq, PROVIDER_SETTING(&cccp->base, config_node_timeout)); } cccp->server_active = 1; return LCB_SUCCESS; }
lcb_error_t hostlist_add_host(hostlist_t hostlist, lcb_host_t *host) { lcb_size_t ii; lcb_size_t nalloc; for (ii = 0; ii < hostlist->nentries; ii++) { if (lcb_host_equals(hostlist->entries + ii, host)) { return LCB_SUCCESS; } } nalloc = hostlist->nalloc; if (!nalloc) { nalloc = 8; } else if (nalloc == hostlist->nentries) { nalloc *= 2; } if (nalloc > hostlist->nalloc) { lcb_host_t *new_entries; if (hostlist->entries) { new_entries = realloc(hostlist->entries, sizeof(*host) * nalloc); } else { new_entries = malloc(sizeof(*host) * nalloc); } if (!new_entries) { return LCB_CLIENT_ENOMEM; } hostlist->entries = new_entries; hostlist->nalloc = nalloc; } hostlist->entries[hostlist->nentries++] = *host; hostlist_reset_strlist(hostlist); return LCB_SUCCESS; }