@@ -998,7 +998,7 @@ func (c *ClusterClient) Process(ctx context.Context, cmd Cmder) error {
998
998
}
999
999
1000
1000
func (c * ClusterClient ) process (ctx context.Context , cmd Cmder ) error {
1001
- slot := c .cmdSlot (cmd )
1001
+ slot := c .cmdSlot (cmd , - 1 )
1002
1002
var node * clusterNode
1003
1003
var moved bool
1004
1004
var ask bool
@@ -1344,9 +1344,13 @@ func (c *ClusterClient) mapCmdsByNode(ctx context.Context, cmdsMap *cmdsMap, cmd
1344
1344
return err
1345
1345
}
1346
1346
1347
+ preferredRandomSlot := - 1
1347
1348
if c .opt .ReadOnly && c .cmdsAreReadOnly (ctx , cmds ) {
1348
1349
for _ , cmd := range cmds {
1349
- slot := c .cmdSlot (cmd )
1350
+ slot := c .cmdSlot (cmd , preferredRandomSlot )
1351
+ if preferredRandomSlot == - 1 {
1352
+ preferredRandomSlot = slot
1353
+ }
1350
1354
node , err := c .slotReadOnlyNode (state , slot )
1351
1355
if err != nil {
1352
1356
return err
@@ -1357,7 +1361,10 @@ func (c *ClusterClient) mapCmdsByNode(ctx context.Context, cmdsMap *cmdsMap, cmd
1357
1361
}
1358
1362
1359
1363
for _ , cmd := range cmds {
1360
- slot := c .cmdSlot (cmd )
1364
+ slot := c .cmdSlot (cmd , preferredRandomSlot )
1365
+ if preferredRandomSlot == - 1 {
1366
+ preferredRandomSlot = slot
1367
+ }
1361
1368
node , err := state .slotMasterNode (slot )
1362
1369
if err != nil {
1363
1370
return err
@@ -1594,8 +1601,12 @@ func (c *ClusterClient) processTxPipeline(ctx context.Context, cmds []Cmder) err
1594
1601
1595
1602
func (c * ClusterClient ) mapCmdsBySlot (cmds []Cmder ) map [int ][]Cmder {
1596
1603
cmdsMap := make (map [int ][]Cmder )
1604
+ preferredRandomSlot := - 1
1597
1605
for _ , cmd := range cmds {
1598
- slot := c .cmdSlot (cmd )
1606
+ slot := c .cmdSlot (cmd , preferredRandomSlot )
1607
+ if preferredRandomSlot == - 1 {
1608
+ preferredRandomSlot = slot
1609
+ }
1599
1610
cmdsMap [slot ] = append (cmdsMap [slot ], cmd )
1600
1611
}
1601
1612
return cmdsMap
@@ -1925,17 +1936,20 @@ func (c *ClusterClient) cmdInfo(ctx context.Context, name string) *CommandInfo {
1925
1936
return info
1926
1937
}
1927
1938
1928
- func (c * ClusterClient ) cmdSlot (cmd Cmder ) int {
1939
+ func (c * ClusterClient ) cmdSlot (cmd Cmder , preferredRandomSlot int ) int {
1929
1940
args := cmd .Args ()
1930
1941
if args [0 ] == "cluster" && (args [1 ] == "getkeysinslot" || args [1 ] == "countkeysinslot" ) {
1931
1942
return args [2 ].(int )
1932
1943
}
1933
1944
1934
- return cmdSlot (cmd , cmdFirstKeyPos (cmd ))
1945
+ return cmdSlot (cmd , cmdFirstKeyPos (cmd ), preferredRandomSlot )
1935
1946
}
1936
1947
1937
- func cmdSlot (cmd Cmder , pos int ) int {
1948
+ func cmdSlot (cmd Cmder , pos int , preferredRandomSlot int ) int {
1938
1949
if pos == 0 {
1950
+ if preferredRandomSlot != - 1 {
1951
+ return preferredRandomSlot
1952
+ }
1939
1953
return hashtag .RandomSlot ()
1940
1954
}
1941
1955
firstKey := cmd .stringArg (pos )
0 commit comments