perf(site-runtime): coalesce native-alarm mirror persistence into batched flushes (P4)
This commit is contained in:
@@ -150,6 +150,40 @@ public class NativeAlarmActorTests : TestKit, IDisposable
|
||||
instance.ExpectNoMsg(TimeSpan.FromMilliseconds(300));
|
||||
}
|
||||
|
||||
// ── PLAN-03 Task 20 (P4): coalesced batched persistence ─────────────────
|
||||
|
||||
private IActorRef SpawnWithFlush(IActorRef instanceActor, IActorRef dclManager, TimeSpan flushInterval) =>
|
||||
ActorOf(Props.Create(() => new NativeAlarmActor(
|
||||
Source(), "inst", instanceActor, dclManager, _storage, _options,
|
||||
NullLogger<NativeAlarmActor>.Instance, AlarmKind.NativeOpcUa, null, flushInterval)));
|
||||
|
||||
private static void DeliverLiveTransition(IActorRef actor, string sourceRef, int severity, DateTimeOffset time) =>
|
||||
actor.Tell(new NativeAlarmTransitionUpdate("Opc", Transition(
|
||||
sourceRef, AlarmTransitionKind.Raise,
|
||||
new AlarmConditionState(true, false, null, AlarmShelveState.Unshelved, false, severity), time)));
|
||||
|
||||
[Fact]
|
||||
public async Task AlarmStorm_CoalescesPersistence_LatestPerSourceRefWins()
|
||||
{
|
||||
var instance = CreateTestProbe();
|
||||
var dcl = CreateTestProbe();
|
||||
var actor = SpawnWithFlush(instance.Ref, dcl.Ref, TimeSpan.FromMilliseconds(100));
|
||||
dcl.ExpectMsg<SubscribeAlarmsRequest>();
|
||||
|
||||
// 50 live transitions across 5 source refs (strictly increasing time per ref so none
|
||||
// is dropped as stale) — the coalesced flush must collapse them to one row per ref.
|
||||
var baseTime = DateTimeOffset.UtcNow;
|
||||
for (var i = 0; i < 50; i++)
|
||||
DeliverLiveTransition(actor, $"ref-{i % 5}", severity: i, baseTime.AddMilliseconds(i));
|
||||
|
||||
await Task.Delay(500); // > flush interval
|
||||
|
||||
var rows = await _storage.GetNativeAlarmsAsync("inst", Source().CanonicalName);
|
||||
Assert.Equal(5, rows.Count);
|
||||
// The LAST write for ref-4 carries severity 49 (i = 49, 49 % 5 == 4).
|
||||
Assert.Contains(rows, r => r.ConditionJson.Contains("49"));
|
||||
}
|
||||
|
||||
// ── M1.5: site event log `alarm` category ──────────────────────────────
|
||||
|
||||
[Fact]
|
||||
|
||||
Reference in New Issue
Block a user