Skip to content

Silo 5j9gx marked Dead by peers 26s after its last heartbeat and terminated itself — recurrence of the false-positive membership kill (#3053) #6432

Closed

Description

@systemorph

What is failing

An Orleans silo in memex-portal-deployment (Silo_b7daa, 10.244.6.128:11111:150624604, pod memex-portal-deployment-85587f8869-5j9gx) found itself Dead in the membership table during a Refresh pass and honoured the verdict by terminating itself (MembershipTableManager.KillMyselfLocally → FatalErrorHandler.OnFatalException; Exception: null and the Environment.get_StackTrace() frame confirm an intentional process stop, not a crash). The entry shows IAmAliveTime=08:29:36.513 against SuspectTimes=08:29:10.921 — the silo was still alive and heartbeating ~26 seconds after the votes that declared it dead. This is the same false-positive membership kill already triaged and filed as #3053 (and #3052) on 2026-09-02; this is a recurrence, not a new defect shape.

Probable cause — moderate-to-high confidence, same as #3053

The suspicion votes were cast from a stale/shared liveness snapshot, most likely during rolling-deploy churn: the pod's StartTime is 08:10:04 GMT, so the replica set was only ~20 minutes old when the kill fired — a deploy window. Two markers from the entry support the stale-suspect theory rather than a genuine crash:

  • All three SuspectTimes are identical to the millisecond (08:29:10.921), and one suspecter (10.244.17.58:11111:150624528) appears twice with the same timestamp — one snapshot, not three independent probe failures. (Identical pattern to the Sept 2 incident.)
  • The suspect votes predate the target's own live heartbeat by ~26 s; the target kept writing IAmAlive and only exited at 08:30:03, ~53 s after being declared dead.

The open question carried over from #3053: the membership adoption path does not appear to discount suspect votes that are older than the target's own live IAmAliveTime. This time the verdict was consumed in Refresh (Sept 2 was CleanupTableEntries), so both call sites route through CheckIfLocalSiloIsDead → KillMyselfLocally with the same stale-suspect exposure. The alternative benign explanation — a long GC/CPU stall on 5j9gx making a genuine suspicion correct-but-harsh — cannot be excluded from this fingerprint alone; check the pod's own logs for GC pause warnings and the restart reason before ruling.

Impact

One occurrence, one pod, self-terminated and rescheduled by Kubernetes; the cluster remained quorate. However, this is the third firing of this shape (2026-09-02 ×2, now 2026-10-10) — it appears to recur around deploys, and each false kill cascades reactivation of every grain and pod-hub the silo hosted plus in-flight delivery failures. Watch the fingerprint at the next rolling deploy; at this rate it is a recurring deploy-time nuisance, not an outage.

Where to look

Duplicate note: same component and symptom as #3053 / #3052 — this ticket documents a recurrence (new evidence, and a second call site: Refresh); a human may fold it into #3053 if that investigation is still open.


Evidence

Fingerprint 0803784e63467766
Category Orleans.Runtime.FatalErrorHandler
Severity Error
Namespace memex-cloud
Pods memex-portal-deployment-85587f8869-5j9gx
Occurrences 1
First seen 2026-10-10 08:30:03Z
Last seen 2026-10-10 08:30:03Z
Routing not determined — no configured route matches the category Orleans.Runtime.FatalErrorHandler. 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-10 08:30:03Z memex-portal-deployment-85587f8869-5j9gx fail: Orleans.Runtime.FatalErrorHandler[100002]
      Fatal error from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S10.244.6.128:11111:150624604 SiloName=Silo_b7daa Status=Dead HostName=memex-portal-deployment-85587f8869-5j9gx ProxyPort=30000 RoleName= UpdateZone=0 FaultZone=0 StartTime=2026-10-10 08:10:04.851 GMT IAmAliveTime=2026-10-10 08:29:36.513 GMT Suspecters=[S10.244.17.58:11111:150624528, S10.244.5.66:11111:150623330, S10.244.17.58:11111:150624528] SuspectTimes=[2026-10-10 08:29:10.921 GMT, 2026-10-10 08:29:10.921 GMT, 2026-10-10 08:29:10.921 GMT]].
FATAL EXCEPTION from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S10.244.6.128:11111:150624604 SiloName=Silo_b7daa Status=Dead HostName=memex-portal-deployment-85587f8869-5j9gx ProxyPort=30000 RoleName= UpdateZone=0 FaultZone=0 StartTime=2026-10-10 08:10:04.851 GMT IAmAliveTime=2026-10-10 08:29:36.513 GMT Suspecters=[S10.244.17.58:11111:150624528, S10.244.5.66:11111:150623330, S10.244.17.58:11111:150624528] SuspectTimes=[2026-10-10 08:29:10.921 GMT, 2026-10-10 08:29:10.921 GMT, 2026-10-10 08:29:10.921 GMT]].. Exception: null.\nCurrent stack:    at System.Environment.get_StackTrace()
   at Orleans.Runtime.FatalErrorHandler.OnFatalException(Object sender, String context, Exception exception) in /_/src/Orleans.Runtime/Core/FatalErrorHandler.cs:line 32
   at Orleans.Runtime.MembershipService.MembershipTableManager.KillMyselfLocally(String reason) in /_/src/Orleans.Runtime/MembershipService/MembershipTableManager.cs:line 708
   at Orleans.Runtime.MembershipService.MembershipTableManager.CheckIfLocalSiloIsDead(String caller) in /_/src/Orleans.Runtime/MembershipService/Membershi…[truncated]

Opened automatically from Admin/_LogIncident/0803784e63467766. Recurrences are folded into this issue rather than opening new ones.
It also stands for the whole log site dfcbe511c74e943b: other fingerprints of this site fold in here as comments rather than opening tickets of their own.

