Phase 6.1 Stream E data layer - DriverInstanceResilienceStatus + DriverResilienceStatusTracker + EF migration #82

Merged
dohertj2 merged 1 commits from phase-6-1-stream-e-admin-hosts into v2 2026-04-19 08:49:44 -04:00
Owner

Lands the data + runtime layer of Stream E. SignalR hub + Blazor /hosts page refresh (E.2-E.3) are follow-up visual-review work.

Summary

  • New DriverInstanceResilienceStatus entity (DriverInstanceId + HostName composite PK) with LastCircuitBreakerOpenUtc / ConsecutiveFailures / CurrentBulkheadDepth / LastRecycleUtc / Baseline+CurrentFootprintBytes / LastSampledUtc. Separate from DriverHostStatus (connectivity) so the Admin UI can distinguish a Running host that has tripped its breaker from a host that is just disconnected.
  • EF migration 20260419124034_AddDriverInstanceResilienceStatus generated via dotnet ef migrations add.
  • DriverResilienceStatusTracker in Core.Resilience — process-singleton in-memory counters keyed on (DriverInstanceId, HostName). CapabilityInvoker + MemoryTracking + MemoryRecycle call sites will populate it; a HostedService (deferred) samples + persists.
  • SchemaComplianceTests updated to expect the new table.

Test plan

  • 9 new DriverResilienceStatusTracker unit tests: null before write; failures accumulate; success resets; breaker/recycle/footprint populate; host isolation; snapshot count; concurrent writes preserved.
  • SchemaComplianceTests pass against a live SQL Server with the new migration applied.
  • Full solution dotnet test: 1042 passing (baseline 906, +136 Phase 6.1 total).
  • Deferred follow-up PR: ResilienceStatusPublisher HostedService (5-s sample → upsert) + FleetStatusHub SignalR push + Admin /hosts column additions with visual-compliance review.

🤖 Generated with Claude Code

Lands the data + runtime layer of Stream E. SignalR hub + Blazor /hosts page refresh (E.2-E.3) are follow-up visual-review work. ## Summary - New `DriverInstanceResilienceStatus` entity (DriverInstanceId + HostName composite PK) with LastCircuitBreakerOpenUtc / ConsecutiveFailures / CurrentBulkheadDepth / LastRecycleUtc / Baseline+CurrentFootprintBytes / LastSampledUtc. Separate from DriverHostStatus (connectivity) so the Admin UI can distinguish a Running host that has tripped its breaker from a host that is just disconnected. - EF migration `20260419124034_AddDriverInstanceResilienceStatus` generated via `dotnet ef migrations add`. - `DriverResilienceStatusTracker` in `Core.Resilience` — process-singleton in-memory counters keyed on (DriverInstanceId, HostName). CapabilityInvoker + MemoryTracking + MemoryRecycle call sites will populate it; a HostedService (deferred) samples + persists. - SchemaComplianceTests updated to expect the new table. ## Test plan - [x] 9 new DriverResilienceStatusTracker unit tests: null before write; failures accumulate; success resets; breaker/recycle/footprint populate; host isolation; snapshot count; concurrent writes preserved. - [x] SchemaComplianceTests pass against a live SQL Server with the new migration applied. - [x] Full solution `dotnet test`: 1042 passing (baseline 906, +136 Phase 6.1 total). - [ ] Deferred follow-up PR: ResilienceStatusPublisher HostedService (5-s sample → upsert) + FleetStatusHub SignalR push + Admin /hosts column additions with visual-compliance review. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
dohertj2 added 1 commit 2026-04-19 08:49:33 -04:00
Ships the data + runtime layer of Stream E. The SignalR hub and Blazor /hosts
page refresh (E.2-E.3) are follow-up work paired with the visual-compliance
review per Phase 6.4 patterns — documented as a deferred follow-up below.

Configuration:
- New entity DriverInstanceResilienceStatus with:
  DriverInstanceId, HostName (composite PK),
  LastCircuitBreakerOpenUtc, ConsecutiveFailures, CurrentBulkheadDepth,
  LastRecycleUtc, BaselineFootprintBytes, CurrentFootprintBytes,
  LastSampledUtc.
- Separate from DriverHostStatus (per-host connectivity view) so a Running
  host that has tripped its breaker or is nearing its memory ceiling shows up
  distinctly on Admin /hosts. Admin page left-joins both for display.
- OtOpcUaConfigDbContext + Fluent-API config + IX_DriverResilience_LastSampled
  index for the stale-sample filter query.
- EF migration: 20260419124034_AddDriverInstanceResilienceStatus.

Core.Resilience:
- DriverResilienceStatusTracker — process-singleton in-memory tracker keyed on
  (DriverInstanceId, HostName). CapabilityInvoker + MemoryTracking +
  MemoryRecycle callers record failure/success/breaker-open/recycle/footprint
  events; a HostedService (Stream E.2 follow-up) samples this tracker every
  5 s and persists to the DB. Pure in-memory keeps tests fast + the core
  free of EF/SQL dependencies.

Tests:
- DriverResilienceStatusTrackerTests (9 new, all pass): tryget-before-write
  returns null; failures accumulate; success resets; breaker/recycle/footprint
  fields populate; per-host isolation; snapshot returns all pairs; concurrent
  writes don't lose counts.
- SchemaComplianceTests: expected-tables list updated to include the new
  DriverInstanceResilienceStatus table.

Full solution dotnet test: 1042 passing (baseline 906, +136 for Phase 6.1 so
far across Streams A/B/C/D/E.1). Pre-existing Client.CLI Subscribe flake
unchanged.

Deferred to follow-up PR (E.2/E.3):
- ResilienceStatusPublisher HostedService that samples DriverResilienceStatusTracker
  every 5 s + upserts DriverInstanceResilienceStatus rows.
- Admin FleetStatusHub SignalR hub pushing LastCircuitBreakerOpenUtc /
  CurrentBulkheadDepth / LastRecycleUtc on change.
- Admin /hosts Blazor column additions (red badge when
  ConsecutiveFailures > breakerThreshold / 2). Visual-compliance reviewer
  signoff alongside Phase 6.4 admin-ui patterns.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
dohertj2 merged commit a7f34a4301 into v2 2026-04-19 08:49:44 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dohertj2/lmxopcua#82