feat: execute post-baseline jetstream parity plan
This commit is contained in:
@@ -2,22 +2,50 @@ namespace NATS.Server.JetStream.Consumers;
|
||||
|
||||
public sealed class AckProcessor
|
||||
{
|
||||
private readonly Dictionary<ulong, DateTime> _pending = new();
|
||||
private readonly Dictionary<ulong, PendingState> _pending = new();
|
||||
|
||||
public void Register(ulong sequence, int ackWaitMs)
|
||||
{
|
||||
_pending[sequence] = DateTime.UtcNow.AddMilliseconds(Math.Max(ackWaitMs, 1));
|
||||
if (_pending.ContainsKey(sequence))
|
||||
return;
|
||||
|
||||
_pending[sequence] = new PendingState
|
||||
{
|
||||
DeadlineUtc = DateTime.UtcNow.AddMilliseconds(Math.Max(ackWaitMs, 1)),
|
||||
Deliveries = 1,
|
||||
};
|
||||
}
|
||||
|
||||
public ulong? NextExpired()
|
||||
public bool TryGetExpired(out ulong sequence, out int deliveries)
|
||||
{
|
||||
foreach (var (seq, deadline) in _pending)
|
||||
foreach (var (seq, state) in _pending)
|
||||
{
|
||||
if (DateTime.UtcNow >= deadline)
|
||||
return seq;
|
||||
if (DateTime.UtcNow >= state.DeadlineUtc)
|
||||
{
|
||||
sequence = seq;
|
||||
deliveries = state.Deliveries;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
sequence = 0;
|
||||
deliveries = 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
public void ScheduleRedelivery(ulong sequence, int delayMs)
|
||||
{
|
||||
if (!_pending.TryGetValue(sequence, out var state))
|
||||
return;
|
||||
|
||||
state.Deliveries++;
|
||||
state.DeadlineUtc = DateTime.UtcNow.AddMilliseconds(Math.Max(delayMs, 1));
|
||||
_pending[sequence] = state;
|
||||
}
|
||||
|
||||
public void Drop(ulong sequence)
|
||||
{
|
||||
_pending.Remove(sequence);
|
||||
}
|
||||
|
||||
public bool HasPending => _pending.Count > 0;
|
||||
@@ -28,4 +56,10 @@ public sealed class AckProcessor
|
||||
foreach (var key in _pending.Keys.Where(k => k <= sequence).ToArray())
|
||||
_pending.Remove(key);
|
||||
}
|
||||
|
||||
private sealed class PendingState
|
||||
{
|
||||
public DateTime DeadlineUtc { get; set; }
|
||||
public int Deliveries { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user