mmc_t *mmc_consistent_find_server(void *s, const char *key, int key_len TSRMLS_DC) /* {{{ */ { mmc_consistent_state_t *state = s; mmc_t *mmc; if (state->num_servers > 1) { unsigned int i, hash = state->hash(key, key_len); if (!state->buckets_populated) { mmc_consistent_populate_buckets(state); } mmc = state->buckets[hash % MMC_CONSISTENT_BUCKETS]; /* perform failover if needed */ for (i=0; !mmc_open(mmc, 0, NULL, NULL TSRMLS_CC) && MEMCACHE_G(allow_failover) && i<MEMCACHE_G(max_failover_attempts); i++) { char *next_key = emalloc(key_len + MAX_LENGTH_OF_LONG + 1); int next_len = sprintf(next_key, "%s-%d", key, i); MMC_DEBUG(("mmc_consistent_find_server: failed to connect to server '%s:%d' status %d, trying next", mmc->host, mmc->port, mmc->status)); hash = state->hash(next_key, next_len); mmc = state->buckets[hash % MMC_CONSISTENT_BUCKETS]; efree(next_key); } } else { mmc = state->points[0].server; mmc_open(mmc, 0, NULL, NULL TSRMLS_CC); } return mmc->status != MMC_STATUS_FAILED ? mmc : NULL; }
mmc_t *mmc_standard_find_server(void *s, const char *key, int key_len TSRMLS_DC) /* {{{ */ { mmc_standard_state_t *state = s; mmc_t *mmc; if (state->num_servers > 1) { unsigned int hash = mmc_hash(state, key, key_len), i; mmc = state->buckets[hash % state->num_buckets]; /* perform failover if needed */ for (i=0; !mmc_open(mmc, 0, NULL, NULL TSRMLS_CC) && MEMCACHE_G(allow_failover) && i<MEMCACHE_G(max_failover_attempts); i++) { char *next_key = emalloc(key_len + MAX_LENGTH_OF_LONG + 1); int next_len = sprintf(next_key, "%d%s", i+1, key); MMC_DEBUG(("mmc_standard_find_server: failed to connect to server '%s:%d' status %d, trying next", mmc->host, mmc->port, mmc->status)); hash += mmc_hash(state, next_key, next_len); mmc = state->buckets[hash % state->num_buckets]; efree(next_key); } } else { mmc = state->buckets[0]; mmc_open(mmc, 0, NULL, NULL TSRMLS_CC); } return mmc->status != MMC_STATUS_FAILED ? mmc : NULL; }