Skip to content

Commit b67455e

Browse files
authored
xinfo-groups: support nil lag in XINFO GROUPS (#3369)
* xinfo-groups: support nil lag in XINFO GROUPS * Add test * docs: clarify XInfoGroup.Lag field behavior with Nil values * docs: clarify XInfoGroup.Lag field behavior
1 parent 03c2c0b commit b67455e

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
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())

0 commit comments

Comments
 (0)