Skip to content

Commit 115ad8a

Browse files
committed
fix random shard picker
1 parent 8eef599 commit 115ad8a

File tree

1 file changed

+30
-7
lines changed

1 file changed

+30
-7
lines changed

osscluster.go

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1554,9 +1554,21 @@ func (c *ClusterClient) mapCmdsByNode(ctx context.Context, cmdsMap *cmdsMap, cmd
15541554
)
15551555
}
15561556
slot := c.cmdSlot(cmd, -1)
1557-
node, err := c.slotReadOnlyNode(state, slot)
1558-
if err != nil {
1559-
return err
1557+
var node *clusterNode
1558+
// For keyless commands (slot == -1), use ShardPicker if routing policies are enabled
1559+
if slot == -1 && !c.opt.DisableRoutingPolicies && c.opt.ShardPicker != nil {
1560+
if len(state.Masters) == 0 {
1561+
return errClusterNoNodes
1562+
}
1563+
// For read-only keyless commands, pick from all nodes (masters + slaves)
1564+
allNodes := append(state.Masters, state.Slaves...)
1565+
idx := c.opt.ShardPicker.Next(len(allNodes))
1566+
node = allNodes[idx]
1567+
} else {
1568+
node, err = c.slotReadOnlyNode(state, slot)
1569+
if err != nil {
1570+
return err
1571+
}
15601572
}
15611573
cmdsMap.Add(node, cmd)
15621574
}
@@ -1574,9 +1586,19 @@ func (c *ClusterClient) mapCmdsByNode(ctx context.Context, cmdsMap *cmdsMap, cmd
15741586
)
15751587
}
15761588
slot := c.cmdSlot(cmd, -1)
1577-
node, err := state.slotMasterNode(slot)
1578-
if err != nil {
1579-
return err
1589+
var node *clusterNode
1590+
// For keyless commands (slot == -1), use ShardPicker if routing policies are enabled
1591+
if slot == -1 && !c.opt.DisableRoutingPolicies && c.opt.ShardPicker != nil {
1592+
if len(state.Masters) == 0 {
1593+
return errClusterNoNodes
1594+
}
1595+
idx := c.opt.ShardPicker.Next(len(state.Masters))
1596+
node = state.Masters[idx]
1597+
} else {
1598+
node, err = state.slotMasterNode(slot)
1599+
if err != nil {
1600+
return err
1601+
}
15801602
}
15811603
cmdsMap.Add(node, cmd)
15821604
}
@@ -2198,7 +2220,8 @@ func cmdSlot(cmd Cmder, pos int, prefferedRandomSlot int) int {
21982220
if prefferedRandomSlot != -1 {
21992221
return prefferedRandomSlot
22002222
}
2201-
return hashtag.RandomSlot()
2223+
// Return -1 for keyless commands to signal that ShardPicker should be used
2224+
return -1
22022225
}
22032226
firstKey := cmd.stringArg(pos)
22042227
return hashtag.Slot(firstKey)

0 commit comments

Comments
 (0)