} instance->backup_nodes[buii] = instance->servers[ii].rest_api_server; if (instance->randomize_bootstrap_nodes) { /* swap with random position < ii */ if (buii > 0) { lcb_size_t nn = (lcb_size_t)(gethrtime() >> 10) % buii; char *pp = instance->backup_nodes[buii]; instance->backup_nodes[ii] = instance->backup_nodes[nn]; instance->backup_nodes[nn] = pp; } } buii++; } instance->nreplicas = (lcb_uint16_t)vbucket_config_get_num_replicas(instance->vbucket_config); instance->dist_type = vbucket_config_get_distribution_type(instance->vbucket_config); /* * Run through all of the vbuckets and build a map of what they need. * It would have been nice if I could query libvbucket for the number * of vbuckets a server got, but there isn't at the moment.. */ max = (lcb_uint16_t)vbucket_config_get_num_vbuckets(instance->vbucket_config); instance->nvbuckets = max; free(instance->vb_server_map); instance->vb_server_map = calloc(max, sizeof(lcb_vbucket_t)); if (instance->vb_server_map == NULL) { return lcb_error_handler(instance, LCB_CLIENT_ENOMEM, "Failed to allocate memory"); } for (ii = 0; ii < max; ++ii) { instance->vb_server_map[ii] = (lcb_uint16_t)vbucket_get_master(instance->vbucket_config, ii); }
static int load_cache(file_provider *provider) { lcb_string str; char line[1024]; lcb_ssize_t nr; int fail; FILE *fp = NULL; VBUCKET_CONFIG_HANDLE config = NULL; char *end; struct stat st; int status = -1; lcb_string_init(&str); if (provider->filename == NULL) { return -1; } fp = fopen(provider->filename, "r"); if (fp == NULL) { LOG(provider, ERROR, "Couldn't open filename"); return -1; } if (fstat(fileno(fp), &st)) { provider->last_errno = errno; goto GT_DONE; } if (provider->last_mtime == st.st_mtime) { LOG(provider, INFO, "Rejecting file. Modification time too old"); goto GT_DONE; } config = vbucket_config_create(); if (config == NULL) { goto GT_DONE; } lcb_string_init(&str); while ((nr = fread(line, 1, sizeof(line), fp)) > 0) { if (lcb_string_append(&str, line, nr)) { goto GT_DONE; } } if (ferror(fp)) { goto GT_DONE; } fclose(fp); fp = NULL; if (!str.nused) { status = -1; goto GT_DONE; } end = strstr(str.base, CONFIG_CACHE_MAGIC); if (end == NULL) { LOG(provider, ERROR, "Couldn't find magic in file"); remove(provider->filename); status = -1; goto GT_DONE; } fail = vbucket_config_parse(config, LIBVBUCKET_SOURCE_MEMORY, str.base); if (fail) { status = -1; LOG(provider, ERROR, "Couldn't parse configuration"); remove(provider->filename); goto GT_DONE; } if (vbucket_config_get_distribution_type(config) != VBUCKET_DISTRIBUTION_VBUCKET) { status = -1; LOG(provider, ERROR, "Not applying cached memcached config"); goto GT_DONE; } if (provider->config) { lcb_clconfig_decref(provider->config); } provider->config = lcb_clconfig_create(config, &str, LCB_CLCONFIG_FILE); provider->config->cmpclock = gethrtime(); provider->config->origin = provider->base.type; provider->last_mtime = st.st_mtime; status = 0; config = NULL; GT_DONE: if (fp != NULL) { fclose(fp); } if (config != NULL) { vbucket_config_destroy(config); } lcb_string_release(&str); return status; }