Activity

  1. added
    bugSomething isn't working
    sev:MMedium - secondary path broken, or easy workaround
    on Oct 10, 2026
  2. systemorph commented on Oct 10, 2026

    @systemorph
    ContributorAuthor

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site dfcbe511c74e943b (Orleans.Runtime.FatalErrorHandler), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint 7d0e78f12afcb333
    Log site dfcbe511c74e943b
    Category Orleans.Runtime.FatalErrorHandler
    Severity Error
    Detail Fatal error from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S1{n}.{n}:{n}:{n} SiloName=Silo_1{n}a4{n} Status=Dead HostName=memex-portal-deployment-{hex}-gvt4n ProxyPort={n} RoleName= UpdateZone={n} FaultZone={n} StartTime={time} GMT IAmAliveTime={time} GMT Suspecters=[S1{n}.{n}:{n}:{n}, S1{n}.{n}:{n}:{n}, S1{n}.{n}:{n}:{n}] SuspectTimes=[{time} GMT, {time} GMT, {time} GMT]].
    Namespace memex-cloud
    Pods memex-portal-deployment-8c87bbfc-gvt4n
    Occurrences 1
    First seen 2026-10-10 08:54:10Z
    Last seen 2026-10-10 08:54:10Z
    Already folded here 1 fingerprint(s)
    Incident Admin/_LogIncident/7d0e78f12afcb333
    Triage called it Fourth false-positive membership kill: silo gvt4n voted Dead 2.7s before its own live heartbeat and self-terminated — recurrence of #3053/#6432
    What triage wrote about this fingerprint

    What is failing

    An Orleans silo in memex-portal-deployment (Silo_15a49, 10.244.6.161:11111:150626359, pod memex-portal-deployment-8c87bbfc-gvt4n) found itself Dead in the membership table during a Refresh pass and honoured the verdict by terminating itself (MembershipTableManager.CheckIfLocalSiloIsDead → KillMyselfLocally → FatalErrorHandler.OnFatalException). The entry shows IAmAliveTime=08:54:05.220 against SuspectTimes=08:54:02.455 — the silo wrote a fresh heartbeat ~2.7 seconds after the votes that declared it dead, so it was alive and heartbeating when killed. This is a recurrence of the false-positive membership kill already filed as #3053, #6432 and #6396 — fourth firing of the same shape, second within 24 minutes this morning.

    Probable cause — moderate-to-high confidence, same as #3053/#6432

    The suspicion votes were cast from a stale/shared liveness snapshot during rolling-deploy churn, not from a genuine crash:

    The benign alternative — a GC/CPU stall on the pod making a genuine suspicion correct-but-harsh — cannot be excluded from this fingerprint alone; check the pod's own GC/resource logs around 08:54:02 before ruling.

    Impact

    Single occurrence, single pod; it self-terminated and was rescheduled by Kubernetes, and the cluster stayed quorate (three suspecting peers were live). But the family is escalating: 2026-09-02 (×2), 2026-10-09 20:44 (#6396), 2026-10-10 08:30 (#6432), and now 2026-10-10 08:54 — two healthy silos killed within 24 minutes, both on young pods during apparent roll-churn. Each false kill cascades grain reactivation and in-flight call failures, so a rolling deploy can lose healthy replicas faster than it gains them. Worth watching at the next deploy; still no outage evidenced.

    Where to look

    Duplicate note: same component and symptom as #3053 / #6432 / #6396 — this is the FatalErrorHandler-category companion of this morning's second firing, filed so the recurrence rate (now twice in 24 minutes during deploy churn) is on record; a human may fold it into #6432 if that investigation is still open.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-10-10 08:54:10Z
    • Pods: memex-portal-deployment-8c87bbfc-gvt4n
    Recent log lines
    2026-10-10 08:54:10Z memex-portal-deployment-8c87bbfc-gvt4n fail: Orleans.Runtime.FatalErrorHandler[100002]
          Fatal error from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S10.244.6.161:11111:150626359 SiloName=Silo_15a49 Status=Dead HostName=memex-portal-deployment-8c87bbfc-gvt4n ProxyPort=30000 RoleName= UpdateZone=0 FaultZone=0 StartTime=2026-10-10 08:39:19.943 GMT IAmAliveTime=2026-10-10 08:54:05.220 GMT Suspecters=[S10.244.3.116:11111:150625935, S10.244.2.30:11111:150626278, S10.244.3.116:11111:150625935] SuspectTimes=[2026-10-10 08:54:02.455 GMT, 2026-10-10 08:54:02.455 GMT, 2026-10-10 08:54:02.455 GMT]].
    FATAL EXCEPTION from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S10.244.6.161:11111:150626359 SiloName=Silo_15a49 Status=Dead HostName=memex-portal-deployment-8c87bbfc-gvt4n ProxyPort=30000 RoleName= UpdateZone=0 FaultZone=0 StartTime=2026-10-10 08:39:19.943 GMT IAmAliveTime=2026-10-10 08:54:05.220 GMT Suspecters=[S10.244.3.116:11111:150625935, S10.244.2.30:11111:150626278, S10.244.3.116:11111:150625935] SuspectTimes=[2026-10-10 08:54:02.455 GMT, 2026-10-10 08:54:02.455 GMT, 2026-10-10 08:54:02.455 GMT]].. Exception: null.\nCurrent stack:    at System.Environment.get_StackTrace()
       at Orleans.Runtime.FatalErrorHandler.OnFatalException(Object sender, String context, Exception exception) in /_/src/Orleans.Runtime/Core/FatalErrorHandler.cs:line 32
       at Orleans.Runtime.MembershipService.MembershipTableManager.KillMyselfLocally(String reason) in /_/src/Orleans.Runtime/MembershipService/MembershipTableManager.cs:line 708
       at Orleans.Runtime.MembershipService.MembershipTableManager.CheckIfLocalSiloIsDead(String caller) in /_/src/Orleans.Runtime/MembershipService/MembershipTab…[truncated]
    
  3. rbuergi commented on Oct 10, 2026

    @rbuergi
    Contributor

    The killed silos were wedged inside the process from their first seconds, and three of three show the same boot fingerprint

    I read both 2026-10-10 kills (5j9gx at 08:30:03, gvt4n at 08:54:10) and the 2026-10-09 kill on memex (hrdhq, #6395) with governed Logs actions on the control instance. All reads were read-only. Each action records its LogQL, window and line count under Ops/Actions/w11a-*.

    1. A boot fingerprint that only the doomed pods have

    Every pod later voted dead had its first locally hosted grain call time out about 30 s after boot. Every healthy new pod in the same rolls did not.

    roll pod silo start first unanswered call later voted dead
    memex-cloud 10-10 85587f8869-5j9gx 08:10:04 08:10:38: sys.client/hosted-10.244.6.128 → messagehub/Agent/_Activity/import-manifest on the same silo (S10.244.6.128) yes, 08:30
    memex-cloud 10-10 8c87bbfc-gvt4n 08:39:19 08:39:53, same call, same shape yes, 08:54
    memex 10-09 5f6b9fc9b-hrdhq 20:35:58 20:36:31, same call, same shape yes, 20:44
    memex-cloud 10-10 85587f8869-prgnp, 8c87bbfc-zjzll (booted in the window) 08:08:5x / 08:38:0x none: Doc/_Activity/import-manifest was created within 3 s no

    On the doomed pods the first minute reads the same way each time. GetMeshNode('Agent/_Activity/import-manifest') timed out after 10.0s … Target: NO LOCAL HUB … it never activated here. The platform-startup CreateNode reports "post-creation handlers had not finished within 30s". The static-repo import fails for Agent, Provider, Harness, Skill and Doc in turn.

    2. The process was not starved. Its threads were being consumed.

    [LIVENESS] lines (w11a-5j9gx-liveness, negative control w11a-prgnp-liveness):

    pod time poolThreads poolPending work items completed per 10 s
    5j9gx (doomed) 08:10:40 20 0
    5j9gx 08:11:15 24 0 +4 569
    5j9gx 08:20:05 44 4 +4 104
    5j9gx 08:26:15 55 0 +534
    prgnp (healthy, same roll) 08:18:50 16 0 +47 188

    The heartbeat gap stays at exactly 10.00 s and GC is flat (gen0 +0 per tick for minutes). Neither a GC pause nor a thread-pool stall shows up, which matches the #6395 reading of LocalSiloHealthMonitor. But the thread count climbs steadily from 20 to 55 while almost no work completes. That is threads blocking one at a time and never coming back: the pool injects a replacement each time queued work waits behind a blocked one. A healthy silo in the same roll runs on 16 threads at about 90 times the throughput.

    3. Why "alive but answering nothing" lasted 8 to 20 minutes before eviction

    In Orleans 10.4.0, SiloConnection answers a membership ping inside the connection's own receive loop (HandlePingMessage). It never touches MessageCenter.ReceiveMessage, the catalog or the scheduler. Every other message goes through MessageCenter.ReceiveMessage, which runs synchronously on that receive loop and calls catalog.GetOrCreateActivation, where the grain is constructed. So a silo whose activation or dispatch path blocks keeps passing probes on every connection whose loop has not yet hit a blocking message. It stops answering them only as more loops get stuck. That fits:

    This revises the #6395 reading. #6395 read the hrdhq evidence as "a broken outbound/response path from this one pod". The thread-count trend and the connection-level ping path point inside the process instead. The pods are also on different nodes: hrdhq on vmss000028, which hosted the healthy prgnp on 10-10, and 5j9gx and gvt4n on vmss00002b. Neither silo IP appears in memex-cloud logs in the 4 h before its pod started (w11a-ip-reuse-6128b, w11a-ip-reuse-6161: 0 lines), so IP reuse is unlikely, though another namespace on the cluster was not read.

    The membership verdict was correct. The silo was not serving and had to go. Tolerance changes would only keep a wedged member in the table longer (see #6428 and the #6395 finding).

    What I did NOT establish

    • Which call blocks. The logs cannot show a blocked thread's stack. The instrument is the heap dump: KillMyselfLocally → FatalErrorHandler → Environment.FailFast writes one under the chart's crashDumps.root. Doc/Architecture/ReadingASiloEviction records exactly that for the 2026-09-02 kill (signo 6). So dumps for 5j9gx (08:30:03Z) and gvt4n (08:54:10Z) should exist on memex-cloud's dump claim, within crashDumps.keep / maxAgeDays. Reading them needs cluster access. There is no governed Dump InstanceAction, so this needs a maintainer: dotnet-dump analyze → clrstack -all, syncblk, dumpasync. Look for receive-loop threads (SiloConnection / MessageCenter.ReceiveMessage) or activation threads parked on one lock or one Wait.
    • Why only some new pods hit it. Two of the three doomed pods were the second new pod of their roll, started about 70 s after the first (5j9gx 08:10:04 after prgnp about 08:08:56; gvt4n 08:39:19 after zjzll about 08:38:06). That is a pattern, not a cause.
    • No code change from this read. Changing probe tolerance or adding a watchdog would be a band-aid over a blocking call that has not been identified yet.

    w11a, Claude Opus 5.5 (agent session). Read-only.

  4. added a commit that references this issue on Oct 10, 2026
  5. systemorph commented on Oct 10, 2026

    @systemorph
    ContributorAuthor

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site dfcbe511c74e943b (Orleans.Runtime.FatalErrorHandler), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint 072c056959395f0f
    Log site dfcbe511c74e943b
    Category Orleans.Runtime.FatalErrorHandler
    Severity Error
    Detail Fatal error from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S1{n}.{n}:{n}:{n} SiloName=Silo_fbe7{n} Status=Dead HostName=memex-portal-deployment-{hex}-ltlwc ProxyPort={n} RoleName= UpdateZone={n} FaultZone={n} StartTime={time} GMT IAmAliveTime={time} GMT Suspecters=[S1{n}.{n}:{n}:{n}, S1{n}.{n}:{n}:{n}, S1{n}.{n}:{n}:{n}] SuspectTimes=[{time} GMT, {time} GMT, {time} GMT]].
    Namespace memex-cloud
    Pods memex-portal-deployment-5499f76b76-ltlwc
    Occurrences 1
    First seen 2026-10-10 18:16:16Z
    Last seen 2026-10-10 18:16:16Z
    Already folded here 2 fingerprint(s)
    Incident Admin/_LogIncident/072c056959395f0f
    Triage called it Healthy memex-portal silo falsely voted dead and self-terminates — third false-positive death today
    What triage wrote about this fingerprint

    What is failing

    A live Orleans silo in the memex-portal-deployment cluster (pod memex-portal-deployment-5499f76b76-ltlwc, silo Silo_fbe75, started 18:10:16 GMT) was voted Dead by two peer silos (3 votes, all at 18:16:16) and honored the verdict by self-terminating via MembershipTableManager.KillMyselfLocally → FatalErrorHandler. The silo's last IAmAlive heartbeat (18:15:51) is only 25 seconds behind the votes, and the pod had been running normally for six minutes — a false-positive death declaration, not a genuine crash.

    Probable cause — medium confidence

    Same defect as GitHub issue #6396 (see prior incidents Admin/_LogIncident/89dfb3b5f652b720 and Admin/_LogIncident/8138820952f88f8e, both filed against it): the peer suspicion protocol (2 distinct silo votes) fired because the target missed direct probes while its table heartbeats continued — the usual signature of transient pod stall (CPU/threadpool starvation, GC pause) or node-level network hiccup. The wider cluster was in a heavy timeout/churn burst in the same window (see the concurrent TimeoutException/RoutingGrain incidents at 18:15–18:17), so load-induced probe misses are the likely trigger. Precise per-event stall cause needs pod resource metrics.

    Impact

    This is now the third false death today (08:30 GMT ffab13afba632f6c, 08:54 GMT 8138820952f88f8e, 18:16 GMT this one) and at least the fifth overall — the recurrence has gone from roughly monthly to three in ten hours on the primary portal deployment. Each event kills a healthy pod, fails in-flight grain calls transiently, and triggers a Kubernetes restart, amplifying the very churn that causes the next kill. Intermittent user-visible failure on a primary path, trending toward continuous flapping.

    Where to look

    • Orleans.Runtime.MembershipService.MembershipTableManager — CheckIfLocalSiloIsDead / KillMyselfLocally (MembershipTableManager.cs, ~line 708) and the peer-side ClusterHealthMonitor vote path on the suspecting silos.
    • Pod resource/GC metrics for …5499f76b76-ltlwc and its two suspecters around 18:16 GMT.
    • ClusterMembershipOptions probe-timeout / NumVotesForDeathDeclaration tuning for memex-portal-deployment — with five occurrences, that is the better first move than chasing per-event stalls.

    Duplicate note: same defect as #6396 — file this; a human can fold it in seconds, or use the accelerating recurrence (3 in one day) to bump #6396's priority. Companion log site for the same event: Admin/_LogIncident/282031c4ad913223.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-10-10 18:16:16Z
    • Pods: memex-portal-deployment-5499f76b76-ltlwc
    Recent log lines
    2026-10-10 18:16:16Z memex-portal-deployment-5499f76b76-ltlwc fail: Orleans.Runtime.FatalErrorHandler[100002]
          Fatal error from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S10.244.3.126:11111:150660616 SiloName=Silo_fbe75 Status=Dead HostName=memex-portal-deployment-5499f76b76-ltlwc ProxyPort=30000 RoleName= UpdateZone=0 FaultZone=0 StartTime=2026-10-10 18:10:16.965 GMT IAmAliveTime=2026-10-10 18:15:51.761 GMT Suspecters=[S10.244.6.78:11111:150660527, S10.244.17.78:11111:150659335, S10.244.6.78:11111:150660527] SuspectTimes=[2026-10-10 18:16:16.142 GMT, 2026-10-10 18:16:16.142 GMT, 2026-10-10 18:16:16.142 GMT]].
    FATAL EXCEPTION from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S10.244.3.126:11111:150660616 SiloName=Silo_fbe75 Status=Dead HostName=memex-portal-deployment-5499f76b76-ltlwc ProxyPort=30000 RoleName= UpdateZone=0 FaultZone=0 StartTime=2026-10-10 18:10:16.965 GMT IAmAliveTime=2026-10-10 18:15:51.761 GMT Suspecters=[S10.244.6.78:11111:150660527, S10.244.17.78:11111:150659335, S10.244.6.78:11111:150660527] SuspectTimes=[2026-10-10 18:16:16.142 GMT, 2026-10-10 18:16:16.142 GMT, 2026-10-10 18:16:16.142 GMT]].. Exception: null.\nCurrent stack:    at System.Environment.get_StackTrace()
       at Orleans.Runtime.FatalErrorHandler.OnFatalException(Object sender, String context, Exception exception) in /_/src/Orleans.Runtime/Core/FatalErrorHandler.cs:line 32
       at Orleans.Runtime.MembershipService.MembershipTableManager.KillMyselfLocally(String reason) in /_/src/Orleans.Runtime/MembershipService/MembershipTableManager.cs:line 708
       at Orleans.Runtime.MembershipService.MembershipTableManager.CheckIfLocalSiloIsDead(String caller) in /_/src/Orleans.Runtime/MembershipService/MembershipT…[truncated]
    
  6. systemorph commented on Oct 11, 2026

    @systemorph
    ContributorAuthor

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site dfcbe511c74e943b (Orleans.Runtime.FatalErrorHandler), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint a6563ca005d514ed
    Log site dfcbe511c74e943b
    Category Orleans.Runtime.FatalErrorHandler
    Severity Error
    Detail Fatal error from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S1{n}.{n}:{n}:{n} SiloName=Silo_5{n} Status=Dead HostName=memex-portal-deployment-{hex}-hdlgz ProxyPort={n} RoleName= UpdateZone={n} FaultZone={n} StartTime={time} GMT IAmAliveTime={time} GMT Suspecters=[S1{n}.{n}:{n}:{n}, S1{n}.{n}:{n}:{n}, S1{n}.{n}:{n}:{n}] SuspectTimes=[{time} GMT, {time} GMT, {time} GMT]].
    Namespace memex
    Pods memex-portal-deployment-6749fbfc59-hdlgz
    Occurrences 1
    First seen 2026-10-11 04:14:15Z
    Last seen 2026-10-11 04:14:15Z
    Already folded here 3 fingerprint(s)
    Incident Admin/_LogIncident/a6563ca005d514ed
    Triage called it Memex portal silo voted dead by Orleans cluster while its heartbeats were current
    What triage wrote about this fingerprint

    What is failing

    An Orleans silo in the memex portal deployment (Silo_56225, pod memex-portal-deployment-6749fbfc59-hdlgz) was marked Dead in the membership table by three suspicion votes from sibling silos, discovered its own dead status during the periodic membership Refresh, and terminated itself via KillMyselfLocally — the standard Orleans self-kill path, working as designed once the table said Dead. The defect is upstream of that: the silo was voted dead while it was demonstrably alive and heartbeating.

    Probable cause — moderate confidence

    The log's own numbers make a genuine silo hang unlikely: the local entry's IAmAliveTime is 04:13:45.634 GMT, i.e. the silo successfully refreshed its heartbeat ~1.5 s after the three SuspectTimes at 04:13:44.121 GMT. So the suspicion votes raced ahead of the silo's live IAmAlive table writes rather than following a missed-heartbeat timeout. This points at a membership-freshness problem between the suspectors and the membership table: either (a) the membership-table backend briefly served stale data / latency spikes so suspectors saw an old IAmAliveTime and voted, or (b) the suspicion was raised from a transient network partition that healed too late for the votes to be retracted. Note also that one suspector (S10.244.6.197:11111:150693988) appears twice in the Suspecters list — the same silo suspecting twice in one entry suggests the suspect table wasn't cleaned between rounds, which is consistent with view-staleness. I cannot confirm which of the two from a single log line; the silo had only been up ~21 min (StartTime 03:53:18 GMT) when it died, which also fits a startup-window race. Cause unclear beyond that; evidence points at the suspect/IAmAlive freshness path, not at the dead silo itself.

    Impact

    One occurrence, one pod, at 04:14:15 UTC on 2026-10-11. The pod terminated and the cluster's usual silo-death handling applies ( Orleans reassigns; K8s restarts the pod), so impact was at most a brief availability dip on that silo. If this repeats across pods it is an intermittent user-visible failure and should be re-rated.

    Where to look

    • Orleans.Runtime.MembershipService.MembershipTableManager — Refresh / CheckIfLocalSiloIsDead (the self-kill site, /_/src/Orleans.Runtime/MembershipService/MembershipTableManager.cs in the Orleans repo) and the suspect-table cleanup path.
    • Orleans.Runtime.MembershipService.SiloHealthMonitor / the suspector side: compare each suspector's cached IAmAliveTime for the dead silo at 04:13:44 against what the table held at that time.
    • Cluster config of the memex portal deployment: ClusterMembershipOptions (NumMissedIAmAliveLimit, IAmAliveTableRefreshTimeout, DeathNotificationExpiration) and the membership-table backend's latency/error logs around 04:13–04:14 UTC.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-10-11 04:14:15Z
    • Pods: memex-portal-deployment-6749fbfc59-hdlgz
    Recent log lines
    2026-10-11 04:14:15Z memex-portal-deployment-6749fbfc59-hdlgz fail: Orleans.Runtime.FatalErrorHandler[100002]
          Fatal error from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S10.244.2.70:11111:150695598 SiloName=Silo_56225 Status=Dead HostName=memex-portal-deployment-6749fbfc59-hdlgz ProxyPort=30000 RoleName= UpdateZone=0 FaultZone=0 StartTime=2026-10-11 03:53:18.419 GMT IAmAliveTime=2026-10-11 04:13:45.634 GMT Suspecters=[S10.244.6.197:11111:150693988, S10.244.3.147:11111:150695202, S10.244.6.197:11111:150693988] SuspectTimes=[2026-10-11 04:13:44.121 GMT, 2026-10-11 04:13:44.121 GMT, 2026-10-11 04:13:44.121 GMT]].
    FATAL EXCEPTION from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S10.244.2.70:11111:150695598 SiloName=Silo_56225 Status=Dead HostName=memex-portal-deployment-6749fbfc59-hdlgz ProxyPort=30000 RoleName= UpdateZone=0 FaultZone=0 StartTime=2026-10-11 03:53:18.419 GMT IAmAliveTime=2026-10-11 04:13:45.634 GMT Suspecters=[S10.244.6.197:11111:150693988, S10.244.3.147:11111:150695202, S10.244.6.197:11111:150693988] SuspectTimes=[2026-10-11 04:13:44.121 GMT, 2026-10-11 04:13:44.121 GMT, 2026-10-11 04:13:44.121 GMT]].. Exception: null.\nCurrent stack:    at System.Environment.get_StackTrace()
       at Orleans.Runtime.FatalErrorHandler.OnFatalException(Object sender, String context, Exception exception) in /_/src/Orleans.Runtime/Core/FatalErrorHandler.cs:line 32
       at Orleans.Runtime.MembershipService.MembershipTableManager.KillMyselfLocally(String reason) in /_/src/Orleans.Runtime/MembershipService/MembershipTableManager.cs:line 708
       at Orleans.Runtime.MembershipService.MembershipTableManager.CheckIfLocalSiloIsDead(String caller) in /_/src/Orleans.Runtime/MembershipService/Membershi…[truncated]
    
  7. rbuergi commented on Oct 11, 2026

    @rbuergi
    Contributor

    The dump has been read: one container lock held for the life of the process, and Orleans' own probe path queued behind it

    Ops/Actions/analyzedump-memex-cloud-20261011-ltlwc-2 on the control instance completed at 08:02Z (page: Ops/Dumps/analyzedump-memex-cloud-20261011-ltlwc-2). It read the FailFast dump of 5499f76b76-ltlwc (evicted 2026-10-10 18:16Z): 91 managed threads, thread pool 35 workers / 30 running / CPU 0 %. Read-only.

    What it establishes

    1. Two monitors are held, and no other (syncblk):

      index owner (OS thread) MonitorHeld waiting
      2 0x1e (managed 13, one of the first pool workers) 43 21
      169 0xf1 (managed 71) 9 4
    2. Every waiting thread shown is in the same frame: Monitor.Enter under Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance. That is the lock a container scope holds while it constructs one of its single-instance services. It is one lock per scope, not one per service. Index 2 is a System.Object allocated in the process's first moments, so it is the root container's.

    3. The owner of fix(hosting): idle-release for read streams — stop the sync-stream heartbeat leak #169 is itself one of those waiters. Thread 0xf1 is inside a constructor-injected resolve (ReflectionActivator → AutowiringParameter → SharingMiddleware → CreateSharedInstance → Monitor.Enter): it holds one scope's lock while it constructs a service, and waits for another scope's lock for that service's constructor argument.

    4. The waiters are the whole process, including Orleans' message path:

      A silo that cannot construct the codec for a probe response cannot answer the probe. That is why its peers' probes timed out with no connection error, why sys.svc.canceler calls to it went unanswered (Grain-call cancellation delivery times out against departing silos — cancellation batches not propagated during silo lifecycle events #6392), and why IAmAlive kept being written: that path had been constructed before the lock was taken.

    So the question in this issue's title has an answer. The silo was not healthy and the verdict was correct: its root container's single-instance lock was held for the whole life of the process, and everything not resolved before that moment waited on it. No probe timeout, vote count or table clock is involved, and none of them should change.

    What it does NOT establish, and why

    What thread 0x1e was doing. Its stack is not in the read. The condensation kept "the 40 largest" of 86 groups, but nothing grouped (every frame carried its own stack address, so 91 threads made 86 stacks), groups of one were kept newest thread first, and the thread that took the lock at boot is the oldest. So the one stack that explains the lock was among the 46 "cut to fit". Each kept stack also showed only its top 25 frames, which for a waiter is the container; the caller is at the bottom.

    Two readings fit what is shown, and the owner's stack separates them:

    I did not pick one and did not change product code on a guess.

    What I changed

    PR #6484 repairs the read (deploy/aks/operator/bin/hosting-dump-analyze): a thread syncblk names as a monitor's owner is always shown, first, with its whole stack and a first line naming the monitor and its waiters; frames are compared without their own address and source path, so parked threads group; a capped stack keeps its top and its bottom frames. The operator test pins it with this incident's shape (an old owner thread with a deep stack, 30 waiters, 300 unrelated threads) and a negative control (no owner named in syncblk → the same thread is cut again).

    Next reading (one action, read-only)

    The lane takes the operator scripts from core main, so once that PR is merged, on the control instance:

    { "requestedAction": "AnalyzeDump", "dumpFile": "memex-portal-deployment-5499f76b76-ltlwc.1791656185/coredump.1.1791656179" }

    against Deployments/memex-cloud. The first group of the result is thread 0x1e's stack: its top frame says what it waits in, its bottom frames say which service it was constructing. The two 2026-10-10 morning dumps (8c87bbfc-gvt4n.1791622458/coredump.1.1791622453, 85587f8869-5j9gx.1791621012/coredump.1.1791621006) were still on the volume at 08:02Z and would say whether it is the same pair every time. They are subject to the chart's dump retention, so read them soon.

    The reading is conserved in Doc/Architecture/ReadingASiloEviction ("What the first dump said") in the same PR.

    Same cause, confirmed from the bodies and comments: #6395 (memex, 2026-10-09: same boot fingerprint, 85 of 85 lines on the evicted pod) is this defect; I am closing it as a duplicate of this issue. #6391 (the stalled creates) and #6392 (unanswered cancellation calls) are this lock seen from two of its waiters. Not the same cause: #5300, #2906 and #5336, which predate module containers; their readings are on those issues.

    w21, Claude Opus 5.5 (agent session).

  8. rbuergi commented on Oct 11, 2026

    @rbuergi
    Contributor

    The dump is read: the wedged silo is a convoy on the DI container's shared-instance lock

    Source: Ops/Actions/analyzedump-memex-cloud-20261011-ltlwc-2 on the control instance (governed AnalyzeDump, dump of 5499f76b76-ltlwc written 2026-10-10 18:16:20Z, the third kill of that day). I read it while working the symptoms that fold into this issue (#6429, #6392, #5704, #5731).

    What the dump shows

    • Thread pool: 35 workers, 30 "running", CPU 0 %. They are blocked, not busy. That matches the thread-count climb in the comment above.
    • syncblk lists two held monitors:
      • index 2 (System.Object), MonitorHeld 43: one owner and 21 waiters. Owner is OS thread 0x1e (managed id 13, a thread-pool worker).
      • index 169 (System.Object), MonitorHeld 9: one owner and 4 waiters. Owner is OS thread 0xf1.
    • Thread 0xf1 owns index 169 and is itself waiting in Monitor.Enter under Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance, reached from a constructor-parameter resolve (AutowiringParameter → BoundConstructor.Instantiate). Read together: a shared instance is mid-construction on that thread, holding one scope's lock while it waits for index 2. The frame that took index 169 is below the 25-frame cap, so that reading is an inference.
    • Of the 45 threads whose stacks the report shows, 16 are parked at the same place: Monitor.Enter_Slowpath called from Autofac.Core.Lifetime.LifetimeScope.CreateSharedInstance. That is the lock Autofac takes to create a shared (singleton or per-scope) instance. Who is asking:
    threads caller
    6 OrleansGeneratedCodeHelper.GetService from CodecProvider.TryCreateCodec, from MessageSerializer.Write in Connection.ProcessOutgoing. The codec is for an IGrainCallCancellationManagerSystemTarget invokable.
    3 MeshExtensions.BuildPostCreationHandlers (GetRequiredService)
    2 MessageHubGrain.ResolveHubConfigurationObservable (GetService), inside OnActivateAsync
    1 MeshNodeStreamHandle.UpdateRemote (GetService)
    1 MeshNodeStreamCache constructor's handler (GetService)
    1 ProviderCredentialSeed.RunOver (GetService), from StaticRepoImportSettled.MarkSettled
    2 no application frame inside the 25-frame cap

    What that explains

    What I did NOT establish

    • What thread 0x1e is doing. It owns the lock everyone waits for, and it is not among the stacks in the report: the analyser prints 40 of 86 stack groups, capped at 25 frames. Its stack is the answer to this issue. It is a singleton factory or constructor that does not return, and since the process never recovers, it is most likely waiting on something that itself needs the container (a blocking wait on work that resolves a service on another thread).
    • Whether index 2 is the root scope's lock. 0xf1 waiting for it while holding another scope's lock, and the fact that process-wide callers all queue on it point that way, but the report does not name the object's owner.
    • Whether the other two dumps on the volume (5j9gx 08:30:07Z, gvt4n 08:54:13Z) show the same owner frame. The listing shows both are there.

    Next step, one read: clrstack for OS thread 0x1e in this dump (setthread to managed id 13 first), and the same question of the other two dumps. AnalyzeDump needs either a per-thread option or the lock owners' stacks printed whatever the group cap, since the owner of a contended monitor is the one stack that always matters.

    Readings taken today for the symptom issues, each a governed Logs action on the control instance, 72 h windows ending 2026-10-11 11:15Z:

    site memex-cloud memex inside a wedge window
    silo told it is dead (w21b-churn-{cloud,memex}-dead-72h) 3 kills: 10-10 08:30, 08:54, 18:16 2 kills: 10-09 20:44, 10-11 04:14 defines the windows
    GrainCallCancellationManager errors (…-cancel-72h) 131 lines 92 lines all of them; the wedged pod is the largest emitter each time
    Message expired before placement (…-placement-72h) 10 lines 0 the 7 I inspected are all 10-10 18:11:16–17Z, one minute into ltlwc's life (started 18:10:16Z)
    stream attach give-up (…-attach-72h) 2 lines (08:15:52, 08:24:47) 0 both target the rendezvous grain on 5j9gx

    wave 21, Claude Opus 5.5 (agent session). Read-only on the deployment.

  9. rbuergi commented on Oct 11, 2026

    @rbuergi
    Contributor

    The lock owner's stack is read. Fix: #6536 (auto-merge armed)

    Source: Ops/Actions/analyzedump-memex-cloud-20261011-ltlwc-3 on the control instance. It is the same dump (5499f76b76-ltlwc, 2026-10-10 18:16Z), read by an operator at core 9bcc344d46, which includes #6484. Read-only. The two owners are printed first and whole (124 and 160 frames).

    thread holds waits for path (frames, innermost last)
    0x1e #2, the root container's lock (21 waiters) #169 Host.StartAsync → ApplicationLifetime.NotifyStarted → MeshWeaver.WhatsApp.WhatsAppReplySender.Begin() → GetRequiredService on a scope of the WhatsApp module's own container → ModuleFallbackSource stand-in → root CreateSharedInstance (takes #2) → PortalApplication..ctor → GetRequiredService → CreateSharedInstance (waits)
    0xf1 #169 (4 waiters) #2 Orleans ActivationData → MessageHubGrain.DeliverMessage → OnActivateAsync → ResolveHubConfigurationObservable → meshHub.ServiceProvider.GetService<IMeshNodeHubFactory> → CreateSharedInstance (takes #169) → AutowiringParameter → CreateSharedInstance (waits)

    PortalApplication's constructor calls hub.ServiceProvider.GetRequiredService<ILayoutClient>(), and hub.ServiceProvider is the mesh hub's scope. So #169 is the mesh hub scope's lock. The inversion is between the root and the mesh hub's scope, not a module container.

    Root cause. PortalApplication is a SCOPED registration. Since #6127 a module's services live in a container of their own, and its fallback resolved every root registration with rootScope.ResolveComponent(...), which is the root scope itself. A scoped service asked for from a module scope was therefore built in the root, under the root's lock, and shared there for the life of the process. Its constructor then reaches into a child scope, the opposite order to the grain activation. Before #6127, rootServices.CreateScope() in the reply sender was a root child scope, and the same call built it under that child scope's lock. That is why the first wedge of this shape came two days after #6127.

    Fix (#6536). The fallback now resolves each root registration in a root child scope owned by the asking module scope and disposed with it. A singleton is still the root's one instance. A scoped service belongs to that scope and is never built under the root lock. AScopedRootServiceIsNeverBuiltInTheRootTest forces this dump's two threads to overlap with real containers:

    • it is red on the code before the fix (deadlock, and a scoped instance shared by two module scopes);
    • it is green after the fix;
    • a negative control that builds the scoped service in the root still deadlocks.

    The three GC-collection swap tests stay green in Release.

    Not this incident, recorded: a root singleton whose construction calls a module's service, racing a module singleton that needs a root singleton, deadlocks the same way. I reproduced it with real containers. No dump shows it. It is noted on Doc/Architecture/ReadingASiloEviction.

    Verification after it rolls: no silo told it is dead kill and no post-creation-handlers: resolving line on memex / memex-cloud after a boot on the new image. The 2026-10-10 morning dumps (gvt4n, 5j9gx) were not read. Read them if the shape recurs on the new image.

    Claude Opus 5.5 (agent session). Read-only on the deployment.

  10. systemorph commented on Oct 11, 2026

    @systemorph
    ContributorAuthor

    Folded in — a DIFFERENT fingerprint from the same log site.

    This issue tracks the log site dfcbe511c74e943b (Orleans.Runtime.FatalErrorHandler), and these occurrences belong to it. They carry their own fingerprint — the masking split one site across several — so before this they would have opened a SEPARATE ticket. One log site fanned out into 46 of those, which is why they fold here instead. Nothing is discarded: the distinguishing evidence is below, and splitting this back out is a person's call.

    Folded fingerprint f839a2b034e6f3c6
    Log site dfcbe511c74e943b
    Category Orleans.Runtime.FatalErrorHandler
    Severity Error
    Detail Fatal error from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S1{n}.{n}:{n}:{n} SiloName=Silo_8e2b1 Status=Dead HostName=memex-portal-deployment-{hex}-{n}wxb ProxyPort={n} RoleName= UpdateZone={n} FaultZone={n} StartTime={time} GMT IAmAliveTime={time} GMT Suspecters=[S1{n}.{n}:{n}:{n}, S1{n}.{n}:{n}:{n}, S1{n}.{n}:{n}:{n}] SuspectTimes=[{time} GMT, {time} GMT, {time} GMT]].
    Namespace memex-cloud
    Pods memex-portal-deployment-5b769df8cb-89wxb
    Occurrences 1
    First seen 2026-10-11 22:14:12Z
    Last seen 2026-10-11 22:14:12Z
    Already folded here 4 fingerprint(s)
    Incident Admin/_LogIncident/f839a2b034e6f3c6
    Triage called it MembershipTableManager terminated a live portal silo: peer suspicion votes predate the silo's own current IAmAliveTime
    What triage wrote about this fingerprint

    Observed

    An Orleans silo in the memex-cloud portal deployment terminated itself via Orleans.Runtime.MembershipService.MembershipTableManager.CheckIfLocalSiloIsDead("Refresh") → KillMyselfLocally → FatalErrorHandler.OnFatalException (path from the logged stack: /_/src/Orleans.Runtime/MembershipService/MembershipTableManager.cs:line 708, /_/src/Orleans.Runtime/Core/FatalErrorHandler.cs:line 32). The membership table listed the silo as Status=Dead, so MembershipTableManager stopped the silo cleanly: "I have been told I am dead, so this silo will stop!".

    The suspicious detail is the ordering of the timestamps in the same log line:

    • Silo Silo_8e2b1 (SiloAddress=S10.244.3.4:11111:150760535, pod memex-portal-deployment-5b769df8cb-89wxb), started 2026-10-11 21:55:35 GMT.
    • Three suspicion votes, all with the identical SuspectTime 2026-10-11 22:13:35.828 GMT, from two distinct peers: S10.244.5.214:11111:150760299 (twice) and S10.244.2.125:11111:150760414.
    • The silo's own IAmAliveTime is 2026-10-11 22:13:45.040 GMT — about 9 seconds after every suspicion vote.

    So while the peers had already voted this silo dead, the silo was still alive and successfully writing its heartbeat to the membership table. It then discovered its own death in the next membership Refresh (22:14:12) and killed itself.

    Where and when

    One occurrence, one pod, namespace memex-cloud, at 2026-10-11 22:14:12 UTC — roughly 19 minutes after the silo started. Whether the pod was restarted by the platform afterwards, and whether the replacement silo joined cleanly, is not visible from this incident.

    Impact

    One silo was terminated mid-flight; any grains (and in-flight requests) hosted on it were lost to their failover. Given a single occurrence on a single pod, this reads as a brief, self-recovering disruption rather than an outage — but the evidence pattern (a live, heartbeating silo voted dead) indicates the cluster's failure detection disagreed with the silo's own liveness, and each repetition costs a pod restart.

    Not established

    • The cause. The incident carries the silo's death record, not the peers' reason for suspecting it.
    • Why all three SuspectTimes are identical (22:13:35.828): whether that is one gossip/probe round that failed simultaneously, or an artifact of how suspicion timestamps are recorded — not determined.
    • Whether this is transient (a one-off network blip) or a recurring membership/failure-detection problem — first and only sighting of this fingerprint.
    • Whether other log sites on the same or neighbouring pods show the matching probe failures — not checked here.
    • The Orleans runtime source was not readable in this mesh partition, so the code references above are taken verbatim from the logged stack trace, not from a source read.

    Candidate causes and the reading that separates them

    1. One-sided network failure — the peers could not reach S10.244.3.4:11111 to probe it, while the silo could still write IAmAlive to the membership table. Predicts probe-timeout or connection-failure warnings in the logs of S10.244.5.214 and S10.244.2.125 at ~22:13:35 GMT. Reading the two suspecting pods' logs around that instant would confirm or refute this directly.
    2. The silo was genuinely unresponsive to inter-silo traffic (e.g. a long GC pause or CPU saturation) even though its heartbeat writer thread kept running. Predicts pause/saturation evidence in the dead pod's own runtime logs or resource metrics between 21:55 and 22:14. The silo's own log before the fatal error would separate this from (1).
    3. Suspicion propagation from a single degraded probe round — all votes carrying the same SuspectTime is consistent with one failed round being gossip-shared rather than three independent observations; if so, one probe failure was enough to kill a healthy silo. The membership table's write history for Silo_8e2b1 (who wrote each status transition, and when) would show whether the three votes were independent or derived.

    Where to look

    • Orleans.Runtime.MembershipService.MembershipTableManager — CheckIfLocalSiloIsDead (called from the membership Refresh) and KillMyselfLocally (/_/src/Orleans.Runtime/MembershipService/MembershipTableManager.cs:line 708), and Orleans.Runtime.FatalErrorHandler.OnFatalException (/_/src/Orleans.Runtime/Core/FatalErrorHandler.cs:line 32), all as named in the logged stack.
    • The membership table / cluster events for silo Silo_8e2b1 around 22:13:35–22:14:12 GMT, and the logs of the suspecting pods (S10.244.5.214:11111:150760299, S10.244.2.125:11111:150760414) for their side of the same window.

    Severity is my judgement from a single occurrence with a self-recovering blast radius (one pod, one restart); a human should re-rule it if this fingerprint recurs or if the suspecting pods show a wider probe-failure pattern.

    Still occurring: 1 more since the last update (1 total).

    • Last seen: 2026-10-11 22:14:12Z
    • Pods: memex-portal-deployment-5b769df8cb-89wxb
    Recent log lines
    2026-10-11 22:14:12Z memex-portal-deployment-5b769df8cb-89wxb fail: Orleans.Runtime.FatalErrorHandler[100002]
          Fatal error from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S10.244.3.4:11111:150760535 SiloName=Silo_8e2b1 Status=Dead HostName=memex-portal-deployment-5b769df8cb-89wxb ProxyPort=30000 RoleName= UpdateZone=0 FaultZone=0 StartTime=2026-10-11 21:55:35.249 GMT IAmAliveTime=2026-10-11 22:13:45.040 GMT Suspecters=[S10.244.5.214:11111:150760299, S10.244.2.125:11111:150760414, S10.244.5.214:11111:150760299] SuspectTimes=[2026-10-11 22:13:35.828 GMT, 2026-10-11 22:13:35.828 GMT, 2026-10-11 22:13:35.828 GMT]].
    FATAL EXCEPTION from Orleans.Runtime.MembershipService.MembershipTableManager. Context: I have been told I am dead, so this silo will stop! Reason: I should be Dead according to the membership table (in Refresh). Local entry: [SiloAddress=S10.244.3.4:11111:150760535 SiloName=Silo_8e2b1 Status=Dead HostName=memex-portal-deployment-5b769df8cb-89wxb ProxyPort=30000 RoleName= UpdateZone=0 FaultZone=0 StartTime=2026-10-11 21:55:35.249 GMT IAmAliveTime=2026-10-11 22:13:45.040 GMT Suspecters=[S10.244.5.214:11111:150760299, S10.244.2.125:11111:150760414, S10.244.5.214:11111:150760299] SuspectTimes=[2026-10-11 22:13:35.828 GMT, 2026-10-11 22:13:35.828 GMT, 2026-10-11 22:13:35.828 GMT]].. Exception: null.\nCurrent stack:    at System.Environment.get_StackTrace()
       at Orleans.Runtime.FatalErrorHandler.OnFatalException(Object sender, String context, Exception exception) in /_/src/Orleans.Runtime/Core/FatalErrorHandler.cs:line 32
       at Orleans.Runtime.MembershipService.MembershipTableManager.KillMyselfLocally(String reason) in /_/src/Orleans.Runtime/MembershipService/MembershipTableManager.cs:line 708
       at Orleans.Runtime.MembershipService.MembershipTableManager.CheckIfLocalSiloIsDead(String caller) in /_/src/Orleans.Runtime/MembershipService/MembershipT…[truncated]
    
  11. rbuergi commented on Oct 13, 2026

    @rbuergi
    Contributor

    Closing: the dump's root cause is fixed and deployed, and the kill has not recurred since.

    #6463 (diagnostics only: a cancelled grain call NACKed in Orleans' own words) stays a draft, separate from this. If the membership kill folds in again on a pod at or after ec7763883b, this reopens with that pod's dump.

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 workingsev:MMedium - secondary path broken, or easy workaround

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions