feat: complete remaining jetstream parity implementation plan

This commit is contained in:
Joseph Doherty
2026-02-23 10:16:16 -05:00
parent c7bbf45c8f
commit f46b331921
59 changed files with 1734 additions and 54 deletions

View File

@@ -21,4 +21,11 @@ public sealed class AckProcessor
}
public bool HasPending => _pending.Count > 0;
public int PendingCount => _pending.Count;
public void AckAll(ulong sequence)
{
foreach (var key in _pending.Keys.Where(k => k <= sequence).ToArray())
_pending.Remove(key);
}
}

View File

@@ -6,9 +6,20 @@ namespace NATS.Server.JetStream.Consumers;
public sealed class PullConsumerEngine
{
public async ValueTask<PullFetchBatch> FetchAsync(StreamHandle stream, ConsumerHandle consumer, int batch, CancellationToken ct)
=> await FetchAsync(stream, consumer, new PullFetchRequest { Batch = batch }, ct);
public async ValueTask<PullFetchBatch> FetchAsync(StreamHandle stream, ConsumerHandle consumer, PullFetchRequest request, CancellationToken ct)
{
var batch = Math.Max(request.Batch, 1);
var messages = new List<StoredMessage>(batch);
if (request.NoWait)
{
var available = await stream.Store.LoadAsync(consumer.NextSequence, ct);
if (available == null)
return new PullFetchBatch([], timedOut: false);
}
if (consumer.Config.AckPolicy == AckPolicy.Explicit)
{
var expired = consumer.AckProcessor.NextExpired();
@@ -42,7 +53,7 @@ public sealed class PullConsumerEngine
break;
messages.Add(message);
if (consumer.Config.AckPolicy == AckPolicy.Explicit)
if (consumer.Config.AckPolicy is AckPolicy.Explicit or AckPolicy.All)
consumer.AckProcessor.Register(message.Sequence, consumer.Config.AckWaitMs);
sequence++;
}
@@ -55,9 +66,18 @@ public sealed class PullConsumerEngine
public sealed class PullFetchBatch
{
public IReadOnlyList<StoredMessage> Messages { get; }
public bool TimedOut { get; }
public PullFetchBatch(IReadOnlyList<StoredMessage> messages)
public PullFetchBatch(IReadOnlyList<StoredMessage> messages, bool timedOut = false)
{
Messages = messages;
TimedOut = timedOut;
}
}
public sealed class PullFetchRequest
{
public int Batch { get; init; } = 1;
public bool NoWait { get; init; }
public int ExpiresMs { get; init; }
}

View File

@@ -13,7 +13,7 @@ public sealed class PushConsumerEngine
Message = message,
});
if (consumer.Config.AckPolicy == AckPolicy.Explicit)
if (consumer.Config.AckPolicy is AckPolicy.Explicit or AckPolicy.All)
consumer.AckProcessor.Register(message.Sequence, consumer.Config.AckWaitMs);
if (consumer.Config.HeartbeatMs > 0)