test(batch26): port cross-module websocket-dependent tests
This commit is contained in:
@@ -330,6 +330,64 @@ public sealed partial class ConcurrencyTests2
|
||||
}, cfg);
|
||||
}
|
||||
|
||||
[Fact] // T:2488
|
||||
public void NoRaceJetStreamSnapshotsWithSlowAckDontSlowConsumer_ShouldSucceed()
|
||||
{
|
||||
var cfg = DefaultStreamConfig();
|
||||
cfg.Subjects = ["snap.>"];
|
||||
|
||||
WithStore((fs, _) =>
|
||||
{
|
||||
var errors = new ConcurrentQueue<Exception>();
|
||||
using var cts = new CancellationTokenSource();
|
||||
var payload = "snapshot"u8.ToArray();
|
||||
var ts = DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1_000_000_000L;
|
||||
var consumer = fs.ConsumerStore("snap-consumer", DateTime.UtcNow, new ConsumerConfig { AckPolicy = AckPolicy.AckExplicit });
|
||||
|
||||
var slowAcker = Task.Run(async () =>
|
||||
{
|
||||
for (ulong i = 1; i <= 100; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
consumer.UpdateDelivered(i, i, 1, ts + (long)i);
|
||||
await Task.Delay(2, cts.Token);
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
break;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
errors.Enqueue(ex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
for (var i = 0; i < 100; i++)
|
||||
fs.StoreMsg($"snap.{i % 5}", null, payload, 0);
|
||||
|
||||
var sw = Stopwatch.StartNew();
|
||||
var (snapshot, err) = fs.Snapshot(TimeSpan.FromSeconds(2), includeConsumers: true, checkMsgs: true);
|
||||
sw.Stop();
|
||||
|
||||
err.ShouldBeNull();
|
||||
snapshot.ShouldNotBeNull();
|
||||
snapshot!.State.Msgs.ShouldBeGreaterThan(0UL);
|
||||
sw.Elapsed.ShouldBeLessThan(TimeSpan.FromSeconds(2));
|
||||
|
||||
using (snapshot.Reader)
|
||||
{
|
||||
}
|
||||
|
||||
cts.Cancel();
|
||||
Should.NotThrow(() => slowAcker.Wait(TimeSpan.FromSeconds(1)));
|
||||
errors.ShouldBeEmpty();
|
||||
consumer.Stop();
|
||||
}, cfg);
|
||||
}
|
||||
|
||||
private static void WithStore(Action<JetStreamFileStore, string> action, StreamConfig? cfg = null)
|
||||
{
|
||||
var root = NewRoot();
|
||||
|
||||
Reference in New Issue
Block a user