static lcb_error_t config_nodes(int mode, lcb_t instance, int cmd, void *arg) { const char *node_strs = arg; clconfig_provider *target; hostlist_t nodes_obj; lcb_error_t err; if (mode != LCB_CNTL_SET) { return LCB_EINVAL; } nodes_obj = hostlist_create(); if (!nodes_obj) { return LCB_CLIENT_ENOMEM; } err = hostlist_add_stringz(nodes_obj, node_strs, cmd == LCB_CNTL_CONFIG_HTTP_NODES ? LCB_CONFIG_HTTP_PORT : LCB_CONFIG_MCD_PORT); if (err != LCB_SUCCESS) { hostlist_destroy(nodes_obj); return err; } if (cmd == LCB_CNTL_CONFIG_HTTP_NODES) { target = lcb_confmon_get_provider(instance->confmon, LCB_CLCONFIG_HTTP); lcb_clconfig_http_set_nodes(target, nodes_obj); } else { target = lcb_confmon_get_provider(instance->confmon, LCB_CLCONFIG_CCCP); lcb_clconfig_cccp_set_nodes(target, nodes_obj); } hostlist_destroy(nodes_obj); return LCB_SUCCESS; }
static void refresh_nodes(clconfig_provider *pb, const hostlist_t newnodes, VBUCKET_CONFIG_HANDLE newconfig) { unsigned int ii; http_provider *http = (http_provider *)pb; hostlist_clear(http->nodes); if (!newconfig) { for (ii = 0; ii < newnodes->nentries; ii++) { hostlist_add_host(http->nodes, newnodes->entries + ii); } goto GT_DONE; } for (ii = 0; (int)ii < vbucket_config_get_num_servers(newconfig); ii++) { lcb_error_t status; const char *ss = vbucket_config_get_rest_api_server(newconfig, ii); lcb_assert(ss != NULL); status = hostlist_add_stringz(http->nodes, ss, LCB_CONFIG_HTTP_PORT); lcb_assert(status == LCB_SUCCESS); } GT_DONE: if (PROVIDER_SETTING(pb, randomize_bootstrap_nodes)) { hostlist_randomize(http->nodes); } }
lcb_error_t lcb_clconfig_mcraw_update(clconfig_provider *pb, const char *nodes) { lcb_error_t err; bc_MCRAW *mcr = (bc_MCRAW *)pb; hostlist_t hl = hostlist_create(); err = hostlist_add_stringz(hl, nodes, LCB_CONFIG_MCCOMPAT_PORT); if (err != LCB_SUCCESS) { hostlist_destroy(hl); return err; } configure_nodes(pb, hl); hostlist_destroy(hl); lcbio_async_signal(mcr->async); return LCB_SUCCESS; }
static void nodes_updated(clconfig_provider *provider, hostlist_t nodes, VBUCKET_CONFIG_HANDLE vbc) { int ii; cccp_provider *cccp = (cccp_provider *)provider; if (!vbc) { return; } if (vbucket_config_get_num_servers(vbc) < 1) { return; } hostlist_clear(cccp->nodes); for (ii = 0; ii < vbucket_config_get_num_servers(vbc); ii++) { const char *mcaddr = vbucket_config_get_server(vbc, ii); hostlist_add_stringz(cccp->nodes, mcaddr, 11210); } (void)nodes; }
static void refresh_nodes(clconfig_provider *pb, hostlist_t newnodes, VBUCKET_CONFIG_HANDLE newconfig) { unsigned int ii; http_provider *http = (http_provider *)pb; hostlist_clear(http->nodes); if (!newconfig) { for (ii = 0; ii < newnodes->nentries; ii++) { hostlist_add_host(http->nodes, newnodes->entries + ii); } return; } for (ii = 0; (int)ii < vbucket_config_get_num_servers(newconfig); ii++) { lcb_error_t status; const char *ss = vbucket_config_get_rest_api_server(newconfig, ii); lcb_assert(ss != NULL); status = hostlist_add_stringz(http->nodes, ss, 8091); lcb_assert(status == LCB_SUCCESS); } }
static void nodes_updated(clconfig_provider *provider, hostlist_t nodes, VBUCKET_CONFIG_HANDLE vbc) { int ii; cccp_provider *cccp = (cccp_provider *)provider; if (!vbc) { return; } if (vbucket_config_get_num_servers(vbc) < 1) { return; } hostlist_clear(cccp->nodes); for (ii = 0; ii < vbucket_config_get_num_servers(vbc); ii++) { const char *mcaddr = vbucket_config_get_server(vbc, ii); hostlist_add_stringz(cccp->nodes, mcaddr, LCB_CONFIG_MCD_PORT); } if (PROVIDER_SETTING(provider, randomize_bootstrap_nodes)) { hostlist_randomize(cccp->nodes); } (void)nodes; }
lcb_error_t lcb_init_providers(lcb_t obj, const struct lcb_create_st2 *e_options) { hostlist_t mc_nodes; lcb_error_t err; const char *hosts; int http_enabled = 1; int cccp_enabled = 1; clconfig_provider *http = lcb_confmon_get_provider(obj->confmon, LCB_CLCONFIG_HTTP); clconfig_provider *cccp = lcb_confmon_get_provider(obj->confmon, LCB_CLCONFIG_CCCP); if (e_options->transports) { int cccp_found = 0; int http_found = 0; const lcb_config_transport_t *cur; for (cur = e_options->transports; *cur != LCB_CONFIG_TRANSPORT_LIST_END; cur++) { if (*cur == LCB_CONFIG_TRANSPORT_CCCP) { cccp_found = 1; } else if (*cur == LCB_CONFIG_TRANSPORT_HTTP) { http_found = 1; } else { return LCB_EINVAL; } } if (http_found || cccp_found) { cccp_enabled = cccp_found; http_enabled = http_found; } } if (lcb_getenv_boolean("LCB_NO_CCCP")) { cccp_enabled = 0; } if (lcb_getenv_boolean("LCB_NO_HTTP")) { http_enabled = 0; } /** The only way we can get to here is if one of the vars are set */ if (cccp_enabled == 0 && http_enabled == 0) { return LCB_BAD_ENVIRONMENT; } if (http_enabled) { lcb_clconfig_http_enable(http); lcb_clconfig_http_set_nodes(http, obj->usernodes); } else { lcb_confmon_set_provider_active(obj->confmon, LCB_CLCONFIG_HTTP, 0); } if (!cccp_enabled) { lcb_confmon_set_provider_active(obj->confmon, LCB_CLCONFIG_CCCP, 0); return LCB_SUCCESS; } hosts = get_nonempty_string(e_options->mchosts); mc_nodes = hostlist_create(); if (!mc_nodes) { return LCB_CLIENT_ENOMEM; } if (hosts) { err = hostlist_add_stringz(mc_nodes, hosts, LCB_CONFIG_MCD_PORT); if (err != LCB_SUCCESS) { hostlist_destroy(mc_nodes); return err; } } else { lcb_size_t ii; for (ii = 0; ii < obj->usernodes->nentries; ii++) { lcb_host_t *cur = obj->usernodes->entries + ii; hostlist_add_stringz(mc_nodes, cur->host, LCB_CONFIG_MCD_PORT); } } lcb_clconfig_cccp_enable(cccp, obj); lcb_clconfig_cccp_set_nodes(cccp, mc_nodes); hostlist_destroy(mc_nodes); return LCB_SUCCESS; }