Cleaning up the cluster interface by moving almost all related declar… (#9080)
* Cleaning up the cluster interface by moving almost all related declarations into cluster.h (no logic change -- just moving declarations/definitions around) This initial effort leaves two items out of scope - the configuration parsing into the server struct and the internals exposed by the clusterNode struct. * Remove unneeded declarations of dictSds* Ideally all the dictSds functionality would move from server.c into a dedicated module so we can avoid the duplication in redis-benchmark/cli * Move crc16 back into server.h, will be moved out once we create a seperate header file for hashing functions
This commit is contained in:
parent
e5d8a5eb85
commit
c7e502a07b
@ -81,6 +81,31 @@ const char *clusterGetMessageTypeString(int type);
|
|||||||
#define RCVBUF_INIT_LEN 1024
|
#define RCVBUF_INIT_LEN 1024
|
||||||
#define RCVBUF_MAX_PREALLOC (1<<20) /* 1MB */
|
#define RCVBUF_MAX_PREALLOC (1<<20) /* 1MB */
|
||||||
|
|
||||||
|
/* Cluster nodes hash table, mapping nodes addresses 1.2.3.4:6379 to
|
||||||
|
* clusterNode structures. */
|
||||||
|
dictType clusterNodesDictType = {
|
||||||
|
dictSdsHash, /* hash function */
|
||||||
|
NULL, /* key dup */
|
||||||
|
NULL, /* val dup */
|
||||||
|
dictSdsKeyCompare, /* key compare */
|
||||||
|
dictSdsDestructor, /* key destructor */
|
||||||
|
NULL, /* val destructor */
|
||||||
|
NULL /* allow to expand */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Cluster re-addition blacklist. This maps node IDs to the time
|
||||||
|
* we can re-add this node. The goal is to avoid readding a removed
|
||||||
|
* node for some time. */
|
||||||
|
dictType clusterNodesBlackListDictType = {
|
||||||
|
dictSdsCaseHash, /* hash function */
|
||||||
|
NULL, /* key dup */
|
||||||
|
NULL, /* val dup */
|
||||||
|
dictSdsKeyCaseCompare, /* key compare */
|
||||||
|
dictSdsDestructor, /* key destructor */
|
||||||
|
NULL, /* val destructor */
|
||||||
|
NULL /* allow to expand */
|
||||||
|
};
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
* Initialization
|
* Initialization
|
||||||
* -------------------------------------------------------------------------- */
|
* -------------------------------------------------------------------------- */
|
||||||
|
@ -15,8 +15,6 @@
|
|||||||
* multiplicators of the node timeout value (when ending with MULT). */
|
* multiplicators of the node timeout value (when ending with MULT). */
|
||||||
#define CLUSTER_FAIL_REPORT_VALIDITY_MULT 2 /* Fail report validity. */
|
#define CLUSTER_FAIL_REPORT_VALIDITY_MULT 2 /* Fail report validity. */
|
||||||
#define CLUSTER_FAIL_UNDO_TIME_MULT 2 /* Undo fail if master is back. */
|
#define CLUSTER_FAIL_UNDO_TIME_MULT 2 /* Undo fail if master is back. */
|
||||||
#define CLUSTER_FAIL_UNDO_TIME_ADD 10 /* Some additional time. */
|
|
||||||
#define CLUSTER_FAILOVER_DELAY 5 /* Seconds */
|
|
||||||
#define CLUSTER_MF_TIMEOUT 5000 /* Milliseconds to do a manual failover. */
|
#define CLUSTER_MF_TIMEOUT 5000 /* Milliseconds to do a manual failover. */
|
||||||
#define CLUSTER_MF_PAUSE_MULT 2 /* Master pause manual failover mult. */
|
#define CLUSTER_MF_PAUSE_MULT 2 /* Master pause manual failover mult. */
|
||||||
#define CLUSTER_SLAVE_MIGRATION_DELAY 5000 /* Delay for slave migration. */
|
#define CLUSTER_SLAVE_MIGRATION_DELAY 5000 /* Delay for slave migration. */
|
||||||
@ -288,9 +286,18 @@ typedef struct {
|
|||||||
master is up. */
|
master is up. */
|
||||||
|
|
||||||
/* ---------------------- API exported outside cluster.c -------------------- */
|
/* ---------------------- API exported outside cluster.c -------------------- */
|
||||||
|
void clusterInit(void);
|
||||||
|
void clusterCron(void);
|
||||||
|
void clusterBeforeSleep(void);
|
||||||
clusterNode *getNodeByQuery(client *c, struct redisCommand *cmd, robj **argv, int argc, int *hashslot, int *ask);
|
clusterNode *getNodeByQuery(client *c, struct redisCommand *cmd, robj **argv, int argc, int *hashslot, int *ask);
|
||||||
|
clusterNode *clusterLookupNode(const char *name);
|
||||||
int clusterRedirectBlockedClientIfNeeded(client *c);
|
int clusterRedirectBlockedClientIfNeeded(client *c);
|
||||||
void clusterRedirectClient(client *c, clusterNode *n, int hashslot, int error_code);
|
void clusterRedirectClient(client *c, clusterNode *n, int hashslot, int error_code);
|
||||||
|
void migrateCloseTimedoutSockets(void);
|
||||||
|
int verifyClusterConfigWithData(void);
|
||||||
unsigned long getClusterConnectionsCount(void);
|
unsigned long getClusterConnectionsCount(void);
|
||||||
|
int clusterSendModuleMessageToTarget(const char *target, uint64_t module_id, uint8_t type, unsigned char *payload, uint32_t len);
|
||||||
|
void clusterPropagatePublish(robj *channel, robj *message);
|
||||||
|
unsigned int keyHashSlot(char *key, int keylen);
|
||||||
|
|
||||||
#endif /* __CLUSTER_H */
|
#endif /* __CLUSTER_H */
|
||||||
|
@ -1058,9 +1058,6 @@ void configGetCommand(client *c) {
|
|||||||
/* We use the following dictionary type to store where a configuration
|
/* We use the following dictionary type to store where a configuration
|
||||||
* option is mentioned in the old configuration file, so it's
|
* option is mentioned in the old configuration file, so it's
|
||||||
* like "maxmemory" -> list of line numbers (first line is zero). */
|
* like "maxmemory" -> list of line numbers (first line is zero). */
|
||||||
uint64_t dictSdsCaseHash(const void *key);
|
|
||||||
int dictSdsKeyCaseCompare(void *privdata, const void *key1, const void *key2);
|
|
||||||
void dictSdsDestructor(void *privdata, void *val);
|
|
||||||
void dictListDestructor(void *privdata, void *val);
|
void dictListDestructor(void *privdata, void *val);
|
||||||
|
|
||||||
/* Sentinel config rewriting is implemented inside sentinel.c by
|
/* Sentinel config rewriting is implemented inside sentinel.c by
|
||||||
|
@ -6125,8 +6125,6 @@ size_t RM_GetClusterSize(void) {
|
|||||||
return dictSize(server.cluster->nodes);
|
return dictSize(server.cluster->nodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
clusterNode *clusterLookupNode(const char *name); /* We need access to internals */
|
|
||||||
|
|
||||||
/* Populate the specified info for the node having as ID the specified 'id',
|
/* Populate the specified info for the node having as ID the specified 'id',
|
||||||
* then returns REDISMODULE_OK. Otherwise if the node ID does not exist from
|
* then returns REDISMODULE_OK. Otherwise if the node ID does not exist from
|
||||||
* the POV of this local node, REDISMODULE_ERR is returned.
|
* the POV of this local node, REDISMODULE_ERR is returned.
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
|
#include "cluster.h"
|
||||||
|
|
||||||
int clientSubscriptionsCount(client *c);
|
int clientSubscriptionsCount(client *c);
|
||||||
|
|
||||||
|
@ -404,10 +404,6 @@ void sentinelSimFailureCrash(void);
|
|||||||
|
|
||||||
/* ========================= Dictionary types =============================== */
|
/* ========================= Dictionary types =============================== */
|
||||||
|
|
||||||
uint64_t dictSdsHash(const void *key);
|
|
||||||
uint64_t dictSdsCaseHash(const void *key);
|
|
||||||
int dictSdsKeyCompare(void *privdata, const void *key1, const void *key2);
|
|
||||||
int dictSdsKeyCaseCompare(void *privdata, const void *key1, const void *key2);
|
|
||||||
void releaseSentinelRedisInstance(sentinelRedisInstance *ri);
|
void releaseSentinelRedisInstance(sentinelRedisInstance *ri);
|
||||||
|
|
||||||
void dictInstancesValDestructor (void *privdata, void *obj) {
|
void dictInstancesValDestructor (void *privdata, void *obj) {
|
||||||
|
25
src/server.c
25
src/server.c
@ -1499,31 +1499,6 @@ dictType keylistDictType = {
|
|||||||
NULL /* allow to expand */
|
NULL /* allow to expand */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Cluster nodes hash table, mapping nodes addresses 1.2.3.4:6379 to
|
|
||||||
* clusterNode structures. */
|
|
||||||
dictType clusterNodesDictType = {
|
|
||||||
dictSdsHash, /* hash function */
|
|
||||||
NULL, /* key dup */
|
|
||||||
NULL, /* val dup */
|
|
||||||
dictSdsKeyCompare, /* key compare */
|
|
||||||
dictSdsDestructor, /* key destructor */
|
|
||||||
NULL, /* val destructor */
|
|
||||||
NULL /* allow to expand */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Cluster re-addition blacklist. This maps node IDs to the time
|
|
||||||
* we can re-add this node. The goal is to avoid readding a removed
|
|
||||||
* node for some time. */
|
|
||||||
dictType clusterNodesBlackListDictType = {
|
|
||||||
dictSdsCaseHash, /* hash function */
|
|
||||||
NULL, /* key dup */
|
|
||||||
NULL, /* val dup */
|
|
||||||
dictSdsKeyCaseCompare, /* key compare */
|
|
||||||
dictSdsDestructor, /* key destructor */
|
|
||||||
NULL, /* val destructor */
|
|
||||||
NULL /* allow to expand */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Modules system dictionary type. Keys are module name,
|
/* Modules system dictionary type. Keys are module name,
|
||||||
* values are pointer to RedisModule struct. */
|
* values are pointer to RedisModule struct. */
|
||||||
dictType modulesDictType = {
|
dictType modulesDictType = {
|
||||||
|
15
src/server.h
15
src/server.h
@ -1178,8 +1178,6 @@ typedef struct redisTLSContextConfig {
|
|||||||
* Global server state
|
* Global server state
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
struct clusterState;
|
|
||||||
|
|
||||||
/* AIX defines hz to __hz, we don't use this define and in order to allow
|
/* AIX defines hz to __hz, we don't use this define and in order to allow
|
||||||
* Redis build on AIX we need to undef it. */
|
* Redis build on AIX we need to undef it. */
|
||||||
#ifdef _AIX
|
#ifdef _AIX
|
||||||
@ -1774,8 +1772,6 @@ extern dictType objectKeyPointerValueDictType;
|
|||||||
extern dictType objectKeyHeapPointerValueDictType;
|
extern dictType objectKeyHeapPointerValueDictType;
|
||||||
extern dictType setDictType;
|
extern dictType setDictType;
|
||||||
extern dictType zsetDictType;
|
extern dictType zsetDictType;
|
||||||
extern dictType clusterNodesDictType;
|
|
||||||
extern dictType clusterNodesBlackListDictType;
|
|
||||||
extern dictType dbDictType;
|
extern dictType dbDictType;
|
||||||
extern dictType shaScriptObjectDictType;
|
extern dictType shaScriptObjectDictType;
|
||||||
extern double R_Zero, R_PosInf, R_NegInf, R_Nan;
|
extern double R_Zero, R_PosInf, R_NegInf, R_Nan;
|
||||||
@ -2400,7 +2396,6 @@ void signalFlushedDb(int dbid, int async);
|
|||||||
unsigned int getKeysInSlot(unsigned int hashslot, robj **keys, unsigned int count);
|
unsigned int getKeysInSlot(unsigned int hashslot, robj **keys, unsigned int count);
|
||||||
unsigned int countKeysInSlot(unsigned int hashslot);
|
unsigned int countKeysInSlot(unsigned int hashslot);
|
||||||
unsigned int delKeysInSlot(unsigned int hashslot);
|
unsigned int delKeysInSlot(unsigned int hashslot);
|
||||||
int verifyClusterConfigWithData(void);
|
|
||||||
void scanGenericCommand(client *c, robj *o, unsigned long cursor);
|
void scanGenericCommand(client *c, robj *o, unsigned long cursor);
|
||||||
int parseScanCursorOrReply(client *c, robj *o, unsigned long *cursor);
|
int parseScanCursorOrReply(client *c, robj *o, unsigned long *cursor);
|
||||||
void slotToKeyAdd(sds key);
|
void slotToKeyAdd(sds key);
|
||||||
@ -2430,15 +2425,7 @@ int xreadGetKeys(struct redisCommand *cmd, robj **argv, int argc, getKeysResult
|
|||||||
int memoryGetKeys(struct redisCommand *cmd, robj **argv, int argc, getKeysResult *result);
|
int memoryGetKeys(struct redisCommand *cmd, robj **argv, int argc, getKeysResult *result);
|
||||||
int lcsGetKeys(struct redisCommand *cmd, robj **argv, int argc, getKeysResult *result);
|
int lcsGetKeys(struct redisCommand *cmd, robj **argv, int argc, getKeysResult *result);
|
||||||
|
|
||||||
/* Cluster */
|
|
||||||
void clusterInit(void);
|
|
||||||
unsigned short crc16(const char *buf, int len);
|
unsigned short crc16(const char *buf, int len);
|
||||||
unsigned int keyHashSlot(char *key, int keylen);
|
|
||||||
void clusterCron(void);
|
|
||||||
void clusterPropagatePublish(robj *channel, robj *message);
|
|
||||||
void migrateCloseTimedoutSockets(void);
|
|
||||||
void clusterBeforeSleep(void);
|
|
||||||
int clusterSendModuleMessageToTarget(const char *target, uint64_t module_id, uint8_t type, unsigned char *payload, uint32_t len);
|
|
||||||
|
|
||||||
/* Sentinel */
|
/* Sentinel */
|
||||||
void initSentinelConfig(void);
|
void initSentinelConfig(void);
|
||||||
@ -2503,7 +2490,9 @@ int performEvictions(void);
|
|||||||
|
|
||||||
/* Keys hashing / comparison functions for dict.c hash tables. */
|
/* Keys hashing / comparison functions for dict.c hash tables. */
|
||||||
uint64_t dictSdsHash(const void *key);
|
uint64_t dictSdsHash(const void *key);
|
||||||
|
uint64_t dictSdsCaseHash(const void *key);
|
||||||
int dictSdsKeyCompare(void *privdata, const void *key1, const void *key2);
|
int dictSdsKeyCompare(void *privdata, const void *key1, const void *key2);
|
||||||
|
int dictSdsKeyCaseCompare(void *privdata, const void *key1, const void *key2);
|
||||||
void dictSdsDestructor(void *privdata, void *val);
|
void dictSdsDestructor(void *privdata, void *val);
|
||||||
|
|
||||||
/* Git SHA1 */
|
/* Git SHA1 */
|
||||||
|
@ -2537,9 +2537,6 @@ static void zdiff(zsetopsrc *src, long setnum, zset *dstzset, size_t *maxelelen)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t dictSdsHash(const void *key);
|
|
||||||
int dictSdsKeyCompare(void *privdata, const void *key1, const void *key2);
|
|
||||||
|
|
||||||
dictType setAccumulatorDictType = {
|
dictType setAccumulatorDictType = {
|
||||||
dictSdsHash, /* hash function */
|
dictSdsHash, /* hash function */
|
||||||
NULL, /* key dup */
|
NULL, /* key dup */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user