There was an error while loading. Please reload this page.
1 parent b2ae5f9 commit d7ab0b5Copy full SHA for d7ab0b5
2 files changed
src/server/stream_family_test.cc
@@ -299,6 +299,18 @@ TEST_F(StreamFamilyTest, XReadGroup) {
299
EXPECT_THAT(resp, ArgType(RespExpr::NIL_ARRAY));
300
}
301
302
+TEST_F(StreamFamilyTest, XReadGroupConsumerNamedStreams) {
303
+ Run({"XADD", "COUNT", "1-0", "field", "value"});
304
+ Run({"XGROUP", "CREATE", "COUNT", "grp1", "0"});
305
+ Run({"XADD", "2", "1-0", "field", "value"});
306
+ Run({"XGROUP", "CREATE", "2", "grp1", "0"});
307
+ Run({"XADD", "xp1", "1-0", "field", "value"});
308
+ Run({"XGROUP", "CREATE", "xp1", "grp1", "0"});
309
+
310
+ auto resp = Run({"XREADGROUP", "GROUP", "grp1", "STREAMS", "COUNT", "2", "STREAMS", "xp1", ">"});
311
+ EXPECT_THAT(resp, RespElementsAre(RespArray(ElementsAre("xp1", ArrLen(1)))));
312
+}
313
314
TEST_F(StreamFamilyTest, XReadBlock) {
315
Run({"xadd", "foo", "1-*", "k1", "v1"});
316
Run({"xadd", "foo", "1-*", "k2", "v2"});
src/server/transaction.cc
@@ -1652,14 +1652,46 @@ OpResult<KeyIndex> DetermineKeys(const CommandId* cid, const facade::ParsedArgs&
1652
1653
string_view name{cid->name()};
1654
1655
- // Determine based on STREAMS argument position
+ // Determine based on the STREAMS option position.
1656
if (name == "XREAD" || name == "XREADGROUP") {
1657
- for (size_t i = 0; i < args.size(); ++i) {
+ size_t i = 0;
1658
+ if (name == "XREADGROUP") {
1659
+ i = 3; // GROUP <group> <consumer>
1660
+ }
1661
1662
+ while (i < args.size()) {
1663
string_view arg = args[i];
1664
if (absl::EqualsIgnoreCase(arg, "STREAMS")) {
1665
size_t left = args.size() - i - 1;
1666
return KeyIndex(i + 1, i + 1 + (left / 2));
1667
1668
1669
+ if (absl::EqualsIgnoreCase(arg, "COUNT")) {
1670
+ if (i + 1 >= args.size())
1671
+ return OpStatus::SYNTAX_ERR;
1672
+ uint32_t count;
1673
+ if (!absl::SimpleAtoi(args[i + 1], &count))
1674
+ return OpStatus::INVALID_INT;
1675
+ i += 2;
1676
+ continue;
1677
1678
1679
+ if (absl::EqualsIgnoreCase(arg, "BLOCK")) {
1680
1681
1682
+ int64_t timeout;
1683
+ if (!absl::SimpleAtoi(args[i + 1], &timeout))
1684
1685
1686
1687
1688
1689
+ if (name == "XREADGROUP" && absl::EqualsIgnoreCase(arg, "NOACK")) {
1690
+ ++i;
1691
1692
1693
1694
+ break;
1695
1696
return OpStatus::SYNTAX_ERR;
1697
0 commit comments