summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2018-09-19 11:31:22 +0200
committerantirez <antirez@gmail.com>2018-09-19 11:31:22 +0200
commitc202ba2b35100b557946d578d67085791997e2f0 (patch)
tree6e4e6dc686eebed6a82d8f30db0cddf36c622d2c
parent744fe7f348c82a6f55aab43f140a540d298747cf (diff)
downloadredis-c202ba2b35100b557946d578d67085791997e2f0.tar.gz
Module cluster flags: add hooks for NO_REDIRECTION flag.
-rw-r--r--src/cluster.c10
-rw-r--r--src/cluster.h6
-rw-r--r--src/server.c2
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);