Closes tasks #132 + #118 (GA hardening backlog).
Before this commit, the Server only observed the generation in force at
process start (SealedBootstrap). Peer-published generations accumulated
in the shared config DB while the running node kept serving the
generation it had sealed on boot. Two consequences:
1. Operator role-swaps required a process restart — Admin publishes a
new generation, but the Server's RedundancyCoordinator never re-read
the topology.
2. ApplyLeaseRegistry had no apply to wrap. ServiceLevelBand sat at
PrimaryHealthy (255) during every publish because nothing opened a
lease; PrimaryMidApply (200) was effectively dead code.
New GenerationRefreshHostedService (src/.../Server/Hosting/):
- Polls sp_GetCurrentGenerationForCluster every 5s (tunable).
- On change: opens leases.BeginApplyLease(newGenerationId, Guid.NewGuid()),
calls coordinator.RefreshAsync inside the `await using`, releases on
scope exit (success / exception / cancellation via IAsyncDisposable).
- Diagnostic properties: LastAppliedGenerationId, TickCount, RefreshCount.
- Delegate-injected currentGenerationQuery for test drive-through; real
path is the private static DefaultQueryCurrentGenerationAsync.
- Registered as HostedService in Program.cs alongside the Phase 6.3
redundancy / peer-probe stack.
Scope intentionally narrow: only the coordinator refreshes today. Driver
re-init, virtual-tag re-bind, script-engine reload remain as follow-up
wiring. The lease wrap is the right seam for those subscribers to hook
once they grow hot-reload support — the doc comments say so.
Tests
- 5 new unit tests in GenerationRefreshHostedServiceTests (first-apply,
identity no-op, change-triggers-refresh, null-generation-is-no-op,
lease-is-released-on-exit). Stub generation-query delegate; real
coordinator backed by EF InMemory DB.
- Server.Tests total 252 → 257.
Docs
- v2-release-readiness.md Phase 6.3 follow-ups list marks the
sp_PublishGeneration lease wrap bullet struck-through with close-out
note.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>