diff options
author | Ping Xie <pingxie@google.com> | 2022-11-16 19:24:18 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-16 19:24:18 -0800 |
commit | 203b12e41ff7981f0fae5b23819f072d61594813 (patch) | |
tree | ff5f2f829bbfcc6928190a01d401ee4b1ebbaf9e /src/cluster.h | |
parent | 2168ccc661791ced6271c5e4ab0f5eb60b1559e2 (diff) | |
download | redis-203b12e41ff7981f0fae5b23819f072d61594813.tar.gz |
Introduce Shard IDs to logically group nodes in cluster mode (#10536)
Introduce Shard IDs to logically group nodes in cluster mode.
1. Added a new "shard_id" field to "cluster nodes" output and nodes.conf after "hostname"
2. Added a new PING extension to propagate "shard_id"
3. Handled upgrade from pre-7.2 releases automatically
4. Refactored PING extension assembling/parsing logic
Behavior of Shard IDs:
Replicas will always follow the shards of their reported primaries. If a primary updates its shard ID, the replica will follow. (This need not follow for cluster v2) This is not an expected use case.
Diffstat (limited to 'src/cluster.h')
-rw-r--r-- | src/cluster.h | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/src/cluster.h b/src/cluster.h index f27072f20..332624ea5 100644 --- a/src/cluster.h +++ b/src/cluster.h @@ -117,6 +117,7 @@ typedef struct clusterNodeFailReport { typedef struct clusterNode { mstime_t ctime; /* Node object creation time. */ char name[CLUSTER_NAMELEN]; /* Node name, hex string, sha1-size */ + char shard_id[CLUSTER_NAMELEN]; /* shard id, hex string, sha1-size */ int flags; /* CLUSTER_NODE_... */ uint64_t configEpoch; /* Last configEpoch observed for this node */ unsigned char slots[CLUSTER_SLOTS/8]; /* slots handled by this node */ @@ -175,6 +176,7 @@ typedef struct clusterState { int state; /* CLUSTER_OK, CLUSTER_FAIL, ... */ int size; /* Num of master nodes with at least one slot */ dict *nodes; /* Hash table of name -> clusterNode structures */ + dict *shards; /* Hash table of shard_id -> list (of nodes) structures */ dict *nodes_black_list; /* Nodes we don't re-add for a few seconds. */ clusterNode *migrating_slots_to[CLUSTER_SLOTS]; clusterNode *importing_slots_from[CLUSTER_SLOTS]; @@ -256,6 +258,7 @@ typedef struct { typedef enum { CLUSTERMSG_EXT_TYPE_HOSTNAME, CLUSTERMSG_EXT_TYPE_FORGOTTEN_NODE, + CLUSTERMSG_EXT_TYPE_SHARDID, } clusterMsgPingtypes; /* Helper function for making sure extensions are eight byte aligned. */ @@ -273,12 +276,17 @@ typedef struct { static_assert(sizeof(clusterMsgPingExtForgottenNode) % 8 == 0, ""); typedef struct { + char shard_id[CLUSTER_NAMELEN]; /* The shard_id, 40 bytes fixed. */ +} clusterMsgPingExtShardId; + +typedef struct { uint32_t length; /* Total length of this extension message (including this header) */ uint16_t type; /* Type of this extension message (see clusterMsgPingExtTypes) */ uint16_t unused; /* 16 bits of padding to make this structure 8 byte aligned. */ union { clusterMsgPingExtHostname hostname; clusterMsgPingExtForgottenNode forgotten_node; + clusterMsgPingExtShardId shard_id; } ext[]; /* Actual extension information, formatted so that the data is 8 * byte aligned, regardless of its content. */ } clusterMsgPingExt; |