feat(batch28): merge jetstream-api

This commit is contained in:
Joseph Doherty
2026-02-28 22:41:44 -05:00
8 changed files with 1974 additions and 6 deletions

View File

@@ -178,6 +178,72 @@ public sealed partial class Account
}
}
internal void TrackAPI()
{
_mu.EnterReadLock();
var jsa = JetStream;
_mu.ExitReadLock();
if (jsa is null)
return;
jsa.UsageLock.EnterWriteLock();
try
{
jsa.UsageApi++;
jsa.ApiTotal++;
jsa.SendClusterUsageUpdate();
if (jsa.Js is JetStream js)
Interlocked.Add(ref js.ApiTotal, 1);
}
finally
{
jsa.UsageLock.ExitWriteLock();
}
}
internal void TrackAPIErr()
{
_mu.EnterReadLock();
var jsa = JetStream;
_mu.ExitReadLock();
if (jsa is null)
return;
jsa.UsageLock.EnterWriteLock();
try
{
jsa.UsageApi++;
jsa.ApiTotal++;
jsa.UsageErr++;
jsa.ApiErrors++;
jsa.SendClusterUsageUpdate();
if (jsa.Js is JetStream js)
{
Interlocked.Add(ref js.ApiTotal, 1);
Interlocked.Add(ref js.ApiErrors, 1);
}
}
finally
{
jsa.UsageLock.ExitWriteLock();
}
}
internal (bool Enabled, bool ShouldError) CheckJetStream()
{
_mu.EnterReadLock();
try
{
return (JetStream is not null, _nleafs + _nrleafs == 0);
}
finally
{
_mu.ExitReadLock();
}
}
internal (bool MaxBytesRequired, long MaxStreamBytes) MaxBytesLimits(StreamConfig? cfg)
{
_mu.EnterReadLock();
@@ -530,4 +596,22 @@ public sealed partial class Account
return EnableAllJetStreamServiceImportsAndMappings();
}
internal Exception? JsNonClusteredStreamLimitsCheck(StreamConfig config)
{
var (server, jsa, err) = CheckForJetStream();
if (err is not null || server is null || jsa is null)
return err ?? new InvalidOperationException("jetstream not enabled for account");
var selected = jsa.SelectLimits(config.Replicas);
if (!selected.Found)
return new InvalidOperationException(JsApiErrors.NewJSNoLimitsError().Description ?? "jetstream limits not configured");
var reservation = jsa.TieredReservation(selected.Tier, config);
var js = server.GetJetStream();
if (js is null)
return new InvalidOperationException("jetstream not enabled");
return js.CheckAccountLimits(selected.Limits, config, reservation);
}
}