Avoid crash when a cluster node is a replica of a replica of itself
@@ -1977,7 +1977,13 @@ void clusterUpdateSlotsConfigWith(clusterNode *sender, uint64_t senderConfigEpoc
clusterDoBeforeSleep(CLUSTER_TODO_SAVE_CONFIG|
CLUSTER_TODO_UPDATE_STATE|
CLUSTER_TODO_FSYNC_CONFIG);
- } else if (myself->slaveof && myself->slaveof->slaveof) {
+ } else if (myself->slaveof && myself->slaveof->slaveof &&
+ /* In some rare case when CLUSTER FAILOVER TAKEOVER is used, it
+ * can happen that myself is a replica of a replica of myself. If
+ * this happens, we do nothing to avoid a crash and wait for the
+ * admin to repair the cluster. */
+ myself->slaveof->slaveof != myself)
+ {
/* Safeguard against sub-replicas. A replica's master can turn itself
* into a replica if its last slot is removed. If no other node takes
* over the slot, there is nothing else to trigger replica migration. */
