perf(historian): bounded-parallel per-tag drain (DrainConcurrency, default 8)
This commit is contained in:
@@ -57,6 +57,21 @@ public sealed class ContinuousHistorizationOptions
|
||||
/// <summary>Steady drain cadence in seconds (also the post-success reschedule). Defaults to 2.</summary>
|
||||
public double DrainIntervalSeconds { get; init; } = 2;
|
||||
|
||||
/// <summary>
|
||||
/// Maximum historian tags a single drain pass writes concurrently. Defaults to 8; clamped to at
|
||||
/// least 1 by the recorder (1 restores the fully sequential drain).
|
||||
/// <para>
|
||||
/// One peeked batch is grouped per historian tag and each group is an independent gateway
|
||||
/// round-trip, so a sequential pass costs <c>tags × latency</c> — with a wide batch that is the
|
||||
/// dominant term in how fast the outbox can drain. The window bounds how many of those
|
||||
/// round-trips are outstanding at once, so a large tag count cannot flood the gateway. Nothing
|
||||
/// about the ack changes: the pass is still acked all-or-nothing after every group has
|
||||
/// reported, and the Gitea #538 per-tag quarantine still keys on "another group wrote this
|
||||
/// pass".
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public int DrainConcurrency { get; init; } = 8;
|
||||
|
||||
/// <summary>
|
||||
/// Maximum un-acked outbox entries before the drop-oldest capacity policy kicks in; <c>0</c>
|
||||
/// means unbounded.
|
||||
@@ -102,6 +117,8 @@ public sealed class ContinuousHistorizationOptions
|
||||
warnings.Add("ContinuousHistorization:OutboxPath is empty while historization is enabled — the durable outbox has no directory to persist to; host startup will fail when the outbox is constructed. Set an absolute path on durable storage.");
|
||||
if (string.Equals(CommitMode, "Periodic", StringComparison.OrdinalIgnoreCase) && CommitIntervalMs <= 0)
|
||||
warnings.Add($"ContinuousHistorization:CommitIntervalMs is {CommitIntervalMs} — must be > 0 in Periodic commit mode; the periodic-commit loop cannot run.");
|
||||
if (DrainConcurrency < 1)
|
||||
warnings.Add($"ContinuousHistorization:DrainConcurrency is {DrainConcurrency} — must be >= 1; the recorder clamps it to 1 (a fully sequential drain).");
|
||||
return warnings;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user