Silo IoPool teardown expired over one in-flight mesh query leaf on memex — Query pool's Observable.Using over MeshQuery+QueryMembers outlived the 30 s join
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 20/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Stack tecnologico
- csharp, postgresql
- Ambito
- backend, databases, distributed-systems
Direzione di ricerca
Start with Threading/IoPool.cs and trace IoPool.Invoke's linked cancellation token, then inspect the Query pool registration and MeshWeaver.Hosting Persistence/Query/MeshQuery's QueryMembers subscription. Compare the leaf's cancellation behavior with PooledLeafObservesItsTokenGuard and read the silo stop timeline for the named pod. Done means establishing why the single Query leaf outlived the 30-second join and identifying a reproducible fix; the incident alone does not establish the cause.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Observed
IoPoolSiloTeardown (the IoPool silo-lifecycle participant at stage First, 30 s bounded join) reported that its join expired over live work during a silo stop, and — unlike the original core issue 2480 occurrences, which named nothing — this one names its subject: Query pool, 1 in-flight leaf, reported as System.Reactive.Linq.ObservableImpl.Using2[[MeshWeaver.Mesh.QueryResultChange1[[MeshWeaver.Mesh.MeshNode, MeshWeaver.Mesh.Contract, v3.1.0.0]], MeshWeaver.Mesh.Contract, v3.1.0.0],[MeshWeaver.Hosting.Persistence.Query.MeshQuery+QueryMembers, MeshWeaver.Hosting, v3.1.0.0]]. One pooled mesh-query leaf (Observable.Using over MeshQuery.QueryMembers producing QueryResultChange<MeshNode>) was still running when the 30 s budget ran out, so the silo released over it. The message's own text attributes this to a leaf that did not observe its cancellation token — that is the framework's diagnosis, not an independently established cause (see below).
This is the same log site and the same defect class as core issue 2480 (18 occurrences of the bare timeout sentence, whose subject was never identified): IoPool.Invoke runs its leaf as return await io(ct) with the subscriber's token linked to the pool-wide token that Drain/Dispose cancel, so a leaf whose returned Task cannot observe ct holds its permit past any drain, the pool's Disposed never completes, and the caller's bounded join expires over it. Related prior findings on this class, neither covering this leaf: Systemorph/MeshWeaver.Feedback#23 (the only measured production site ignoring the token is the embedding HTTP leaf in MeshWeaver.Plugins — the Query pool was NOT implicated there) and Systemorph/MeshWeaver.Feedback#24 (the N leaf(es) survived the join Error branch of this same report is unreachable because IoPool.Disposed carries a hard-coded 0 — which is presumably why the attribution had to take this "Did NOT report" form).
Where and when
Single occurrence, single pod (memex-portal-deployment-78fd5d66b7-lmm7j), tenant memex, at 2026-10-26 22:53:57Z. The log site only fires during a silo stop, so the pod was in its stop sequence at that moment; whether a roll or a single restart put it there was not established from the incident. This is the first occurrence this fingerprint records, and the first at this site since the attribution (Did NOT report: …) made the subject nameable.
Impact
The silo stopped with a pooled mesh-query leaf still running — the stop's bounded join was burned, the pod was released over live work, and whatever that leaf was doing (a live MeshNode change subscription feeding a client) lost its host. One stop, one pod, one leaf: an intermittent shutdown-time defect today, but of the class that made 2480 a three-week hunt when it named nothing, and the one that IoPoolSiloTeardown's own remarks call "the ONLY attribution a subsequent SIGSEGV will get".
Not established
- The cause. Whether the named Query leaf actually ignores the pool token (the 2480 class), or was simply a leaf observing the token whose underlying work took longer than 30 s to unwind (e.g. a slow-to-cancel database command behind
QueryMembers), or the cancellation callbacks were starved and never ran at all. The framework's message asserts the first; the evidence here is one timeout line. - Whether the leaf ever completed after the report, or holds its permit indefinitely (a pool whose
Disposednever fires). - Whether the stop otherwise completed cleanly and whether the process exited shortly after.
- Whether this recurs on every stop of a memex pod or was a one-off.
- Whether other pools reported in the same stop (the sample names only Query).
Candidate causes and the reading that separates them
- The Query leaf ignores the pool token (the 2480 class, at the persistence-query surface in core). An
Observable.UsingoverMeshQuery.QueryMemberswhose subscription work does not observect— the same shape as the embedding leaf in Feedback#23, but inside core's own query pipeline, where the core guardPooledLeafObservesItsTokenGuard(added with 2480's fix, scanning core src) should have caught it — whether this leaf shape is genuinely outside what that guard holds, or inside core and missed by it, is itself worth answering. Predicts: the same fingerprint on every stop of a pod with an active mesh query, and aQuerypool that never completes. Discriminating reading: theIoPool.Invokecall site that registers the Query pool's leaf — whether the returned Task observes the linked token — plus the next stop of a memex pod in Loki: whetherQuery=1appears again. - The leaf observes the token, but its underlying work outlived the budget. A
QueryMembersread or a PostgreSql command that takes cancellation but unwinds slower than 30 s (cancel of an in-flight database command, Rx teardown queued behind other work). Predicts: the stop completed soon after the report anyway (process exit lines within the following minute), and the fingerprint does not recur on every stop. Discriminating reading: Loki for this pod after 22:53:57Z — the process's exit timing relative to the report. - A starved silo: cancellation was requested but the callbacks could not run. The memex starved-silo shape recorded in
deploy/helm/values.yaml(2026-07-22 membership-probe starvation) — thread-pool saturation at stop time means the token's registrations never execute. Predicts: the pod'sSiloStopTimelinelines (now pinned to Information inMemex.Portal.Distributed/appsettings.json, held byShippedLoggingLevelsGuard) show largepending work itemsorGC pause totalfigures, or a.NET Thread Pool execution stalledwarning in the same window. Discriminating reading: that pod'sSiloStopTimeline:lines and the thread-pool stall warnings for 22:53–22:55Z.
Where to look
MeshWeaver.Connection.OrleansIoPoolSiloTeardown/IoPoolRegistry— the report and the per-poolDisposedsubscription (TryFinishDisposalpublishes the hard-coded 0 per Feedback#24).MeshWeaver.Mesh.ContractThreadingIoPool.cs—Invoke'sreturn await io(ct)leaf and the token linkage.MeshWeaver.HostingPersistence/Query/MeshQuery— theQueryMemberssubscription the report names; the leaf the 30 s join expired over.Doc/Architecture/ReadingASiloStop(mesh) — how to line up this pod'sSiloStopTimeline/IoPoolSiloTeardown/MeshTeardownHostedServicelines against peers' view of the same stop.- Prior art: core issue 2480;
Systemorph/MeshWeaver.Feedback#23and#24.
Evidence
| Fingerprint | 6e502415adcf0ae7 |
| Category | MeshWeaver.Connection.Orleans.IoPoolSiloTeardown |
| Severity | Error |
| Namespace | memex |
| Pods | memex-portal-deployment-78fd5d66b7-lmm7j |
| Occurrences | 1 |
| First seen | 2026-10-26 22:53:57Z |
| Last seen | 2026-10-26 22:53:57Z |
| Routing | not determined — no configured route matches the category MeshWeaver.Connection.Orleans.IoPoolSiloTeardown. 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-26 22:53:57Z memex-portal-deployment-78fd5d66b7-lmm7j fail: MeshWeaver.Connection.Orleans.IoPoolSiloTeardown[0]
IoPoolSiloTeardown: pooled I/O did not finish within 00:00:30 — the silo is releasing over live work. A leaf ignored its cancellation token; fix the leaf, do not widen the budget. Did NOT report: Query=1 [System.Reactive.Linq.ObservableImpl.Using`2[[MeshWeaver.Mesh.QueryResultChange`1[[MeshWeaver.Mesh.MeshNode, MeshWeaver.Mesh.Contract, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null]], MeshWeaver.Mesh.Contract, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null],[MeshWeaver.Hosting.Persistence.Query.MeshQuery+QueryMembers, MeshWeaver.Hosting, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null]]].
This log site's previous ticket, https://github.com/Systemorph/MeshWeaver/issues/7049, was closed about a different fingerprint, and this fault fired after that close. It is left closed: an occurrence of this fingerprint is no evidence that the fault it was closed for came back. This issue now tracks the log site, and later fingerprints of it fold in here.
Opened automatically from Admin/_LogIncident/6e502415adcf0ae7. Recurrences are folded into this issue rather than opening new ones.
It also stands for the whole log site 4806d28cbbe5e043: other fingerprints of this site fold in here as comments rather than opening tickets of their own.
- Lingua principale
- C#
- Stelle
- 12
- Fork
- 5
- Merge medio
- 5h 37m
- PR unite (30g)
- 959
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di Systemorph/MeshWeaver
-
bug ci-template-feed sev:M
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
Systemorph/MeshWeaver#7660 ·
I maintainer di solito rispondono entro 1 giorno
-
chore ci-artifact-store-miss sev:M
Difficoltà 4/5 3-5 giorni Idoneità per principianti 44/100
Systemorph/MeshWeaver#7656 ·
I maintainer di solito rispondono entro 1 giorno
-
bug sev:H
Difficoltà 4/5 1-2 giorni Idoneità per principianti 25/100
Systemorph/MeshWeaver#7654 ·
I maintainer di solito rispondono entro 1 giorno
-
GitSync: an Ignore pattern added after the first import leaves the imported nodes in place, and on a one-way Space nobody can remove themForse già presa @rbuergi l’ha presa oggi. Apertaenhancement feature:gitsync-ownership feature:node-delete sev:M
Difficoltà 5/5 Più di una settimana Idoneità per principianti 35/100
Systemorph/MeshWeaver#7611 ·
I maintainer di solito rispondono entro 1 giorno
-
bug sev:B
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
Systemorph/MeshWeaver#7598 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di Systemorph/MeshWeaver
Issue simili
-
bug effort:S P3
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
nightscout/nocturne#3093 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 67/100
I maintainer di solito rispondono entro 3 giorni
-
Add 'upm' tag on githubAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 85/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100