568735a41e
Task 13. SiteEventLogger's XML doc said 'Not replicated to standby. On failover, the new active node starts a fresh log.' That is now false and was the exact behaviour Phase 1 set out to fix. OperationTrackingOptions.ConnectionString and SiteEventLogOptions.DatabasePath marked MIGRATION-ONLY: nothing reads them but SiteLocalDbLegacyMigrator, and they are safe to delete from a config once a node has migrated. ScadaBridge CLAUDE.md gains a consolidated-site-database entry covering the GUID/opaque-token contract change, the migration-only keys, the incidental CWD-outside-the-volume data-loss fix, the fail-closed default-OFF replication posture, and the fact that ZbTelemetryOptions.Meters is a silent allowlist. scadaproj CLAUDE.md's LocalDb row goes from 'no app adoption yet' to the honest current state, per the component-status-honesty convention: ScadaBridge Phase 1 only, on an UNMERGED branch, replication live-proven on the rig's site-a pair ONLY, default-OFF everywhere else, Phase 2 not started, no other app adopted, no production deployment replicating. Claude-Session: https://claude.ai/code/session_01BL2Vu1ESDQ9SCN4gVKkdts
38 lines
2.0 KiB
C#
38 lines
2.0 KiB
C#
namespace ZB.MOM.WW.ScadaBridge.SiteEventLogging;
|
|
|
|
public class SiteEventLogOptions
|
|
{
|
|
/// <summary>Number of days to retain site event log entries before purge; default 30.</summary>
|
|
public int RetentionDays { get; set; } = 30;
|
|
/// <summary>Maximum SQLite database size in megabytes before old entries are purged; default 1024 MB.</summary>
|
|
public int MaxStorageMb { get; set; } = 1024;
|
|
/// <summary>
|
|
/// MIGRATION-ONLY as of LocalDb Phase 1. <see cref="SiteEventLogger"/> no longer reads
|
|
/// this: <c>site_events</c> lives in the consolidated site database at
|
|
/// <c>LocalDb:Path</c>. The only remaining consumer is
|
|
/// <c>SiteLocalDbLegacyMigrator</c>, which uses it to locate a pre-Phase-1
|
|
/// <c>site_events.db</c> and copy it in once. Safe to delete from a config once that
|
|
/// node's migration has run.
|
|
/// </summary>
|
|
public string DatabasePath { get; set; } = "site_events.db";
|
|
/// <summary>Maximum number of rows returned per paginated query; default 500.</summary>
|
|
public int QueryPageSize { get; set; } = 500;
|
|
/// <summary>
|
|
/// Hard upper bound on a caller-supplied <c>PageSize</c>. A
|
|
/// misbehaving or hostile central client that requests <c>int.MaxValue</c> would
|
|
/// otherwise force the query to materialise the entire log into a single list while
|
|
/// holding the shared write lock. Silent clamp; default 500 matches
|
|
/// <see cref="QueryPageSize"/>.
|
|
/// </summary>
|
|
public int MaxQueryPageSize { get; set; } = 500;
|
|
/// <summary>Interval between purge runs; default 24 hours.</summary>
|
|
public TimeSpan PurgeInterval { get; set; } = TimeSpan.FromHours(24);
|
|
/// <summary>
|
|
/// Bound on the background write queue. Default 10 000 events.
|
|
/// Overflow uses <c>BoundedChannelFullMode.DropOldest</c> — callers never block; the
|
|
/// dropped event's <c>Task</c> is faulted and <c>FailedWriteCount</c> is incremented
|
|
/// so the drop is observable.
|
|
/// </summary>
|
|
public int WriteQueueCapacity { get; set; } = 10_000;
|
|
}
|