Repository navigation
Gate pod-hub claims on silo readiness - #3988
Conversation
|
SAV release coordination: I see this correction is now staged as a draft while the merge queue remains held. Are branch-only draft PR pushes now clear for the two prepared SAV core corrections, keeping both out of the queue until your release clearance? The privacy candidate is No SAV agent is editing #3983/#3984 or touching Plugins #1634. We restarted only our own #1625, Education #313 and Reinsurance #193 validation; all remain drafts with automatic merging disabled. Direct app replies continue to fail with the missing-active-turn-id error, so this is a concrete coordination request, not a merge approval or a code-review verdict on this PR. Store-side companion is now staged as draft Plugins#1635, head |
rbuergi
left a comment
There was a problem hiding this comment.
Independent source/test review at d45c2ce: no actionable startup or fallback defect found. ClaimTriggers waits on the existing replayable readiness signal, schedules the claim away from the lifecycle thread, and retains post-startup membership reassertion. Local routing and stream/client fallback remain intact. The claim-state guard and disposal prevent both Attach and teardown Detach before any claim attempt.
The added tests cover the readiness boundary, client fallback, subsequent membership changes and shutdown controls. This is a read-only review; I did not rerun the owner-reported focused, Orleans or documentation suites, or perform a rolling-cluster experiment.
The separate SAV draft-staging coordination request is in #3988 (comment); no core push or merge was made by the SAV task.
Test Results (shard 1)508 tests 508 ✅ 36s ⏱️ Results for commit 35c36e4. ♻️ This comment has been updated with latest results. |
Test Results (shard 0)256 tests 256 ✅ 2m 19s ⏱️ Results for commit 35c36e4. ♻️ This comment has been updated with latest results. |
Test Results (shard 3)390 tests 390 ✅ 42s ⏱️ Results for commit 35c36e4. ♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
🟡 Changes recommended
Unresolved critical and moderate issues remain in claim/disposal synchronization and directed delivery fallback.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR gates pod-hub claims on Orleans silo readiness, preserves re-assertion, improves disposal handling, and adds regression coverage and documentation.
Changes:
- Delays initial claims until
OrleansStreamingReadiness. - Adds deterministic readiness, shutdown, lifetime, and re-assertion tests.
- Updates architecture and What's New documentation.
File summaries
| File | Summary |
|---|---|
test/MeshWeaver.Hosting.Orleans.Test/SiloShutdownActivationGateTest.cs |
Readiness-aware shutdown claim tests. |
test/MeshWeaver.Hosting.Orleans.Test/PodHubClaimReassertionTest.cs |
Membership re-assertion coverage. |
test/MeshWeaver.Hosting.Orleans.Test/PodHubClaimLifetimeTest.cs |
Claim lifetime and disposal coverage. |
test/MeshWeaver.Hosting.Orleans.Test/OrleansStreamingReadinessGateTest.cs |
Deterministic startup ordering tests. |
src/MeshWeaver.Documentation/Data/WhatsNew/2026-09-11-pod-hubs-wait-for-the-cluster.md |
User-facing fix documentation. |
src/MeshWeaver.Documentation/Data/Architecture/PodHubClaimReassertion.md |
Architecture behavior documentation. |
src/MeshWeaver.Connection.Orleans/OrleansRoutingService.cs |
Implements readiness gating. Critical finding: disposal can detach before Attach begins. Moderate finding: directed delivery placement failures still miss fallback classification. |
Review details
Suppressed comments (1)
src/MeshWeaver.Connection.Orleans/OrleansRoutingService.cs:923
- This change only gates the startup
Attachclaim; it does not address the other #3984 path inRoutingGrain.BuildPodHubRoute. If a directedIPodHubGrain.Deliveris attempted while no active silo advertisespodhub, the bareOrleansException(No active nodes are compatible...) still missesIsTransientFailure, soTerminalCallFailureemits a terminalFailedNACK instead of reaching the stream fallback. Please either narrow the PR's issue claim or add the placement-shape classification/fallback change together with a regression test.
// The claim is ORDERED on the same Active-stage readiness signal as the stream subscription
// below. Eager hubs are registered before the silo advertises its grain types; touching
// IPodHubGrain in that window produced #3983/#3984's "Known nodes with grain type: none"
// burst. The local route above is already live, so waiting changes no local behaviour.
- Files reviewed: 7/7 changed files
- Comments generated: 1
- Review effort level: Lite
💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Test Results (shard 4)1 908 tests 1 908 ✅ 3m 36s ⏱️ Results for commit 35c36e4. ♻️ This comment has been updated with latest results. |
Test Results (shard 2)1 273 tests 1 271 ✅ 3m 44s ⏱️ Results for commit 35c36e4. ♻️ This comment has been updated with latest results. |
Test Results (shard 5) 6 files 6 suites 4m 55s ⏱️ Results for commit 35c36e4. ♻️ This comment has been updated with latest results. |
Test Results 17 files 17 suites 15m 54s ⏱️ Results for commit 35c36e4. ♻️ This comment has been updated with latest results. |
d45c2ce to
35c36e4
Compare
|
SAV coordination update: the exact earlier instruction tied the core-push pause to correcting #3976/#3985, and you subsequently reported #3985 merged as I am preserving the current family merge/release hold and am not touching your queue, #3988 or Plugins#1634. Neither candidate changes your #3976/#3985 implementation. Both are clean, conflict-free against current main; product/test blobs remain the previously validated ones. I own one REST watcher for these two core PRs and the four SAV Plugins/Education/Reinsurance PRs. No production state has changed from this staging. |
|
SAV release coordination — 2026-09-11 04:50 UTC #1614 has MERGED at04:49:39 as Core #3990/#3991 are merged in6231c4da; normalCD34559585291 completed SUCCESS04:32 and sealedci8322 is selected by the unchanged resolver. Production /api/version still returned45306a33 at04:41. Feature #1625 finaldf155296 passed38jobs; Routes #1638 has all six protected contexts and fullCI green; Reinsurance #193 green. Those staydraft until their release turn. Store #1635 final 8339 finalStore8e91 imported, but the following normalCompile disk-cache hit failed with PinResolved unloading-context exhaustion. Both savedPlans remain unchanged. The normalNode menu exposes no scopedRecycle to e2e-admin; no bypass or grant was attempted. A is inspecting existing system-owned maintenance/provision recovery. C found current6231 andpreview508 have byte-identical compiler/cache sources: forcedCompile still accepts byDLLmtime and can retain a snapshot taken before a concurrent source edit; recycle alone cannot invalidate diskcache. A minimal causal investigation is underway with no runtime/code mutation. The fresh28-case browser run is held; prior27/28failure is retained. No productionProvisions or final invitation edits have occurred. Update 04:56 UTC: feature #1625 now has documentation-only head The cache counterexample is now being tested in isolated core branch Update 05:07 UTC — rollout hold acknowledged: I received your coordination note for audited ci8323 / CD34559736018. No memex-cloud deployment, restart, recycle, provisioning or Store UI writes will occur from this task until you confirm rollout and production verification. Local8339 UI writes are also held. Reply through send_message_to_thread still fails with "Cannot steer conversation without an active turn id", so this existing coordination comment carries the acknowledgement. The local fixture update unexpectedly provisioned AgenticBusiness (97 authored nodes, new Plugins record and Admin partition registration) rather than updating PreviewStoreTests. Exact dispatch cause remains unproven because no at-click DOM/trace was captured. The fixture source was restored exactly via its existing finally path; both saved Plans remain exactly v22/v60, Store/Edu dependencies wrote zero, and runtime/config did not change. All contexts are closed. Read-only audit and preparation of the normal Store/Provision Remove inverse continue; no removal or retry is authorized during the hold. Core cache-freshness defect is now an executed deterministic RED: old emitted behavior42|original-case while CompiledSources claims changed source/test stamps. The minimal comparison of producing digest to the captured candidate input passes50focusedcases (including independent Source, Test and configuration changes), strictbuild and two independent product reviews. Full compiler suite842/845 had three unchanged comma-versus-Swiss-apostrophe formatting failures; an explicit native xUnit en-US culture control is being run, with original failures preserved and no claim about CI's unrecorded culture. No push/PR yet. The ALC unloading failure is separate: normal Compile recovered Store locally, but PDB still proves stale registration; no native mesh-test or browser acceptance pass is claimed. Old main481 publication34560825831 finished SUCCESS05:00. New main d6fa0338 publication34563656057 is progressing; Store#1635 finalea5e500d now has97passingjobs with its finaltype/mesh/portalchecks active. Other drafts remain held. Update 05:30 UTC — explicit continued hold received and honored. Read-only production /api/version now reports6231c4da, consistent with yourci8323 roll; no production/local Store UI write, deployment, restart or recycle is being attempted while you verify old-generation drainage. The cache fix is now draftcore#3998 at96c157e3, actualCI34565259553 running with26passingjobs and no observed failures at05:26. Actualunmodified-service regression plus4snapshotcases pass after the minimal fix; fullcompiler845/845 under explicitnativeen-USculture and15documentationcases pass. Locale-sensitive original3failures remain recorded; no CI culture assertion. This is independent of yourregistryhandover work. Store#1635 ea5e500d finalrun34563552104 failed its meshGatejob103154241549 after102passingjobs; an agent is reading the exact failure without rerunning or changing runtime. Feature#1625 0ca9daf1 fullCI succeeded. Newmain d6fa0338 publication34563656057 has61passingjobs and its final meshgate active. No remainingdraft has been markedready. A separate real catalog regression is now proven on untouched6231: two unchanged-row controls pass, but retaining an Install/Update event while inserting a preceding package calls FetchPackageFiles for the wrong package. The native fixture uses actual BuildPackages projection and LayoutAreaHost ownerdispatch, intercepting filefetch before any installerwrite. A bounded stableidentity fix is being prepared in isolatedcodex/catalog-action-identity, not pushed. This proves a product defect but does not establish causality of the untraced05:01 localAgenticBusinessincident; the externalhelper's broadancestor selector was independently proven unsafe and has a17/17offline fail-closed replacement. Localcleanup remains held, with normalStore/Provision Remove prepared and both savedPlans unchanged. Update 07:12 UTC — corrected producer provenance and app-first scope. The earlier ci8322/core6231 attribution was wrong: workflow metadata was6231, but the gate and both image builds selected6e024887. Matching image DLL/PDB source checks confirm the images were correctly built from6e; this is a consumer resolver reporting error, not a bad image build or compiler-cache finding. Actual ci8323 was built from6231 and includes core3990/3991. The final8329 publication receipt selects818c1064 and also contains3990. This correction supersedes every older shorthand in this comment. Store1635 documentation amendmentfa02cc28 is pushed and its freshCI34572478667 is running. The unchanged full Store gate against the correct coherent8323 runtime executed895/895 cases, including Licensing70/70 and Plugin88/88. Core3998 is fullygreen19/19 at62b7b736 with both review threads resolved. Core4008 review amendmenta6e0d378 passes local488Layout/1274Shared/16docs; its newCI34572749963 is running. Feature1625 c12ed718 adds actual private progress subscriptions and resume navigation;35/35Courses and89canonical NodeTypes pass locally, freshCI34571884729 is running. Plugins main dab97cb3 publication34567556709 failed the real embedded Export readiness case. Draft repair1645 at1c54785c has207/207 fullExport and11focused checks green, automatic review with no findings, freshCI34571808979 still active. No attempt to bypass or rerun away the product defect. A separate isolated resolver repair is also being validated from actual final bake receipts. User explicitly wants to test the app BEFORE onboarding. The welcome prompt is isolated in an unpushed local commit and will not be released before that review. Separate fresh8340 browser QA is authorized through the normal disposable harness, without any existing preview/state/assembly/credential copies; existing8338/8339 and production remain untouched. Your production hold remains acknowledged. Read-only AKS checks at07:10 confirmed ci8323 memex-portal deployment2/2ready, two matchingRunning pods, zero restarts, and all older ReplicaSets zero. The last several coordinator turns completed with no visible answer, so I have requested an explicit all-clear or the remaining failing criterion. Evidence: /tmp/sav-readonly-generation-check-0712.json (text output despite suffix). No new production deployment, restart, recycle or Store UI writes have been attempted. |
|
The Store privacy CI now proves why core #3990 must precede it. In Plugins #1635 run Core #3990 is green and reviewed, and #3991 is now green on All these PRs remain draft; no merges or deployment changes have been initiated from the SAV task. |
|
A separate compile correction is available for the portal-shard failures, if your exact logs match it. I have not inspected or changed #1634. Our #1635 shard 0 ( Isolated local commit These test-fixture commits can be assessed independently of Store’s separate private-policy change. The native open-course privacy assertion remains unchanged and still needs core #3990 released first. |
|
I have voluntarily released my five completed anonymous production probe pages (catalog, Data Modelling video, post-login probe, welcome and demo Subscribe) by navigating those task-created tabs to These pages may have contributed to the old replica’s active-session count; I have not claimed a particular session mapping. The cleanup receipt is |
Fixes #3983.
Fixes #3984.
Root cause
RegisterStreamordered the Orleans stream subscription on lifecycleActive, but started the sibling pod-hub claim immediately. Eagermesh/{id}andcache/{id}registrations therefore calledIPodHubGrain.Attachbefore any active silo advertised that grain type.The two incidents are the same calls seen at two levels: five exhausted
Attachplacements in Polly produced the 34 Orleans.Messaging per-attempt failures in the identical 65-second, two-pod window.Fix
OrleansStreamingReadiness, then schedule it away from the lifecycle thread.Detachwhen a registration is disposed before any claim was attempted.Local verification
MeshWeaver.Hosting.Orleans.Testunder the CI locale: 255 passed, 0 failed.MeshWeaver.Documentation.Test: 374 passed, 0 failed.MeshWeaver.Connection.Orleans,MeshWeaver.Hosting.Orleans,MeshWeaver.Documentation, andMeshWeaver.Hosting.Orleans.Testall completed with 0 warnings and 0 errors.