Skip to content

RecycleCascade tears down hubs before deferred SubscribeRequests are drained, discarding accepted work #5117

Closed as duplicate

Description

@systemorph-com

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

  1. rbuergi commented on Sep 21, 2026

    @rbuergi
    Contributor

    Closes as duplicate of #4888.

    Reason: same defect — MeshWeaver.Messaging.MessageService discards work it has already accepted when that work is still parked behind a hub's DataContextInit/MeshNodeInit gates at teardown, answering the sender ShuttingDown instead 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), a RecycleCascade from a NodeType, an overlay self-heal DisposeRequest, a stale-build convergence self-recycle (Modules:AutoRecycleOnStaleBuild=true), and a direct Dispose() 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. Fingerprint 657ae482de37. Nothing new beyond #5110.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions