Fix crash during handshake and cluster shards call (#10942)
* Fix an engine crash when there are nodes in handshaking and a user calls cluster shards
This commit is contained in:
parent
1209dc2277
commit
e6a1b2ea95
@ -1220,10 +1220,14 @@ clusterNode *clusterLookupNode(const char *name, int length) {
|
||||
return dictGetVal(de);
|
||||
}
|
||||
|
||||
/* Get all the nodes serving the same slots as myself. */
|
||||
/* Get all the nodes serving the same slots as the given node. */
|
||||
list *clusterGetNodesServingMySlots(clusterNode *node) {
|
||||
list *nodes_for_slot = listCreate();
|
||||
clusterNode *my_primary = nodeIsMaster(node) ? node : node->slaveof;
|
||||
|
||||
/* This function is only valid for fully connected nodes, so
|
||||
* they should have a known primary. */
|
||||
serverAssert(my_primary);
|
||||
listAddNodeTail(nodes_for_slot, my_primary);
|
||||
for (int i=0; i < my_primary->numslaves; i++) {
|
||||
listAddNodeTail(nodes_for_slot, my_primary->slaves[i]);
|
||||
@ -5103,7 +5107,7 @@ void clusterReplyShards(client *c) {
|
||||
* information and an empty slots array. */
|
||||
while((de = dictNext(di)) != NULL) {
|
||||
clusterNode *n = dictGetVal(de);
|
||||
if (nodeIsSlave(n)) {
|
||||
if (!nodeIsMaster(n)) {
|
||||
/* You can force a replica to own slots, even though it'll get reverted,
|
||||
* so freeing the slot pair here just in case. */
|
||||
clusterFreeNodesSlotsInfo(n);
|
||||
|
@ -182,4 +182,17 @@ test "Test the replica reports a loading state while it's loading" {
|
||||
|
||||
# Final sanity, the replica agrees it is online.
|
||||
assert_equal "online" [dict get [get_node_info_from_shard $replica_cluster_id $replica_id "node"] health]
|
||||
}
|
||||
}
|
||||
|
||||
test "Regression test for a crash when calling SHARDS during handshake" {
|
||||
# Reset forget a node, so we can use it to establish handshaking connections
|
||||
set id [R 19 CLUSTER MYID]
|
||||
R 19 CLUSTER RESET HARD
|
||||
for {set i 0} {$i < 19} {incr i} {
|
||||
R $i CLUSTER FORGET $id
|
||||
}
|
||||
R 19 cluster meet 127.0.0.1 [get_instance_attrib redis 0 port]
|
||||
# This should line would previously crash, since all the outbound
|
||||
# connections were in handshake state.
|
||||
R 19 CLUSTER SHARDS
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user