Repository navigation
ThreadChatView times out subscribing to ThreadComposer hub for user session #1175
Description
What is failing
ThreadChatView.LoadComposerInArea (in MeshWeaver.Blazor.Portal.Chat) sends a SubscribeRequest to the target hub {user}/_Thread/ThreadComposer but receives no response within the 60-second timeout. The operation is abandoned with System.TimeoutException.
Probable cause
The target hub (rsalzmann/_Thread/ThreadComposer) either was never activated, was recycled before the subscription completed, or was running on a grain silo that became unreachable. The exception's own hint — "The request may have been undeliverable or the target hub was not found" — matches the profile of a stale hub reference or a hub lifetime issue. Confidence: moderate. The evidence is consistent but thin (4 samples from one pod over 7 minutes). A single-user transient rather than a code-level defect is equally plausible.
Impact
Low. 4 occurrences over 7 minutes, all on one pod, affecting one user (rsalzmann). The user's composer view likely failed to load during that window; the user may have retried or moved away. No wider blast radius.
Where to look
- File:
MeshWeaver.Blazor.Portal.Chat.ThreadChatView— specifically the method that logs"Loading the composer in Area {area}"and issues the subscribe to theThreadComposerhub. - Related: The hub-cache resolution logic that resolves
rsalzmann/_Thread/ThreadComposer— does it gracefully handle a missing/unregistered hub, or does it hang until timeout? - Reproduction hint: Trigger the "Area Composer" view for a user whose
_Thread/ThreadComposerhub is not already active.
Evidence
| Fingerprint | fd5ff53bb957891a |
| Category | MeshWeaver.Blazor.Portal.Chat.ThreadChatView |
| Severity | Error |
| Exception | System.TimeoutException |
| Namespace | memex-cloud |
| Pods | memex-portal-deployment-6bd9c46f8b-z9t6r |
| Occurrences | 4 |
| First seen | 2026-08-10 14:13:34Z |
| Last seen | 2026-08-10 14:20:09Z |
Recent log lines
2026-08-10 14:13:34Z memex-portal-deployment-6bd9c46f8b-z9t6r fail: MeshWeaver.Blazor.Portal.Chat.ThreadChatView[0]
Loading the composer in Area Composer
System.TimeoutException: No response received in hub cache/dKYDeuYSr0S2599Ec4uZ8g within 00:01:00 for request SubscribeRequest (id=TcjWzjKBZ0iClJGHPAXzjw) → target rsalzmann/_Thread/ThreadComposer. The request may have been undeliverable or the target hub was not found.
2026-08-10 14:15:01Z memex-portal-deployment-6bd9c46f8b-z9t6r fail: MeshWeaver.Blazor.Portal.Chat.ThreadChatView[0]
Loading the composer in Area Composer
System.TimeoutException: No response received in hub cache/dKYDeuYSr0S2599Ec4uZ8g within 00:01:00 for request SubscribeRequest (id=TcjWzjKBZ0iClJGHPAXzjw) → target rsalzmann/_Thread/ThreadComposer. The request may have been undeliverable or the target hub was not found.
2026-08-10 14:19:54Z memex-portal-deployment-6bd9c46f8b-z9t6r fail: MeshWeaver.Blazor.Portal.Chat.ThreadChatView[0]
Loading the composer in Area Composer
System.TimeoutException: No response received in hub cache/dKYDeuYSr0S2599Ec4uZ8g within 00:01:00 for request SubscribeRequest (id=TcjWzjKBZ0iClJGHPAXzjw) → target rsalzmann/_Thread/ThreadComposer. The request may have been undeliverable or the target hub was not found.
2026-08-10 14:20:09Z memex-portal-deployment-6bd9c46f8b-z9t6r fail: MeshWeaver.Blazor.Portal.Chat.ThreadChatView[0]
Loading the composer in Area Composer
System.TimeoutException: No response received in hub cache/dKYDeuYSr0S2599Ec4uZ8g within 00:01:00 for request SubscribeRequest (id=TcjWzjKBZ0iClJGHPAXzjw) → target rsalzmann/_Thread/ThreadComposer. The request may have been undeliverable or the target hub was not found.
Opened automatically from Admin/_LogIncident/fd5ff53bb957891a. Recurrences are folded into this issue rather than opening new ones.
Activity
rbuergi commentedon Aug 10, 2026
Triage verdict: not a new mechanism — two known layers, both already in flight (PR #1177 client-side, #1172 server-side).
Server side — why the subscribe timed out at that moment. Same window as #1174 (full timeline + live reconfirmation there). The 13:38:56Z self-update roll's pod
memex-portal-deployment-59479dc7d9-kmwvrjoined the Orleans cluster at ~13:39 but became Ready only at 15:59:37 (Ready.lastTransitionTime) — 2 h 20 min held in thenodetype_bakestartup gate while it reran the full dynamic-NodeType rebuild. All 4 occurrences (14:13:34 → 14:20:09, pod…6bd9c46f8b-z9t6r, userrsalzmann— the same user/pod/burst as #1174's 14:13–14:20 tail) lie inside that join-to-Ready window: thersalzmann/_Thread/ThreadComposerper-node-hub activation landed on the mid-bake silo, where #1172's route-slot exhaustion behind non-terminating_Activity/compiledispatches starves activations and deliveries, so the 60 s SubscribeRequest budget in the hub cache expired. Root cause of that starvation = #1172; exposure already cut ~44× by merged PR #1173 (these incidents predate its merge by ~3 h, under the old ~20-min roll cadence).Client side — the actual defect in
ThreadChatView, and it is already fixed in an open PR.ThreadChatView.OpenComposerProjection(andThreadSidePanelContent.OpenComposerObserver) never implemented the documentedMeshNodeStreamCache.IsTransientOwnerFailureretry contract that every layout area implements viaRetryAreaWithBackoff(AreaErrorClassifier.ShouldRetryArea)— the very first transient owner miss surfaced verbatim (this issue's "No response received in hub cache … SubscribeRequest" banner, whichAreaErrorClassifierTestalready pins as transient). That is exactly what open PR #1177 fixes: both composer readers get the same bounded, backoff-throttled retry as every layout area; a miss that survives the budget logs a Warning instead of popping a raw framework banner.Recommend: close via PR #1177 (adding
Fixes #1175to it fits — the composer-reader retry gap is this issue's actionable defect; the underlying activation starvation is #1172's, and the "hub-cache resolution … does it gracefully handle a missing hub or hang until timeout" question in Where to look is answered: it forwards the failure for the caller to retry by contract, and the composer readers were the callers that didn't).rbuergi commentedon Aug 10, 2026
Closing — fixed by PR #1177 (merged 21:11Z; the closing keyword was missing from its body, hence the manual close).
Two layers, per the triage on this thread: the client-side defect — ThreadComposer readers missing the documented transient-retry contract on a
ShuttingDownverdict — is what #1177 fixes. The server-side starvation that produced the transient in the first place (mid-bake silo saturating its 64 route-dispatch slots behind stalled_Activitycompiles) is tracked in #1172 with a fix in flight, and exposure is already reduced by the daily roll cadence (#1173). Evidence on this thread: every occurrence sat inside a roll's join-to-Ready bake window.Recurrences on an image containing #1177 + the #1172 fix would be a new fact — reopen then.
systemorph-com commentedon Sep 17, 2026
Reopened — this fault is happening again.
Still occurring: 52 more since the last update (56 total).
memex-portal-deployment-6bd9c46f8b-z9t6r,memex-portal-deployment-59479dc7d9-kmwvrRecent log lines
rbuergi commentedon Sep 18, 2026
Closing again — the fix this issue was closed on is still in the code today, and the two post-close samples came from a pod running the pre-fix image. Silent for 38 days.
Quiet. The reopen of 2026-09-17T07:52:35Z cites
Last seen: 2026-08-11 07:06:33Z— 38.0 days before today (2026-09-18). Ingest is live (the incident store was updating at 2026-09-18T05:42Z), so the silence is real.Still occurring: 52 morecompares accumulated totals since the last update; it is not a statement about now.The client-side defect is fixed and the fix is still present. This was closed on 2026-08-10T21:14:36Z on PR #1177 ("Composer load no longer surfaces a transient owner miss as a raw error", merged 2026-08-10T21:11:42Z). The composer views moved to
MeshWeaver.Pluginswith the AI/chat surface (#2276); checked there atorigin/mainefb2449dc3:OpenComposerProjectionimplements the documented transient-owner-failure retry contract, and its remarks name this exact banner ("No response received in hub … target hub was not found") as the transient it now rides out instead of surfacing.The server-side cause is also resolved. The starvation that produced the transient in the first place — mid-bake silo saturating its 64 route-dispatch slots behind stalled
_Activity/compiledispatches — was #1172, now closed as completed; exposure was additionally cut by the roll-cadence change in #1173.Why the post-close occurrences are not a regression. They land 2026-08-11 06:54:08Z and 07:06:33Z, both on pod
memex-portal-deployment-59479dc7d9-kmwvr. This issue's own triage on 2026-08-10 pins that pod to the 13:38:56Z roll of 2026-08-10, joining Orleans at ~13:39 and Ready at 15:59:37 — i.e. an image built hours before #1177 merged at 21:11Z. The recurrence is the pre-fix image still emitting, and it stopped there: nothing in 38 days.If this fault recurs, the recurrence bot reopens this issue with fresh evidence — that is the designed behaviour, and it is why closing a dormant incident is safe.