fix(audit): robust central options binding + interval clamps + doc/contract fixes (review)
This commit is contained in:
@@ -31,18 +31,45 @@ public sealed class SiteAuditReconciliationOptions
|
||||
/// <summary>
|
||||
/// Test-only override for finer control over the tick cadence than
|
||||
/// whole-second resolution allows. When non-null, takes precedence over
|
||||
/// <see cref="ReconciliationIntervalSeconds"/>. Not bound from config —
|
||||
/// production config exposes <see cref="ReconciliationIntervalSeconds"/>
|
||||
/// only.
|
||||
/// <see cref="ReconciliationIntervalSeconds"/> AND bypasses the
|
||||
/// <see cref="ReconciliationInterval"/> minimum clamp (so tests can use
|
||||
/// millisecond cadences). Production config exposes
|
||||
/// <see cref="ReconciliationIntervalSeconds"/> only and never sets this
|
||||
/// knob — but because the options class is <c>Bind</c>-ed wholesale, a
|
||||
/// config value at <c>AuditLog:Reconciliation:ReconciliationIntervalOverride</c>
|
||||
/// WOULD bind if present; operators must not set it.
|
||||
/// </summary>
|
||||
public TimeSpan? ReconciliationIntervalOverride { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Resolves the effective tick interval, honouring the test override when
|
||||
/// set. Falls back to <see cref="ReconciliationIntervalSeconds"/>.
|
||||
/// Minimum interval the config-bound <see cref="ReconciliationIntervalSeconds"/>
|
||||
/// can resolve to. Clamps a misconfigured <c>ReconciliationIntervalSeconds: 0</c>
|
||||
/// (or a negative value) away from <see cref="TimeSpan.Zero"/>, which would make
|
||||
/// Akka's <c>ScheduleTellRepeatedlyCancelable</c> spin. The test-only
|
||||
/// <see cref="ReconciliationIntervalOverride"/> bypasses this clamp so unit tests
|
||||
/// can still drop the cadence to milliseconds.
|
||||
/// </summary>
|
||||
public TimeSpan ReconciliationInterval =>
|
||||
ReconciliationIntervalOverride ?? TimeSpan.FromSeconds(ReconciliationIntervalSeconds);
|
||||
private static readonly TimeSpan MinConfiguredInterval = TimeSpan.FromSeconds(1);
|
||||
|
||||
/// <summary>
|
||||
/// Resolves the effective tick interval, honouring the test override when
|
||||
/// set. Falls back to <see cref="ReconciliationIntervalSeconds"/>, clamped to at
|
||||
/// least <see cref="MinConfiguredInterval"/> so a zero/negative config value can
|
||||
/// never yield <see cref="TimeSpan.Zero"/> (which would spin the scheduler).
|
||||
/// </summary>
|
||||
public TimeSpan ReconciliationInterval
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ReconciliationIntervalOverride is { } overrideValue)
|
||||
{
|
||||
return overrideValue;
|
||||
}
|
||||
|
||||
var resolved = TimeSpan.FromSeconds(ReconciliationIntervalSeconds);
|
||||
return resolved < MinConfiguredInterval ? MinConfiguredInterval : resolved;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Maximum number of <see cref="ZB.MOM.WW.ScadaBridge.Commons.Entities.Audit.AuditEvent"/>
|
||||
|
||||
Reference in New Issue
Block a user