feat: complete final jetstream parity transport and runtime baselines

This commit is contained in:
Joseph Doherty
2026-02-23 11:04:43 -05:00
parent 53585012f3
commit 8bce096f55
61 changed files with 2655 additions and 129 deletions

View File

@@ -1,5 +1,6 @@
using NATS.Server.JetStream.Storage;
using NATS.Server.JetStream.Models;
using NATS.Server.Subscriptions;
namespace NATS.Server.JetStream.Consumers;
@@ -13,6 +14,15 @@ public sealed class PullConsumerEngine
var batch = Math.Max(request.Batch, 1);
var messages = new List<StoredMessage>(batch);
if (consumer.NextSequence == 1)
{
var state = await stream.Store.GetStateAsync(ct);
if (consumer.Config.DeliverPolicy == DeliverPolicy.Last && state.LastSeq > 0)
consumer.NextSequence = state.LastSeq;
else if (consumer.Config.DeliverPolicy == DeliverPolicy.New && state.LastSeq > 0)
consumer.NextSequence = state.LastSeq + 1;
}
if (request.NoWait)
{
var available = await stream.Store.LoadAsync(consumer.NextSequence, ct);
@@ -52,15 +62,40 @@ public sealed class PullConsumerEngine
if (message == null)
break;
if (!MatchesFilter(consumer.Config, message.Subject))
{
sequence++;
i--;
continue;
}
if (consumer.Config.ReplayPolicy == ReplayPolicy.Original)
await Task.Delay(50, ct);
messages.Add(message);
if (consumer.Config.AckPolicy is AckPolicy.Explicit or AckPolicy.All)
{
if (consumer.Config.MaxAckPending > 0 && consumer.AckProcessor.PendingCount >= consumer.Config.MaxAckPending)
break;
consumer.AckProcessor.Register(message.Sequence, consumer.Config.AckWaitMs);
}
sequence++;
}
consumer.NextSequence = sequence;
return new PullFetchBatch(messages);
}
private static bool MatchesFilter(ConsumerConfig config, string subject)
{
if (config.FilterSubjects.Count > 0)
return config.FilterSubjects.Any(f => SubjectMatch.MatchLiteral(subject, f));
if (!string.IsNullOrWhiteSpace(config.FilterSubject))
return SubjectMatch.MatchLiteral(subject, config.FilterSubject);
return true;
}
}
public sealed class PullFetchBatch