Skip to content

Commit fc4b467

Browse files
committed
fix error in XADD arg-count calculation
fix #2940
1 parent 8fffdff commit fc4b467

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

src/StackExchange.Redis/RedisDatabase.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4598,13 +4598,12 @@ private Message GetStreamAddMessage(RedisKey key, RedisValue entryId, long? maxL
45984598
throw new ArgumentOutOfRangeException(nameof(maxLength), "maxLength must be greater than 0.");
45994599
}
46004600

4601-
var includeMaxLen = maxLength.HasValue ? 2 : 0;
4602-
var includeApproxLen = maxLength.HasValue && useApproximateMaxLength ? 1 : 0;
4603-
46044601
var totalLength = (streamPairs.Length * 2) // Room for the name/value pairs
4605-
+ 1 // The stream entry ID
4606-
+ includeMaxLen // 2 or 0 (MAXLEN keyword & the count)
4607-
+ includeApproxLen; // 1 or 0
4602+
+ 1 // The stream entry ID
4603+
+ (maxLength.HasValue ? 2 : 0) // MAXLEN N
4604+
+ (maxLength.HasValue && useApproximateMaxLength ? 1 : 0) // ~
4605+
+ (mode == StreamTrimMode.KeepReferences ? 0 : 1) // relevant trim-mode keyword
4606+
+ (limit.HasValue ? 2 : 0); // LIMIT N
46084607

46094608
var values = new RedisValue[totalLength];
46104609

tests/StackExchange.Redis.Tests/StreamTests.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2155,6 +2155,28 @@ public async Task AddWithApproxCount(StreamTrimMode mode)
21552155
db.StreamAdd(key, "field", "value", maxLength: 10, useApproximateMaxLength: true, trimMode: mode, flags: CommandFlags.None);
21562156
}
21572157

2158+
[Theory]
2159+
[InlineData(StreamTrimMode.KeepReferences, 1)]
2160+
[InlineData(StreamTrimMode.DeleteReferences, 1)]
2161+
[InlineData(StreamTrimMode.Acknowledged, 1)]
2162+
[InlineData(StreamTrimMode.KeepReferences, 2)]
2163+
[InlineData(StreamTrimMode.DeleteReferences, 2)]
2164+
[InlineData(StreamTrimMode.Acknowledged, 2)]
2165+
public async Task AddWithMultipleApproxCount(StreamTrimMode mode, int count)
2166+
{
2167+
await using var conn = Create(require: ForMode(mode));
2168+
2169+
var db = conn.GetDatabase();
2170+
var key = Me() + ":" + mode;
2171+
2172+
var pairs = new NameValueEntry[count];
2173+
for (var i = 0; i < count; i++)
2174+
{
2175+
pairs[i] = new NameValueEntry($"field{i}", $"value{i}");
2176+
}
2177+
db.StreamAdd(key, maxLength: 10, useApproximateMaxLength: true, trimMode: mode, flags: CommandFlags.None, streamPairs: pairs);
2178+
}
2179+
21582180
[Fact]
21592181
public async Task StreamReadGroupWithNoAckShowsNoPendingMessages()
21602182
{

0 commit comments

Comments
 (0)