From 3213e8de921ef55896f740fb55e9469bbe2a22c4 Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 19 Sep 2018 12:02:37 +0200 Subject: Module cluster flags: add RM_SetClusterFlags() API. --- src/cluster.c | 5 +++++ src/module.c | 26 ++++++++++++++++++++++++++ src/redismodule.h | 2 ++ 3 files changed, 33 insertions(+) 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; -- cgit v1.2.1