Joseph Doherty
3e62f1617b
fix(localdb): registration follows replication config — baseline on enable, deregister self-heal on disable (pair-symmetric)
...
LocalDbSetup.OnReady registered all four replicated tables unconditionally on
every driver node, replicating or not. That was not merely wasteful (an
unreplicated node paid two INSERTs plus a json_object of the whole row inside
every write transaction, for an oplog nothing ever drained) — it made
baselineExistingRows unusable, so enabling replication on a long-running
default-OFF node converged on SUBSEQUENT WRITES ONLY and the rows already in the
file stayed invisible to the peer, silently and forever.
Registration now follows one predicate, LocalDbSetup.ReplicationIsConfigured:
LocalDb:Replication:PeerAddress OR :ApiKey non-blank. The OR is load-bearing —
only the dialling half of a pair sets PeerAddress, so keying on it alone would
strip capture from every passive node and the pair would converge in one
direction only. SyncListenPort deliberately does not join it: the passive
endpoint is fail-closed on the key, so a port with no ApiKey syncs with nobody.
configured => RegisterReplicated(table, baselineExistingRows: true), per
table, in the unchanged load-bearing DDL->register order
unconfigured => DeregisterReplicated(table), an idempotent boot self-heal that
drops the capture triggers an earlier build left behind and
prunes that table's oplog/row-version rows. One Information
line, only when it actually cleaned something.
PAIR SYMMETRY: the sync handshake compares registered-table digests fail-closed,
so flipping either key is a both-nodes-together change — set it on both and
restart both. Documented in CLAUDE.md, docs/Configuration.md and the replication
runbook (which claimed "this repo never calls DeregisterReplicated").
Verified against the pinned LocalDb 0.2.1: RegisterReplicated(string, bool) and
DeregisterReplicated(string) -> bool both exist; baselining seeds
__localdb_row_version at HLC 0 and the deregister return value distinguishes
"cleaned" from "nothing to clean". No pin bump needed.
Tests: LocalDbSetupTests gains pins for both branches (configured via
PeerAddress alone and via ApiKey alone; unconfigured => no tables, zero
triggers; late-enable => an HLC-0 baseline ledger entry; the log line fires once
and only when something was cleaned) — four went red against the old
unconditional code, and all four go red again under a constant-true predicate.
LocalDbWiringTests splits its exact-set pin into a replicating graph and a
default-OFF one. LocalDbPairHarness and AlarmSfLegacyMigratorTests built their
database from LocalDb:Path alone while configuring the replication engine from a
second config — production reads one configuration, so the two are now aligned.
Host.IntegrationTests: 224 passed, 0 failed, 5 skipped.
2026-08-18 07:25:01 -04:00
Joseph Doherty
e29fab19f6
test(acl): correct the array-cell comment — captured locals do take ref (re-review nit)
2026-08-18 07:13:16 -04:00
Joseph Doherty
1765e30063
fix(s7): worst-severity error message + OCE flushes recorded pass evidence (review round)
2026-08-18 07:10:51 -04:00
Joseph Doherty
f4b91dbbab
test(acl): race harness — hit diagnostics, 10k rounds, idiom notes (review round)
2026-08-18 07:10:44 -04:00
Joseph Doherty
088a1a1e81
docs(plan): r3 amendment — ScadaBridge register rows 38/39 join as Tasks 9-10
2026-08-18 07:00:42 -04:00
Joseph Doherty
b35e423c1d
fix(s7): a read pass that observes nothing reports nothing — empty pass no longer clears Faulted
2026-08-18 07:00:33 -04:00
Joseph Doherty
441b34a391
fix(acl): make InvalidateIfStale a monotonic-max CAS loop — stamp publication is never deferred
2026-08-17 07:15:30 -04:00
Joseph Doherty
4c16118105
fix(s7): read-pass health is worst-state-wins — a mixed pass can no longer report Healthy
2026-08-17 07:14:32 -04:00
Joseph Doherty
e9ba174156
docs(config): OTOPCUA_CONFIG_MODE is gone — site nodes are hardcoded FetchAndCache (Phase 4)
2026-08-17 07:07:51 -04:00
Joseph Doherty
f64b10b964
docs(plan): perf follow-ups round 3 — r2 register closes + four local live gates
2026-08-17 07:06:07 -04:00
Joseph Doherty
49d05bc27b
Merge branch 'perf/followups-r2' — round-1 register closed: ACL generation stamp + monotonic rollover guard, S7 cancellation/one-bad-decode pins + TM/CT live pin, historian bounded watches, orphaned-test-DB reaper (injection-hardened), MTConnect ownership comment, docker-dev readiness-gated deploy.sh
v2-ci / build (push) Successful in 4m45s
v2-ci / unit-tests (push) Failing after 19m17s
2026-08-17 06:32:56 -04:00
Joseph Doherty
f78f9cac28
test(sql): route SchemaComplianceFixture.Dispose through the hardened TryDropDatabase — one drop-DDL shape per file (final-review carryover)
2026-08-17 06:15:28 -04:00
Joseph Doherty
c15e5fc97b
docs(plan): name the r2 close-out docs commit in the ledger
2026-08-17 06:11:36 -04:00
Joseph Doherty
d4e5c379ce
docs(plan): perf follow-ups r2 close-out — outcomes, sweep record, register annotations
2026-08-17 06:11:20 -04:00
Joseph Doherty
d54b4fab62
docs(acl): fix the two comment nits from the T1 re-review — displacement precision, straggler-test claim
2026-08-17 06:09:13 -04:00
Joseph Doherty
580b77cecf
fix(sql-reaper): validate the GUID suffix and QUOTENAME the drop DDL; short reaper connect timeout; mint names from the prefix constant
2026-08-17 05:52:45 -04:00
Joseph Doherty
98d6a1908e
fix(acl): a stale-generation straggler can no longer roll the cache stamp backward and thrash ClearAll
2026-08-17 05:51:24 -04:00
Joseph Doherty
f797df5187
docs(s7-fixture): recapture the TM/CT addressing probe against the shipped profile; note CountingPlcFactory thread-safety
2026-08-17 05:47:43 -04:00
Joseph Doherty
fd202d81ce
test(s7): live-pin the Timer/Counter multi-var exclusion against a TM/CT-seeded s7_1500 fixture
2026-08-17 05:39:58 -04:00
Joseph Doherty
68461fbfb6
test(historian): justify/tighten the shutdown watch window; single read of RemoveCallCount per poll
2026-08-17 05:39:52 -04:00
Joseph Doherty
120e885b31
test(s7): assert the stale handle is disposed, not just replaced, in the cancellation-reopen pins
2026-08-17 05:39:47 -04:00
Joseph Doherty
1979cf4119
fix(acl): stamp the generation on Shard so a rollover racer cannot serve a stale-generation verdict; eviction-swap capacity hint
2026-08-17 05:37:56 -04:00
Joseph Doherty
8946644bb1
test(sql): reap >24h-old orphaned test databases at fixture startup (AdminUI + Configuration prefixes)
2026-08-17 05:37:22 -04:00
Joseph Doherty
9f09a62ad2
fix(docker-dev): guard the deploy POST against transport-level curl failure; bound both curls with --max-time
2026-08-17 05:37:04 -04:00
Joseph Doherty
45d670928a
test(historian): replace the recorder tests' fixed sleeps with bounded watches on drain-pass and truncation observables
2026-08-17 05:35:30 -04:00
Joseph Doherty
4f86073333
test(s7): pin the span/multi-var cancellation reopen contract, one-bad-decode-in-chunk, and multi-var shape mismatch
2026-08-17 05:33:45 -04:00
Joseph Doherty
a61b3c98a2
chore(docker-dev): readiness-gated deploy.sh + Traefik access log for the first-POST 404
2026-08-17 05:32:44 -04:00
Joseph Doherty
1edfc263ec
docs(mtconnect): state AsStream's buffer aliasing and lifetime contract
2026-08-17 05:31:28 -04:00
Joseph Doherty
248d998a79
docs(plan): perf follow-ups round 2 — ACL rollover window, S7 coverage + TM/CT live pin, historian bounded watches, test-DB reaper, docker-dev readiness gate
2026-08-17 05:28:24 -04:00
Joseph Doherty
7bb888bed1
Merge branch 'perf/followups' — follow-up register closed: per-driver overrun meter, drain-cancellation + ACL eviction + alarm-tracking fixes, SQL-Server-backed test pins, MTConnect XmlReader streaming, S7 multi-var leftovers; S7 + docker-dev live gates PASSED
v2-ci / build (push) Successful in 5m10s
v2-ci / unit-tests (push) Failing after 16m0s
2026-08-17 05:01:59 -04:00
Joseph Doherty
0b3972864a
docs(plan): record the close-out docs commit SHA in the follow-ups ledger
2026-08-17 04:43:09 -04:00
Joseph Doherty
07fd17a34e
docs(plan): perf follow-ups close-out — outcomes, live-gate evidence, register annotations
2026-08-17 04:42:51 -04:00
Joseph Doherty
7c5a843ace
docs(code): close-out comment fixes from the follow-ups review round
2026-08-17 04:32:53 -04:00
Joseph Doherty
57c66416d8
test(s7): live-gate span reads + multi-var leftovers against the s7_1500 fixture
2026-08-17 04:24:39 -04:00
Joseph Doherty
6b46c485ef
test(historian): bounded-wait durability read; honest nondeterminism notes on the #491 controls
2026-08-17 04:07:08 -04:00
Joseph Doherty
20022083df
perf(s7): span leftovers batch through multi-var read PDUs with per-chunk fallback
2026-08-17 04:05:42 -04:00
Joseph Doherty
5ae430237f
fix(alarms): background tasks register before they start; volatile _disposed
2026-08-17 04:04:45 -04:00
Joseph Doherty
cda82c074e
perf(mtconnect): stream sample-chunk parsing through XmlReader; no per-chunk document tree
2026-08-17 03:57:16 -04:00
Joseph Doherty
d884934593
fix(acl): shard eviction swaps the shard object so _globalCount cannot over-subtract; concurrency stress test
2026-08-17 03:55:13 -04:00
Joseph Doherty
97902d6879
fix(drivers): overrun-meter tag keys align with the Meter's snake_case convention (driver_type/driver_instance)
2026-08-17 03:54:53 -04:00
Joseph Doherty
c149410ba3
test(adminui): SQL-Server-backed pins for the drift watermark aggregate and the rename scan's collation widening
2026-08-17 03:53:16 -04:00
Joseph Doherty
7870c91fe4
fix(historian): a shutdown cancellation mid-drain is a pass abort, not a per-tag failure
2026-08-17 03:52:55 -04:00
Joseph Doherty
dba5f806d3
fix(runtime): explicit 30s command timeout on the Direct-apply artifact read
2026-08-17 03:49:27 -04:00
Joseph Doherty
6ee553cf8f
feat(s7): expose ReadMultipleVarsAsync through the IS7Plc seam
2026-08-17 03:48:15 -04:00
Joseph Doherty
c4d8e4a200
fix(acl): revalidation memo rejects empty node identifiers, mirroring the authorizer's guard
2026-08-17 03:47:19 -04:00
Joseph Doherty
e22ecea008
feat(drivers): per-driver poll-overrun meter on the shared OtOpcUa Meter; NoteOverrun + backoffCap doc notes
2026-08-17 03:46:27 -04:00
Joseph Doherty
acb3772426
fix(s7): validate span-read options at parse time; document the over-PDU degradation
2026-08-17 03:45:14 -04:00
Joseph Doherty
f06cbe16d9
docs(plan): perf follow-ups — 15-task plan off the remainder's follow-up register
2026-08-17 03:41:40 -04:00
Joseph Doherty
e40a038527
Merge branch 'perf/roadmap-remainder' — 28-task perf remainder: historian batching, ACL cache re-shape, driver round-trips, alarm coalescing, AdminUI hot spots, off-mailbox apply
2026-08-17 03:18:36 -04:00
Joseph Doherty
c8a7014388
fix(alarms): replacement drainer starts on a fresh stack; honest bounds in the latch comments
2026-08-16 05:57:05 -04:00