summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2018-09-19 12:02:37 +0200
committerantirez <antirez@gmail.com>2018-09-19 12:02:37 +0200
commit3213e8de921ef55896f740fb55e9469bbe2a22c4 (patch)
tree1b02a767b33a06124c777fe729abd6f3e2b74970
parent777cc5b98738df0156b1c822d7fb7851b5ffb4a6 (diff)
downloadredis-cluster-api-improvements.tar.gz
Module cluster flags: add RM_SetClusterFlags() API.cluster-api-improvements
-rw-r--r--src/cluster.c5
-rw-r--r--src/module.c26
-rw-r--r--src/redismodule.h2
3 files changed, 33 insertions, 0 deletions
diff --git a/src/cluster.c b/src/cluster.c
index 381ff827e..e82f256c2 100644
--- a/src/cluster.c
+++ b/src/cluster.c
@@ -3877,6 +3877,11 @@ int verifyClusterConfigWithData(void) {
int j;
int update_config = 0;
+ /* Return ASAP if a module disabled cluster redirections. In that case
+ * every master can store keys about every possible hash slot. */
+ if (server.cluster_module_flags & CLUSTER_MODULE_FLAG_NO_REDIRECTION)
+ return C_OK;
+
/* If this node is a slave, don't perform the check at all as we
* completely depend on the replication stream. */
if (nodeIsSlave(myself)) return C_OK;
diff --git a/src/module.c b/src/module.c
index 9b7365fe2..57e7c92f3 100644
--- a/src/module.c
+++ b/src/module.c
@@ -4132,6 +4132,31 @@ int RM_GetClusterNodeInfo(RedisModuleCtx *ctx, const char *id, char *ip, char *m
return REDISMODULE_OK;
}
+/* Set Redis Cluster flags in order to change the normal behavior of
+ * Redis Cluster, especially with the goal of disabling certain functions.
+ * This is useful for modules that use the Cluster API in order to create
+ * a different distributed system, but still want to use the Redis Cluster
+ * message bus. Flags that can be set:
+ *
+ * CLUSTER_MODULE_FLAG_NO_FAILOVER
+ * CLUSTER_MODULE_FLAG_NO_REDIRECTION
+ *
+ * With the following effects:
+ *
+ * NO_FAILOVER: prevent Redis Cluster slaves to failover a failing master.
+ * Also disables the replica migration feature.
+ *
+ * NO_REDIRECTION: Every node will accept any key, without trying to perform
+ * partitioning according to the user Redis Cluster algorithm.
+ * Slots informations will still be propagated across the
+ * cluster, but without effects. */
+void RM_SetClusterFlags(RedisModuleCtx *ctx, uint64_t flags) {
+ if (flags & REDISMODULE_CLUSTER_FLAG_NO_FAILOVER)
+ server.cluster_module_flags |= CLUSTER_MODULE_FLAG_NO_FAILOVER;
+ if (flags & REDISMODULE_CLUSTER_FLAG_NO_REDIRECTION)
+ server.cluster_module_flags |= CLUSTER_MODULE_FLAG_NO_REDIRECTION;
+}
+
/* --------------------------------------------------------------------------
* Modules Timers API
*
@@ -4708,4 +4733,5 @@ void moduleRegisterCoreAPI(void) {
REGISTER_API(BlockedClientDisconnected);
REGISTER_API(SetDisconnectCallback);
REGISTER_API(GetBlockedClientHandle);
+ REGISTER_API(SetClusterFlags);
}
diff --git a/src/redismodule.h b/src/redismodule.h
index d37865643..77fac9e63 100644
--- a/src/redismodule.h
+++ b/src/redismodule.h
@@ -307,6 +307,7 @@ size_t REDISMODULE_API_FUNC(RedisModule_GetClusterSize)(void);
void REDISMODULE_API_FUNC(RedisModule_GetRandomBytes)(unsigned char *dst, size_t len);
void REDISMODULE_API_FUNC(RedisModule_GetRandomHexChars)(char *dst, size_t len);
void REDISMODULE_API_FUNC(RedisModule_SetDisconnectCallback)(RedisModuleBlockedClient *bc, RedisModuleDisconnectFunc callback);
+void REDISMODULE_API_FUNC(RedisModule_SetClusterFlags)(RedisModuleCtx *ctx, uint64_t flags);
#endif
/* This is included inline inside each Redis module. */
@@ -444,6 +445,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int
REDISMODULE_GET_API(GetClusterSize);
REDISMODULE_GET_API(GetRandomBytes);
REDISMODULE_GET_API(GetRandomHexChars);
+ REDISMODULE_GET_API(SetClusterFlags);
#endif
if (RedisModule_IsModuleNameBusy && RedisModule_IsModuleNameBusy(name)) return REDISMODULE_ERR;