Sync-stream hubs still at RunLevel=Starting hold never-finishing DeliveryFailure turns through mesh teardown, overrunning DrainAsync's 30 s bound
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 25/100
Research direction
Read MeshTeardownExtensions.DrainAsync and MeshTeardownHostedService, then trace the delivery pipeline's DeliveryFailure handling and the sync-stream hub handlers. The report does not identify the handler's cause or the failing delivery; inspect the two hubs' failure payloads and Loki lines from 07:44–07:58Z, then check for disposal wedge or discard events. Done means identifying why the turns hang and whether teardown cancellation reaches them.
Written by the indexing model from the issue text.
Description
Observed
During pod shutdown, MeshWeaver.Mesh.MeshTeardownExtensions.DrainAsync (reported by MeshWeaver.Hosting.MeshTeardownHostedService, 30 s TeardownTimeout) gave up on mesh {path}: the mesh root and its {path} child sit at RunLevel=DisposeHostedHubs, Disposal=Pending with all queues empty, held by two hosted sync hubs — {path} and {path} — which are still at RunLevel=Starting (openGates=1) and whose action blocks have each been executing a single DeliveryFailure turn for 501 240 ms (~8.4 min) and 801 280 ms (~13.4 min), with the pumps draining (drainsInFlight=1) and one further turn queued (buffer=1) behind each. Both wedged turns began minutes before the teardown started (≈07:49:33Z and ≈07:44:33Z against the 07:57:54Z log line).
Two structural facts about the wedged hubs, read against {path}:
- The executing turn is not the hub's
InitializeHubRequest, so the bring-up cancel path ("a hub that never finished starting") does not reach it. - Each hub's
ShutdownRequestqueues FIFO behind the wedged turn, so neither hub ever begins disposing — the stall detector ([DISPOSE-WEDGE],CancelExecution()) arms on the hub's ownDisposeand therefore never fires. No cooperative cancellation path reached these turns at all; the teardown's outer bound reported, as designed, and the host proceeded over unfinished work.
Where and when
One occurrence, one pod (memex-portal-deployment-5897bcf6d4-hdssc), namespace memex-cloud, at a single instant during pod termination. The wedged turns predate the shutdown by 8–13 minutes; the timeout itself is the designed caller bound reporting, not a crash or a burst.
Impact
Judged from the numbers: on this burst the overrun is bounded — the host logs, proceeds to HostOptions.ShutdownTimeout and the pod grace ceiling ends the process; no serving degradation is evidenced on this incident. The concern is the wedged-turn shape itself: a DeliveryFailure turn that does not finish for 8–13 minutes on a hub still mid-bring-up, reachable by no cancellation path in the teardown design.
Related report — possible same family, not established
{path} (2026-10-28, one day earlier, same memex-cloud instance): a serving cache hub {path} wedged executing a single DeliveryFailure for ~2.5 h, queue growing to ~17k, ~40% of MCP {path} timing out. Same message shape (one never-finishing DeliveryFailure turn), same instance, different hub role and consequence. Not established that the two are the same defect; if confirmed, this incident's severity should be re-ruled upward (the sibling report describes instance-wide degradation).
Not established
- The cause of the turns not finishing — no handler stack, await site or
DeliveryFailurepayload was read. - What delivery each
DeliveryFailurereports (the failing delivery's target and exception are inside the message, not in the log line). - Whether it still occurs, whether other pods or log sites show the same wedged turn, and whether this pod was part of a roll (only that
MeshTeardownHostedServiceran, i.e. SIGTERM, is evidenced). - Which {path} the
sync/*hubs belong to (ids are instance-scoped; the per-instance identity is masked). - Whether
[DISPOSE-WEDGE]/DISPOSAL DEADLOCKlines exist for these two hub addresses (see candidate cause 2).
Candidate causes and the reading that separates them
- The
DeliveryFailurehandler on a sync hub blocks on an await that never completes — the same shape the 2026-10-28 report describes on a serving cache hub. Predicts: a dump of the executing turn parks on a named await, and theDeliveryFailurepayload names the delivery and target that failed. Reading: theDeliveryFailurecontent for both hub ids (its inner failure names the failed delivery and address), and the Loki lines for podmemex-portal-deployment-5897bcf6d4-hdssccovering 07:44–07:58Z, which show what delivery failed and what the hub was doing when the turn was accepted. - A structural gap: no cancellation path reaches a wedged turn on a hub that never began disposing (mechanism for why 8–13 min elapsed untouched, not the cause of the turn not finishing). Predicts: no
[DISPOSE-WEDGE](7311) /DISPOSAL DEADLOCK DETECTED(7312) lines and no[DISPOSE-DISCARD]naming these two hub addresses in this window — their presence would move the finding to a turn that received and ignored cancellation; their absence confirms the gap. Reading: Loki search for those event ids against the two sync addresses. - The
DeliveryFailureis a downstream symptom of the never-finished bring-up (RunLevel=Starting,openGates=1): a delivery failed against the half-started hub and its failure handler interacts with the still-shut initialization gate. Predicts: theDeliveryFailure's inner exception names the bring-up or the gate rather than an external target. Reading: the same payload as (1) separates this from (1) by the ordering of the inner failure.
Where to look
MeshWeaver.Mesh.MeshTeardownExtensions.DrainAsyncandMeshWeaver.Hosting.MeshTeardownHostedService(the 30 s bound that reported) — meshweaver partition.- The
DeliveryFailurehandling path in the delivery pipeline (a[CanBeIgnored]message per the teardown docs) and thesync/*(sync-stream) hubs' handlers. {path}(the two layers, the bring-up exception, the stall verdicts),{path},{path},{path}.- Related report:
{path}.
Severity note: sev:M because this burst alone is a bounded shutdown overrun on one pod with no evidenced serving impact; the sibling report from the previous day, if confirmed as the same wedged-DeliveryFailure defect, warrants a human re-ruling upward.
Evidence
| Fingerprint | b90bf68dc7209342 |
| Category | MeshWeaver.Hosting.MeshTeardownHostedService |
| Severity | Error |
| Exception | System.TimeoutException |
| Top frame | MeshWeaver.Mesh.MeshTeardownExtensions.DrainAsync(IMessageHub mesh, IoPoolRegistry ioPools, AsyncDisposeQueue asyncDisposeQueue, TimeSpan timeout, MeshTeardownSignal teardownSignal, Boolean activitiesQuiesced, ILogger logger, ActivityQuiesceReport quiesce) |
Namespace memex-cloud |
1 occurrence(s), 2026-10-29 07:57:54Z → 2026-10-29 07:57:54Z; pods memex-portal-deployment-5897bcf6d4-hdssc |
| Occurrences | 1 |
| First seen | 2026-10-29 07:57:54Z |
| Last seen | 2026-10-29 07:57:54Z |
| Routing | not determined — no configured route matches the category MeshWeaver.Hosting.MeshTeardownHostedService. 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-10-29 07:57:54Z memex-portal-deployment-5897bcf6d4-hdssc fail: MeshWeaver.Hosting.MeshTeardownHostedService[0]
MeshTeardownHostedService: mesh {path} did not finish draining within 00:00:30 — the host proceeds to dispose its container over work that has not finished. Find what is still going down; do not widen the budget.
Hub {path} RunLevel=DisposeHostedHubs Disposal=Pending Queue(buffer=0,deferred=0,drainsInFlight=0,openGates=0,draining=False,drainsAwaitingScheduler=0) Registrants=35
HostedHubs (1):
Hub {path} RunLevel=DisposeHostedHubs Disposal=Pending Queue(buffer=0,deferred=0,drainsInFlight=0,openGates=0,draining=False,drainsAwaitingScheduler=0) Registrants=5
HostedHubs (2):
Hub {path} RunLevel=Starting Disposal=Pending Queue(buffer=1,deferred=0,drainsInFlight=1,openGates=1,draining=True,drainsAwaitingScheduler=0) Executing(DeliveryFailure, 501240ms) Registrants=6
Hub {path} RunLevel=Starting Disposal=Pending Queue(buffer=1,deferred=0,drainsInFlight=1,openGates=1,draining=True,drainsAwaitingScheduler=0) Executing(DeliveryFailure, 801280ms) Registrants=6
System.TimeoutException: Mesh {path}: disposal did not complete within 00:00:30. Something on the action block is not finishing — find it; do not widen the budget.
Hub {path} RunLevel=DisposeHostedHubs Disposal=Pending Queue(buffer=0,deferred=0,drainsInFlight=0,openGates=0,draining=False,drainsAwaitingScheduler=0) Registrants=35
HostedHubs (1):
Hub {path} RunLevel=DisposeHostedHubs Disposal=Pending Queue(buffer=0,deferred=0,drainsInFlight=0,openGates=0,draining=False,drainsAwaitingScheduler=0) Registrants=5
HostedHubs (2):
Hub {path} RunLevel=Starting Disposal=Pending Queue(buffer=1,deferred=0,drainsInFlight=1,openGates=1,draining=True,drainsAwaitingScheduler=0) Executing(Deliv…[truncated]
Opened automatically from Admin/_LogIncident/b90bf68dc7209342. Recurrences are folded into this issue rather than opening new ones.
It also stands for the whole log site 950626c18f056bf0: other fingerprints of this site fold in here as comments rather than opening tickets of their own.
- Dominant language
- C#
- Stars
- 12
- Forks
- 5
- Avg merge
- 5h 37m
- Merged PRs (30d)
- 959
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- No contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Systemorph/MeshWeaver
-
bug ci-template-feed sev:M
Difficulty 4/5 3-5 days Newbie friendliness 35/100
Systemorph/MeshWeaver#7660 ·
Maintainers usually reply within 1 day
-
chore ci-artifact-store-miss sev:M
Difficulty 4/5 3-5 days Newbie friendliness 44/100
Systemorph/MeshWeaver#7656 ·
Maintainers usually reply within 1 day
-
bug sev:H
Difficulty 4/5 1-2 days Newbie friendliness 25/100
Systemorph/MeshWeaver#7654 ·
Maintainers usually reply within 1 day
-
GitSync: an Ignore pattern added after the first import leaves the imported nodes in place, and on a one-way Space nobody can remove themPossibly taken @rbuergi claimed this today. Openenhancement feature:gitsync-ownership feature:node-delete sev:M
Difficulty 5/5 Over a week Newbie friendliness 35/100
Systemorph/MeshWeaver#7611 ·
Maintainers usually reply within 1 day
-
bug sev:B
Difficulty 4/5 3-5 days Newbie friendliness 48/100
Systemorph/MeshWeaver#7598 ·
Maintainers usually reply within 1 day
All issues in Systemorph/MeshWeaver
Similar issues
-
bug effort:S P3
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
nightscout/nocturne#3093 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 67/100
Maintainers usually reply within 3 days
-
Difficulty 1/5 Under an hour Newbie friendliness 85/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100