feat(batch2): verify memstore remainder features

This commit is contained in:
Joseph Doherty
2026-02-28 07:17:01 -05:00
parent 1a0ac59df8
commit c2a73b49f7
6 changed files with 147 additions and 17 deletions

View File

@@ -103,6 +103,23 @@ public sealed class JetStreamMemStore : IStreamStore
_scheduling = new MsgScheduling(RunMsgScheduling);
}
/// <summary>
/// Factory that mirrors Go <c>newMemStore</c> mapping semantics.
/// </summary>
public static JetStreamMemStore NewMemStore(StreamConfig cfg)
{
var ms = new JetStreamMemStore(cfg);
if (cfg.FirstSeq > 0)
{
var (_, err) = ms.PurgeInternal(cfg.FirstSeq);
if (err != null)
throw err;
}
return ms;
}
// -----------------------------------------------------------------------
// IStreamStore — store / load
// -----------------------------------------------------------------------
@@ -1133,17 +1150,7 @@ public sealed class JetStreamMemStore : IStreamStore
_mu.EnterReadLock();
try
{
if (_msgs == null || _msgs.Count == 0) return (Array.Empty<ulong>(), null);
var seqs = new List<ulong>(_fss.Size());
_fss.IterFast((subj, ss) =>
{
if (ss.LastNeedsUpdate)
RecalculateForSubj(Encoding.UTF8.GetString(subj), ss);
seqs.Add(ss.Last);
return true;
});
seqs.Sort();
return (seqs.ToArray(), null);
return AllLastSeqsLocked();
}
finally
{
@@ -1151,6 +1158,27 @@ public sealed class JetStreamMemStore : IStreamStore
}
}
/// <summary>
/// Returns sorted per-subject last sequences without taking locks.
/// Mirrors Go <c>allLastSeqsLocked</c>.
/// </summary>
private (ulong[] Seqs, Exception? Error) AllLastSeqsLocked()
{
if (_msgs == null || _msgs.Count == 0) return (Array.Empty<ulong>(), null);
var seqs = new List<ulong>(_fss.Size());
_fss.IterFast((subj, ss) =>
{
if (ss.LastNeedsUpdate)
RecalculateForSubj(Encoding.UTF8.GetString(subj), ss);
seqs.Add(ss.Last);
return true;
});
seqs.Sort();
return (seqs.ToArray(), null);
}
/// <inheritdoc/>
public (ulong[] Seqs, Exception? Error) MultiLastSeqs(string[] filters, ulong maxSeq, int maxAllowed)
{