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;
}
Exemple #2
0
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;
}