From c202ba2b35100b557946d578d67085791997e2f0 Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 19 Sep 2018 11:31:22 +0200 Subject: Module cluster flags: add hooks for NO_REDIRECTION flag. --- src/cluster.c | 10 ++++++++++ src/cluster.h | 6 +++--- src/server.c | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/cluster.c b/src/cluster.c index ad48641ec..591df418a 100644 --- a/src/cluster.c +++ b/src/cluster.c @@ -1589,6 +1589,12 @@ void clusterUpdateSlotsConfigWith(clusterNode *sender, uint64_t senderConfigEpoc } } + /* After updating the slots configuration, don't do any actual change + * in the state of the server if a module disabled Redis Cluster + * keys redirections. */ + if (server.cluster_module_flags & CLUSTER_MODULE_FLAG_NO_REDIRECTION) + return; + /* If at least one slot was reassigned from a node to another node * with a greater configEpoch, it is possible that: * 1) We are a master left without slots. This means that we were @@ -5435,6 +5441,10 @@ clusterNode *getNodeByQuery(client *c, struct redisCommand *cmd, robj **argv, in multiCmd mc; int i, slot = 0, migrating_slot = 0, importing_slot = 0, missing_keys = 0; + /* Allow any key to be set if a module disabled cluster redirections. */ + if (server.cluster_module_flags & CLUSTER_MODULE_FLAG_NO_REDIRECTION) + return myself; + /* Set error code optimistically for the base case. */ if (error_code) *error_code = CLUSTER_REDIR_NONE; diff --git a/src/cluster.h b/src/cluster.h index 68d7af3a4..571b9c543 100644 --- a/src/cluster.h +++ b/src/cluster.h @@ -103,9 +103,9 @@ typedef struct clusterLink { /* Flags that a module can set in order to prevent certain Redis Cluster * features to be enabled. Useful when implementing a different distributed * system on top of Redis Cluster message bus, using modules. */ -#define MODULE_CLUSTER_FLAG_NONE 0 -#define MODULE_CLUSTER_FLAG_NO_FAILOVER (1<<1) -#define MODULE_CLUSTER_FLAG_NO_REDIRECTION (1<<2) +#define CLUSTER_MODULE_FLAG_NONE 0 +#define CLUSTER_MODULE_FLAG_NO_FAILOVER (1<<1) +#define CLUSTER_MODULE_FLAG_NO_REDIRECTION (1<<2) /* This structure represent elements of node->fail_reports. */ typedef struct clusterNodeFailReport { diff --git a/src/server.c b/src/server.c index dee18fa6c..239434a2b 100644 --- a/src/server.c +++ b/src/server.c @@ -1621,7 +1621,7 @@ void initServerConfig(void) { server.cluster_announce_ip = CONFIG_DEFAULT_CLUSTER_ANNOUNCE_IP; server.cluster_announce_port = CONFIG_DEFAULT_CLUSTER_ANNOUNCE_PORT; server.cluster_announce_bus_port = CONFIG_DEFAULT_CLUSTER_ANNOUNCE_BUS_PORT; - server.cluster_module_flags = MODULE_CLUSTER_FLAG_NONE; + server.cluster_module_flags = CLUSTER_MODULE_FLAG_NONE; server.migrate_cached_sockets = dictCreate(&migrateCacheDictType,NULL); server.next_client_id = 1; /* Client IDs, start from 1 .*/ server.loading_process_events_interval_bytes = (1024*1024*2); -- cgit v1.2.1