docs+code: close Theme 1 — 24 design-doc / XML-doc drift findings
Doc/XML-comment drift + small adherence fixes across 17 modules. Highlights: - Host-017: site CoordinatedShutdown ordering — SiteStreamGrpcServer gains CancelAllStreams() (refuse new streams, cancel active), wired into Program.cs site branch via ApplicationStopping. - InboundAPI-021: ParentExecutionId now travels on RouteToGet/SetAttributes symmetric with RouteToCallRequest; RouteHelper stamps from _parentExecutionId. - ClusterInfra-012: ClusterOptionsValidator now requires both seed nodes. - Comm-018: SiteCommunicationActor.HeartbeatMessage.IsActive derived from cluster leader check (was hardcoded true). - DM-020: reconciliation audit row attributes the current user, not prior deployer. - SEL-019: EventLogPurgeService early-exits on standby via active-node check. - Plus comment/XML-doc accuracy fixes across AuditLog, ConfigurationDatabase, NotificationOutbox, SiteRuntime, SiteCallAudit; doc refreshes for Component- Commons / -ManagementService / -CLI / -ExternalSystemGateway / -HealthMonitoring / -Transport / -ConfigurationDatabase; CD-023 index-name doc alignment. 11 new regression tests (RouteHelper x4, SiteStreamGrpcServer x2, ClusterOptionsValidator x1, SiteCommunicationActor x1, DeploymentService x1, EventLogPurgeService x3). Build clean (0 warnings); InboundAPI/Communication/ Host suites all green. README regenerated: 112 open (was 136).
This commit is contained in:
@@ -29,13 +29,16 @@ public class EventLogPurgeServiceTests : IDisposable
|
||||
if (File.Exists(_dbPath)) File.Delete(_dbPath);
|
||||
}
|
||||
|
||||
private EventLogPurgeService CreatePurgeService(SiteEventLogOptions? optionsOverride = null)
|
||||
private EventLogPurgeService CreatePurgeService(
|
||||
SiteEventLogOptions? optionsOverride = null,
|
||||
SiteEventLogActiveNodeCheck? isActiveNode = null)
|
||||
{
|
||||
var opts = optionsOverride ?? _options;
|
||||
return new EventLogPurgeService(
|
||||
_eventLogger,
|
||||
Options.Create(opts),
|
||||
NullLogger<EventLogPurgeService>.Instance);
|
||||
NullLogger<EventLogPurgeService>.Instance,
|
||||
isActiveNode);
|
||||
}
|
||||
|
||||
private void InsertEventWithTimestamp(DateTimeOffset timestamp)
|
||||
@@ -309,4 +312,54 @@ public class EventLogPurgeServiceTests : IDisposable
|
||||
|
||||
Assert.Empty(exceptions);
|
||||
}
|
||||
|
||||
// ── SiteEventLogging-019: purge runs only on the active node ──
|
||||
|
||||
[Fact]
|
||||
public void RunPurge_OnStandbyNode_SkipsAllWork()
|
||||
{
|
||||
// SiteEventLogging-019: per design, the daily purge runs on the active
|
||||
// node only. The standby's local SQLite receives no writes, so purging
|
||||
// there is unnecessary; we gate the purge tick on the injected
|
||||
// active-node check and early-exit when it returns false. The row
|
||||
// inserted here is well past retention, so a real purge would delete
|
||||
// it — the standby gate must leave it intact.
|
||||
InsertEventWithTimestamp(DateTimeOffset.UtcNow.AddDays(-31));
|
||||
Assert.Equal(1, GetEventCount());
|
||||
|
||||
var purge = CreatePurgeService(isActiveNode: () => false);
|
||||
purge.RunPurge();
|
||||
|
||||
Assert.Equal(1, GetEventCount());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RunPurge_OnActiveNode_RunsTheRetentionPurge()
|
||||
{
|
||||
// SiteEventLogging-019: when the active-node check returns true the
|
||||
// service runs the purge as before. Pinned alongside the standby case
|
||||
// so a future regression that inverts the gate is caught.
|
||||
InsertEventWithTimestamp(DateTimeOffset.UtcNow.AddDays(-31));
|
||||
InsertEventWithTimestamp(DateTimeOffset.UtcNow);
|
||||
|
||||
var purge = CreatePurgeService(isActiveNode: () => true);
|
||||
purge.RunPurge();
|
||||
|
||||
Assert.Equal(1, GetEventCount());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void RunPurge_WithNullCheck_FallsBackToRunning()
|
||||
{
|
||||
// SiteEventLogging-019: when no active-node check is supplied (the
|
||||
// default for non-clustered hosts and pre-existing tests), the service
|
||||
// preserves the pre-fix "run on every tick" behaviour rather than
|
||||
// silently skipping every tick. Backward compatibility guard.
|
||||
InsertEventWithTimestamp(DateTimeOffset.UtcNow.AddDays(-31));
|
||||
|
||||
var purge = CreatePurgeService(isActiveNode: null);
|
||||
purge.RunPurge();
|
||||
|
||||
Assert.Equal(0, GetEventCount());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user