- 
                Notifications
    
You must be signed in to change notification settings  - Fork 2.5k
 
Closed
Description
In a cluster with 3 masters (ports 7000-7002) and 3 slaves (ports 7003-7005) connected as:
c := redis.NewClusterClient(&redis.ClusterOptions{
	Addrs: []string{":7000", ":7001", ":7002"},
})Using WrapProcess inside ForEachNode does not wrap each client, leaving gaps. ForEachNode uses a for loop to go through each master (state.masters) and slave (state.slaves), but omits some nodes (state.nodes.nodes).
In the above setup, the state field contains:
state.masters:
172.17.0.2:7002
172.17.0.2:7000
172.17.0.2:7001
state.slaves:
172.17.0.2:7005
172.17.0.2:7003
172.17.0.2:7004
state.nodes.nodes:
172.17.0.2:7002
172.17.0.2:7005
172.17.0.2:7000
172.17.0.2:7003
172.17.0.2:7004
:7000
:7001
:7002
172.17.0.2:7001
Even though ForEachNode goes as expected through each unique node, it does not offer the possibility to tap into every client. One possible fix could be:
diff --git a/cluster.go b/cluster.go
index a2c18b3..8761000 100644
--- a/cluster.go
+++ b/cluster.go
@@ -816,11 +816,7 @@ func (c *ClusterClient) ForEachNode(fn func(client *Client) error) error {
 		}
 	}
 
-	for _, node := range state.masters {
-		wg.Add(1)
-		go worker(node)
-	}
-	for _, node := range state.slaves {
+	for _, node := range state.nodes.nodes {
 		wg.Add(1)
 		go worker(node)
 	}Would this change or a similar one make sense? Or am I doing something stupid?
Metadata
Metadata
Assignees
Labels
No labels