Skip to content

Commit 0bc0688

Browse files
authored
Merge branch 'master' into feat/vector-set
2 parents 6252cc8 + d7ba255 commit 0bc0688

File tree

4 files changed

+51
-7
lines changed

4 files changed

+51
-7
lines changed

command.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2104,7 +2104,9 @@ type XInfoGroup struct {
21042104
Pending int64
21052105
LastDeliveredID string
21062106
EntriesRead int64
2107-
Lag int64
2107+
// Lag represents the number of pending messages in the stream not yet
2108+
// delivered to this consumer group. Returns -1 when the lag cannot be determined.
2109+
Lag int64
21082110
}
21092111

21102112
var _ Cmder = (*XInfoGroupsCmd)(nil)
@@ -2187,8 +2189,11 @@ func (cmd *XInfoGroupsCmd) readReply(rd *proto.Reader) error {
21872189

21882190
// lag: the number of entries in the stream that are still waiting to be delivered
21892191
// to the group's consumers, or a NULL(Nil) when that number can't be determined.
2192+
// In that case, we return -1.
21902193
if err != nil && err != Nil {
21912194
return err
2195+
} else if err == Nil {
2196+
group.Lag = -1
21922197
}
21932198
default:
21942199
return fmt.Errorf("redis: unexpected key %q in XINFO GROUPS reply", key)

commands_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6772,6 +6772,36 @@ var _ = Describe("Commands", func() {
67726772
}))
67736773
})
67746774

6775+
It("should return -1 for nil lag in XINFO GROUPS", func() {
6776+
_, err := client.XAdd(ctx, &redis.XAddArgs{Stream: "s", ID: "0-1", Values: []string{"foo", "1"}}).Result()
6777+
Expect(err).NotTo(HaveOccurred())
6778+
6779+
client.XAdd(ctx, &redis.XAddArgs{Stream: "s", ID: "0-2", Values: []string{"foo", "2"}})
6780+
Expect(err).NotTo(HaveOccurred())
6781+
client.XAdd(ctx, &redis.XAddArgs{Stream: "s", ID: "0-3", Values: []string{"foo", "3"}})
6782+
Expect(err).NotTo(HaveOccurred())
6783+
6784+
err = client.XGroupCreate(ctx, "s", "g", "0").Err()
6785+
Expect(err).NotTo(HaveOccurred())
6786+
err = client.XReadGroup(ctx, &redis.XReadGroupArgs{Group: "g", Consumer: "c", Streams: []string{"s", ">"}, Count: 1, Block: -1, NoAck: false}).Err()
6787+
Expect(err).NotTo(HaveOccurred())
6788+
6789+
client.XDel(ctx, "s", "0-2")
6790+
6791+
res, err := client.XInfoGroups(ctx, "s").Result()
6792+
Expect(err).NotTo(HaveOccurred())
6793+
Expect(res).To(Equal([]redis.XInfoGroup{
6794+
{
6795+
Name: "g",
6796+
Consumers: 1,
6797+
Pending: 1,
6798+
LastDeliveredID: "0-1",
6799+
EntriesRead: 1,
6800+
Lag: -1, // nil lag from Redis is reported as -1
6801+
},
6802+
}))
6803+
})
6804+
67756805
It("should XINFO CONSUMERS", func() {
67766806
res, err := client.XInfoConsumers(ctx, "stream", "group1").Result()
67776807
Expect(err).NotTo(HaveOccurred())

osscluster.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,14 @@ func (n *clusterNode) SetLastLatencyMeasurement(t time.Time) {
445445
}
446446
}
447447

448+
func (n *clusterNode) Loading() bool {
449+
ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond)
450+
defer cancel()
451+
452+
err := n.Client.Ping(ctx).Err()
453+
return err != nil && isLoadingError(err)
454+
}
455+
448456
//------------------------------------------------------------------------------
449457

450458
type clusterNodes struct {
@@ -754,7 +762,8 @@ func (c *clusterState) slotSlaveNode(slot int) (*clusterNode, error) {
754762
case 1:
755763
return nodes[0], nil
756764
case 2:
757-
if slave := nodes[1]; !slave.Failing() {
765+
slave := nodes[1]
766+
if !slave.Failing() && !slave.Loading() {
758767
return slave, nil
759768
}
760769
return nodes[0], nil
@@ -763,7 +772,7 @@ func (c *clusterState) slotSlaveNode(slot int) (*clusterNode, error) {
763772
for i := 0; i < 10; i++ {
764773
n := rand.Intn(len(nodes)-1) + 1
765774
slave = nodes[n]
766-
if !slave.Failing() {
775+
if !slave.Failing() && !slave.Loading() {
767776
return slave, nil
768777
}
769778
}
@@ -1498,7 +1507,7 @@ func (c *ClusterClient) processTxPipeline(ctx context.Context, cmds []Cmder) err
14981507
return err
14991508
}
15001509

1501-
cmdsMap := c.mapCmdsBySlot(ctx, cmds)
1510+
cmdsMap := c.mapCmdsBySlot(cmds)
15021511
for slot, cmds := range cmdsMap {
15031512
node, err := state.slotMasterNode(slot)
15041513
if err != nil {
@@ -1537,7 +1546,7 @@ func (c *ClusterClient) processTxPipeline(ctx context.Context, cmds []Cmder) err
15371546
return cmdsFirstErr(cmds)
15381547
}
15391548

1540-
func (c *ClusterClient) mapCmdsBySlot(ctx context.Context, cmds []Cmder) map[int][]Cmder {
1549+
func (c *ClusterClient) mapCmdsBySlot(cmds []Cmder) map[int][]Cmder {
15411550
cmdsMap := make(map[int][]Cmder)
15421551
for _, cmd := range cmds {
15431552
slot := c.cmdSlot(cmd)

ring.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,7 @@ func (c *Ring) cmdsInfo(ctx context.Context) (map[string]*CommandInfo, error) {
702702
return nil, firstErr
703703
}
704704

705-
func (c *Ring) cmdShard(ctx context.Context, cmd Cmder) (*ringShard, error) {
705+
func (c *Ring) cmdShard(cmd Cmder) (*ringShard, error) {
706706
pos := cmdFirstKeyPos(cmd)
707707
if pos == 0 {
708708
return c.sharding.Random()
@@ -720,7 +720,7 @@ func (c *Ring) process(ctx context.Context, cmd Cmder) error {
720720
}
721721
}
722722

723-
shard, err := c.cmdShard(ctx, cmd)
723+
shard, err := c.cmdShard(cmd)
724724
if err != nil {
725725
return err
726726
}

0 commit comments

Comments
 (0)