Redis-Cluster-Fast
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
deps/hiredis-cluster/hircluster.c view on Meta::CPAN
l1 = sdslen((sds)key1);
l2 = sdslen((sds)key2);
if (l1 != l2)
return 0;
return memcmp(key1, key2, l1) == 0;
}
void dictSdsDestructor(void *privdata, void *val) {
DICT_NOTUSED(privdata);
sdsfree(val);
}
void dictClusterNodeDestructor(void *privdata, void *val) {
DICT_NOTUSED(privdata);
freeRedisClusterNode(val);
}
/* Cluster node hash table
* maps node address (1.2.3.4:6379) to a redisClusterNode
* Has ownership of redisClusterNode memory
*/
dictType clusterNodesDictType = {
dictSdsHash, /* hash function */
NULL, /* key dup */
NULL, /* val dup */
dictSdsKeyCompare, /* key compare */
dictSdsDestructor, /* key destructor */
dictClusterNodeDestructor /* val destructor */
};
/* Referenced cluster node hash table
* maps node id (437c719f5.....) to a redisClusterNode
* No ownership of redisClusterNode memory
*/
dictType clusterNodesRefDictType = {
dictSdsHash, /* hash function */
NULL, /* key dup */
NULL, /* val dup */
dictSdsKeyCompare, /* key compare */
dictSdsDestructor, /* key destructor */
NULL /* val destructor */
};
void listCommandFree(void *command) {
struct cmd *cmd = command;
command_destroy(cmd);
}
/* -----------------------------------------------------------------------------
* Key space handling
* -------------------------------------------------------------------------- */
/* We have 16384 hash slots. The hash slot of a given key is obtained
* as the least significant 14 bits of the crc16 of the key.
*
* However if the key contains the {...} pattern, only the part between
* { and } is hashed. This may be useful in the future to force certain
* keys to be in the same node (assuming no resharding is in progress). */
static unsigned int keyHashSlot(char *key, int keylen) {
int s, e; /* start-end indexes of { and } */
for (s = 0; s < keylen; s++)
if (key[s] == '{')
break;
/* No '{' ? Hash the whole key. This is the base case. */
if (s == keylen)
return crc16(key, keylen) & 0x3FFF;
/* '{' found? Check if we have the corresponding '}'. */
for (e = s + 1; e < keylen; e++)
if (key[e] == '}')
break;
/* No '}' or nothing betweeen {} ? Hash the whole key. */
if (e == keylen || e == s + 1)
return crc16(key, keylen) & 0x3FFF;
/* If we are here there is both a { and a } on its right. Hash
* what is in the middle between { and }. */
return crc16(key + s + 1, e - s - 1) & 0x3FFF;
}
static void __redisClusterSetError(redisClusterContext *cc, int type,
const char *str) {
size_t len;
if (cc == NULL) {
return;
}
cc->err = type;
if (str != NULL) {
len = strlen(str);
len = len < (sizeof(cc->errstr) - 1) ? len : (sizeof(cc->errstr) - 1);
memcpy(cc->errstr, str, len);
cc->errstr[len] = '\0';
} else {
/* Only REDIS_ERR_IO may lack a description! */
assert(type == REDIS_ERR_IO);
strerror_r(errno, cc->errstr, sizeof(cc->errstr));
}
}
static int cluster_reply_error_type(redisReply *reply) {
if (reply == NULL) {
return REDIS_ERR;
}
if (reply->type == REDIS_REPLY_ERROR) {
if ((int)strlen(REDIS_ERROR_MOVED) < reply->len &&
memcmp(reply->str, REDIS_ERROR_MOVED, strlen(REDIS_ERROR_MOVED)) ==
0) {
return CLUSTER_ERR_MOVED;
} else if ((int)strlen(REDIS_ERROR_ASK) < reply->len &&
memcmp(reply->str, REDIS_ERROR_ASK,
strlen(REDIS_ERROR_ASK)) == 0) {
return CLUSTER_ERR_ASK;
} else if ((int)strlen(REDIS_ERROR_TRYAGAIN) < reply->len &&
view all matches for this distributionview release on metacpan - search on metacpan
( run in 2.380 seconds using v1.00-cache-2.02-grep-82fe00e-cpan-c30982ac1bc3 )