feat: implement strict retention runtime parity for jetstream
This commit is contained in:
@@ -14,6 +14,7 @@ namespace NATS.Server.JetStream;
|
||||
public sealed class StreamManager
|
||||
{
|
||||
private readonly Account? _account;
|
||||
private readonly ConsumerManager? _consumerManager;
|
||||
private readonly JetStreamMetaGroup? _metaGroup;
|
||||
private readonly ConcurrentDictionary<string, StreamHandle> _streams =
|
||||
new(StringComparer.Ordinal);
|
||||
@@ -25,10 +26,11 @@ public sealed class StreamManager
|
||||
new(StringComparer.Ordinal);
|
||||
private readonly StreamSnapshotService _snapshotService = new();
|
||||
|
||||
public StreamManager(JetStreamMetaGroup? metaGroup = null, Account? account = null)
|
||||
public StreamManager(JetStreamMetaGroup? metaGroup = null, Account? account = null, ConsumerManager? consumerManager = null)
|
||||
{
|
||||
_metaGroup = metaGroup;
|
||||
_account = account;
|
||||
_consumerManager = consumerManager;
|
||||
}
|
||||
|
||||
public IReadOnlyCollection<string> StreamNames => _streams.Keys.ToArray();
|
||||
@@ -261,7 +263,7 @@ public sealed class StreamManager
|
||||
};
|
||||
}
|
||||
|
||||
private static void EnforceRuntimePolicies(StreamHandle stream, DateTime nowUtc)
|
||||
private void EnforceRuntimePolicies(StreamHandle stream, DateTime nowUtc)
|
||||
{
|
||||
switch (stream.Config.Retention)
|
||||
{
|
||||
@@ -284,11 +286,23 @@ public sealed class StreamManager
|
||||
PruneExpiredMessages(stream, nowUtc);
|
||||
}
|
||||
|
||||
private static void ApplyWorkQueueRetention(StreamHandle stream, DateTime nowUtc)
|
||||
private void ApplyWorkQueueRetention(StreamHandle stream, DateTime nowUtc)
|
||||
{
|
||||
// WorkQueue keeps one-consumer processing semantics; current parity baseline
|
||||
// applies the same bounded retention guards used by limits retention.
|
||||
ApplyLimitsRetention(stream, nowUtc);
|
||||
|
||||
if (_consumerManager == null)
|
||||
return;
|
||||
|
||||
var ackFloor = _consumerManager.GetAckFloor(stream.Config.Name);
|
||||
if (ackFloor == 0)
|
||||
return;
|
||||
|
||||
var messages = stream.Store.ListAsync(default).GetAwaiter().GetResult();
|
||||
foreach (var message in messages)
|
||||
{
|
||||
if (message.Sequence <= ackFloor)
|
||||
stream.Store.RemoveAsync(message.Sequence, default).GetAwaiter().GetResult();
|
||||
}
|
||||
}
|
||||
|
||||
private static void ApplyInterestRetention(StreamHandle stream, DateTime nowUtc)
|
||||
|
||||
Reference in New Issue
Block a user