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

@@ -4,6 +4,7 @@ using NATS.Server.JetStream.Cluster;
using NATS.Server.JetStream.Consumers;
using NATS.Server.JetStream.Models;
using NATS.Server.JetStream.Storage;
using NATS.Server.Subscriptions;
namespace NATS.Server.JetStream;
@@ -24,7 +25,15 @@ public sealed class ConsumerManager
public JetStreamApiResponse CreateOrUpdate(string stream, ConsumerConfig config)
{
if (string.IsNullOrWhiteSpace(config.DurableName))
return JetStreamApiResponse.ErrorResponse(400, "durable name required");
{
if (config.Ephemeral)
config.DurableName = $"ephemeral-{Guid.NewGuid():N}"[..24];
else
return JetStreamApiResponse.ErrorResponse(400, "durable name required");
}
if (config.FilterSubjects.Count == 0 && !string.IsNullOrWhiteSpace(config.FilterSubject))
config.FilterSubjects.Add(config.FilterSubject);
var key = (stream, config.DurableName);
var handle = _consumers.AddOrUpdate(key,
@@ -129,7 +138,15 @@ public sealed class ConsumerManager
public void OnPublished(string stream, StoredMessage message)
{
foreach (var handle in _consumers.Values.Where(c => c.Stream == stream && c.Config.Push))
{
if (!MatchesFilter(handle.Config, message.Subject))
continue;
if (handle.Config.MaxAckPending > 0 && handle.AckProcessor.PendingCount >= handle.Config.MaxAckPending)
continue;
_pushConsumerEngine.Enqueue(handle, message);
}
}
public PushFrame? ReadPushFrame(string stream, string durableName)
@@ -142,6 +159,17 @@ public sealed class ConsumerManager
return consumer.PushFrames.Dequeue();
}
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 record ConsumerHandle(string Stream, ConsumerConfig Config)