Repository navigation
RecycleCascade tears down hubs before deferred SubscribeRequests are drained, discarding accepted work #5117
Description
What is failing
MeshOperations.Recycle (an operator-initiated recycle of Hosting/TriageItem) tears down a hub (Hosting/Triage/ci-failure/...) via RecycleCascade while a SubscribeRequest accepted from the portal cache client is still parked behind the hub's closed initialization gates (DataContextInit, MeshNodeInit). The request is discarded unprocessed and the sender is answered ShuttingDown, violating the documented drain guarantee that accepted work must be drained before a hub goes down.
Probable cause
The RecycleCascade teardown path does not wait for (or reject ahead of the gate-closing) deferred messages that were already accepted but not yet initialized. Medium confidence: the log itself proves the discard happened and that the teardown was cascade-initiated, but the exact interleaving — whether the SubscribeRequest arrived after RunLevel began shutting down, or was deferred and then starved by the cascade — is not distinguishable from this single occurrence.
Impact
Minimal at this fingerprint: a single occurrence on one pod at a single point in time; the client received ShuttingDown and can resubscribe on hub reactivation. However, this is one of 30+ open [DISPOSE-DISCARD] incidents at the same MeshWeaver.Messaging.MessageService log site spanning Subscribe/Unsubscribe/GetData requests across many hubs, suggesting a systemic gap in the shutdown/drain path rather than an isolated race. Likely duplicates/family: Admin/_LogIncident/03a2bc711f5e4501, Admin/_LogIncident/b8716c17b178ac35, and others in the same category.
Where to look
The teardown/deferred-message drain logic in MeshWeaver.Messaging.MessageService (the [DISPOSE-DISCARD] log site, event id 7301), and the RecycleCascade dispose-request handling in MeshOperations.Recycle / NodeTypeRecycleCascade. The fix direction is either draining deferred-but-accepted requests before gate-closed disposal completes, or rejecting them at accept time once RunLevel leaves the running state.
Evidence
| Fingerprint | 657ae482de37b608 |
| Category | MeshWeaver.Messaging.MessageService |
| Severity | Error |
| Namespace | memex |
| Pods | memex-portal-deployment-5998d5fddf-9sfsv |
| Occurrences | 1 |
| First seen | 2026-09-21 08:44:55Z |
| Last seen | 2026-09-21 08:44:55Z |
| Routing | not determined — no configured route matches the category MeshWeaver.Messaging.MessageService. This repository is the configured fallback, not a finding about who owns the fault; the category names the LOGGER, which may not be the subject. |
Recent log lines
2026-09-21 08:44:55Z memex-portal-deployment-5998d5fddf-9sfsv fail: MeshWeaver.Messaging.MessageService[7301]
[DISPOSE-DISCARD] Hub Hosting/Triage/ci-failure/systemorph-meshweaver-education-35199594174 is disposing with SubscribeRequest (id=VqxOdz9y_E6waf9jYNogkg, from cache/wpWb1fSJPUacoVxY6LnltQ) still deferred; initialization gates closed at deferral: [DataContextInit,MeshNodeInit] — the message is NOT processed; the sender is answered ShuttingDown. RunLevel=ShutDown. This teardown was requested by portal/nodeops-Mm65LBweYUu07nxEzvUZ9w (routed DisposeRequest); why: RecycleCascade from 'Hosting/TriageItem': MeshOperations.Recycle: an operator asked for 'Hosting/TriageItem' to be recycled (the Recycle tool / Compile button), which stamps a release request and then tears the hub down so the next access reactivates it. Accepted work must be drained before a hub goes down — that attribution is who to ask why this hub went down with work still parked behind its gates.
Re-addressed by the current identity function: this incident inherited d2249f800ffc2577 (Systemorph/MeshWeaver.Plugins#1796). Those nodes are superseded and will not fold, file or comment again.
Opened automatically from Admin/_LogIncident/657ae482de37b608. Recurrences are folded into this issue rather than opening new ones.
Activity
rbuergi commentedon Sep 21, 2026
Closes as duplicate of #4888.
Reason: same defect —
MeshWeaver.Messaging.MessageServicediscards work it has already accepted when that work is still parked behind a hub'sDataContextInit/MeshNodeInitgates at teardown, answering the senderShuttingDowninstead of draining it. The log line itself states the contract being violated: accepted work must be drained before a hub goes down.These tickets split by what triggered the teardown, not by what is broken — the trigger set measured in this one burst is: an operator
MeshOperations.Recycle(the Recycle tool / Compile button), aRecycleCascadefrom a NodeType, an overlay self-healDisposeRequest, a stale-build convergence self-recycle (Modules:AutoRecycleOnStaleBuild=true), and a directDispose()on a plugin-install hub (#4888's own sample). One code path, five entry points; folding on the trigger would have produced five tickets for one fix.Evidence migrated to #4888: trigger =
RecycleCascade. 1 occurrence 2026-09-21 08:44Z. Fingerprint657ae482de37. Nothing new beyond #5110.