Skip to content

Commit 0f66cd0

Browse files
committed
fix(cmdSlot): Add preferred random slot
1 parent 4320079 commit 0f66cd0

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

internal_test.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,15 +364,22 @@ var _ = Describe("ClusterClient", func() {
364364
It("select slot from args for GETKEYSINSLOT command", func() {
365365
cmd := NewStringSliceCmd(ctx, "cluster", "getkeysinslot", 100, 200)
366366

367-
slot := client.cmdSlot(cmd)
367+
slot := client.cmdSlot(cmd, -1)
368368
Expect(slot).To(Equal(100))
369369
})
370370

371371
It("select slot from args for COUNTKEYSINSLOT command", func() {
372372
cmd := NewStringSliceCmd(ctx, "cluster", "countkeysinslot", 100)
373373

374-
slot := client.cmdSlot(cmd)
374+
slot := client.cmdSlot(cmd, -1)
375375
Expect(slot).To(Equal(100))
376376
})
377+
378+
It("follows preferred random slot", func() {
379+
cmd := NewStatusCmd(ctx, "ping")
380+
381+
slot := client.cmdSlot(cmd, 101)
382+
Expect(slot).To(Equal(101))
383+
})
377384
})
378385
})

osscluster.go

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -998,7 +998,7 @@ func (c *ClusterClient) Process(ctx context.Context, cmd Cmder) error {
998998
}
999999

10001000
func (c *ClusterClient) process(ctx context.Context, cmd Cmder) error {
1001-
slot := c.cmdSlot(cmd)
1001+
slot := c.cmdSlot(cmd, -1)
10021002
var node *clusterNode
10031003
var moved bool
10041004
var ask bool
@@ -1344,9 +1344,13 @@ func (c *ClusterClient) mapCmdsByNode(ctx context.Context, cmdsMap *cmdsMap, cmd
13441344
return err
13451345
}
13461346

1347+
preferredRandomSlot := -1
13471348
if c.opt.ReadOnly && c.cmdsAreReadOnly(ctx, cmds) {
13481349
for _, cmd := range cmds {
1349-
slot := c.cmdSlot(cmd)
1350+
slot := c.cmdSlot(cmd, preferredRandomSlot)
1351+
if preferredRandomSlot == -1 {
1352+
preferredRandomSlot = slot
1353+
}
13501354
node, err := c.slotReadOnlyNode(state, slot)
13511355
if err != nil {
13521356
return err
@@ -1357,7 +1361,10 @@ func (c *ClusterClient) mapCmdsByNode(ctx context.Context, cmdsMap *cmdsMap, cmd
13571361
}
13581362

13591363
for _, cmd := range cmds {
1360-
slot := c.cmdSlot(cmd)
1364+
slot := c.cmdSlot(cmd, preferredRandomSlot)
1365+
if preferredRandomSlot == -1 {
1366+
preferredRandomSlot = slot
1367+
}
13611368
node, err := state.slotMasterNode(slot)
13621369
if err != nil {
13631370
return err
@@ -1594,8 +1601,12 @@ func (c *ClusterClient) processTxPipeline(ctx context.Context, cmds []Cmder) err
15941601

15951602
func (c *ClusterClient) mapCmdsBySlot(cmds []Cmder) map[int][]Cmder {
15961603
cmdsMap := make(map[int][]Cmder)
1604+
preferredRandomSlot := -1
15971605
for _, cmd := range cmds {
1598-
slot := c.cmdSlot(cmd)
1606+
slot := c.cmdSlot(cmd, preferredRandomSlot)
1607+
if preferredRandomSlot == -1 {
1608+
preferredRandomSlot = slot
1609+
}
15991610
cmdsMap[slot] = append(cmdsMap[slot], cmd)
16001611
}
16011612
return cmdsMap
@@ -1925,17 +1936,20 @@ func (c *ClusterClient) cmdInfo(ctx context.Context, name string) *CommandInfo {
19251936
return info
19261937
}
19271938

1928-
func (c *ClusterClient) cmdSlot(cmd Cmder) int {
1939+
func (c *ClusterClient) cmdSlot(cmd Cmder, preferredRandomSlot int) int {
19291940
args := cmd.Args()
19301941
if args[0] == "cluster" && (args[1] == "getkeysinslot" || args[1] == "countkeysinslot") {
19311942
return args[2].(int)
19321943
}
19331944

1934-
return cmdSlot(cmd, cmdFirstKeyPos(cmd))
1945+
return cmdSlot(cmd, cmdFirstKeyPos(cmd), preferredRandomSlot)
19351946
}
19361947

1937-
func cmdSlot(cmd Cmder, pos int) int {
1948+
func cmdSlot(cmd Cmder, pos int, preferredRandomSlot int) int {
19381949
if pos == 0 {
1950+
if preferredRandomSlot != -1 {
1951+
return preferredRandomSlot
1952+
}
19391953
return hashtag.RandomSlot()
19401954
}
19411955
firstKey := cmd.stringArg(pos)

0 commit comments

Comments
 (0)