Repository navigation
Grain calls are dropped instead of retried when the Orleans directory is unstable during a rollout #2357
Description
What is failing
During silo membership changes, Orleans cannot resolve the target grain for in-flight calls and the message is dropped with OrleansException rather than retried. The affected targets are MeshWeaver's own hub grains (MeshWeaver.Connection.Orleans.IPodHubGrain.Deliver, MeshWeaver.Connection.Orleans.IMessageHubGrain.DeliverMessage) and the Orleans stream infrastructure the mesh runs on (IPubSubRendezvousGrain.RegisterProducer, IMemoryStreamQueueGrain.Enqueue/Dequeue).
Probable cause
Trigger: high confidence. Two distinct directory failures appear under one fingerprint, and both are membership-transition symptoms:
Silo S… is not owner of <grainId>, cannot forward LookUpAsync to owner S… because hop limit is reached— the local and owning silo disagree about directory ownership and the forward chain exhausts its hop limit.Current directory at S… is not stable to perform the lookup for grainId … (it maps to S…, which is not a valid silo). Retry later.— the directory still points at a silo that has left the cluster. Orleans itself labels this retryable.
Each burst carries different silo generations and originates from a different replicaset of memex-portal-deployment, which is what a rolling deployment looks like from inside the silo. So the trigger is not in doubt.
Defect: medium confidence. Orleans says "Retry later", but the call is surfaced as a failed delivery instead — nothing in the evidence shows the caller retrying. Two things are worth checking:
- Whether
IMessageHubGrain.DeliverMessage/IPodHubGrain.Delivertreat transient addressing failures as retryable, or let the delivery die. A droppedDeliverMessageis a silently lost mesh message. - Why the in-memory stream provider is in use in a multi-silo cloud deployment at all — the grain ids (
pubsubrendezvous/Memory/null/…,memorystreamqueue/…) show theMemoryprovider is configured inmemex-cloud. Memory streams are not intended for a clustered, rolling-deployed silo; their queue grains are exactly what is failing to address here. This may be the more valuable finding.
Impact
Low, but not benign. Volume is small and every burst is short-lived and self-clearing, confined to the seconds around a deployment — this is not an outage and needs no page. The concern is correctness, not volume: affected calls include mesh message delivery and stream producer registration, so a rollout can silently drop a hub message or leave a stream producer unregistered. Observed targets include user-facing streams (rbuergi/_UserActivity/rbuergi, messagehub/Store/Catalog, messagehub/LocalSyncDemo/_Sync/party-1).
Where to look
src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:38— appears in every trace, but only because it is the incoming call filter wrapping the invocation; it is the pipeline, not the fault site. Do not start by changing it.- The callers of
IMessageHubGrain.DeliverMessageandIPodHubGrain.DeliverinMeshWeaver.Connection.Orleans— is a transientOrleansExceptionfrom addressing retried, or does the delivery just fail? - The Orleans silo/stream configuration for the
memex-clouddeployment — theMemorystream provider registration, and whether it should be a persistent provider there.
Notes
No existing incident or issue for this component and symptom was found in the mesh, so this is not a known duplicate. MeshWeaver source is not indexed in this mesh, so the two code pointers above are derived from the stack frames and grain interface names in the log, not from reading the source.
Evidence
| Fingerprint | 830c48fa8c2283d1 |
| Category | Orleans.Messaging |
| Severity | Error |
| Exception | Orleans.Runtime.OrleansException |
| Top frame | MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) |
| Namespace | memex-cloud |
| Pods | memex-portal-deployment-7d6b864b54-w4xnl, memex-portal-deployment-558d86bb48-vl44h |
| Occurrences | 16 |
| First seen | 2026-08-23 19:29:01Z |
| Last seen | 2026-08-26 10:02:23Z |
Recent log lines
2026-08-23 19:29:12Z memex-portal-deployment-7d6b864b54-w4xnl fail: Orleans.Messaging[100071]
Failed to address message Request [S10.244.4.87:11111:146498551 sys.svc.stream.agent/10.244.4.87:11111@146498551+Memory_4_memory-7-0xE0000007]->[ pubsubrendezvous/Memory/null/rbuergi/_UserActivity/rbuergi] Orleans.Streams.IPubSubRendezvousGrain.RegisterProducer(Orleans.Runtime.QualifiedStreamId, Orleans.Runtime.GrainId) #708EA2136C0E80FD
Orleans.Runtime.OrleansException: Silo S10.244.4.87:11111:146498551 is not owner of pubsubrendezvous/Memory/null/rbuergi/_UserActivity/rbuergi, cannot forward LookUpAsync to owner S10.244.3.44:11111:146515001 because hop limit is reached
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 849
at Orleans.Runtime.TaskRequest`1.Invoke() in /_/src/Orleans.Core.Abstractions/Runtime/GrainReference.cs:line 714
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 133
at MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) in /home/runner/work/MeshWeaver/MeshWeaver/src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:line 38
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 95
at Orleans.Runtime.InsideRuntimeClient.Invoke(IGrainContext target, Message message) in /_/src/Orleans.Runtime/Core/InsideRuntimeClient.cs:line 318
--- End of stack trace from previous location ---
at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 894
at Or…[truncated]
2026-08-23 19:29:12Z memex-portal-deployment-7d6b864b54-w4xnl fail: Orleans.Messaging[100071]
Failed to address message Request [S10.244.4.87:11111:146498551 sys.client/hosted-10.244.4.87:11111@146498551]->[ memorystreamqueue/be8eb06fb48875590300006003000000] Orleans.Providers.IMemoryStreamQueueGrain.Enqueue(Orleans.Providers.MemoryMessageData) #708EA2136C0E8134
Orleans.Runtime.OrleansException: Silo S10.244.4.87:11111:146498551 is not owner of memorystreamqueue/be8eb06fb48875590300006003000000, cannot forward LookUpAsync to owner S10.244.3.44:11111:146515001 because hop limit is reached
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 849
at Orleans.Runtime.TaskRequest`1.Invoke() in /_/src/Orleans.Core.Abstractions/Runtime/GrainReference.cs:line 714
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 133
at MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) in /home/runner/work/MeshWeaver/MeshWeaver/src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:line 38
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 95
at Orleans.Runtime.InsideRuntimeClient.Invoke(IGrainContext target, Message message) in /_/src/Orleans.Runtime/Core/InsideRuntimeClient.cs:line 318
--- End of stack trace from previous location ---
at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 894
at Orleans.Runtime.TaskRequest`1.CompleteInvokeAsync(Task`1 resultTask) in /_/src/…[truncated]
2026-08-23 19:29:14Z memex-portal-deployment-7d6b864b54-w4xnl fail: Orleans.Messaging[100071]
Failed to address message Request [S10.244.4.87:11111:146498551 sys.client/hosted-10.244.4.87:11111@146498551]->[ messagehub/LocalSyncDemo/_Sync/party-1] MeshWeaver.Connection.Orleans.IMessageHubGrain.DeliverMessage(MeshWeaver.Messaging.IMessageDelivery) #708EA2136C0E8182
Orleans.Runtime.OrleansException: Silo S10.244.4.87:11111:146498551 is not owner of messagehub/LocalSyncDemo/_Sync/party-1, cannot forward LookUpAsync to owner S10.244.3.44:11111:146515001 because hop limit is reached
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 849
at Orleans.Runtime.TaskRequest`1.Invoke() in /_/src/Orleans.Core.Abstractions/Runtime/GrainReference.cs:line 714
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 133
at MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) in /home/runner/work/MeshWeaver/MeshWeaver/src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:line 38
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 95
at Orleans.Runtime.InsideRuntimeClient.Invoke(IGrainContext target, Message message) in /_/src/Orleans.Runtime/Core/InsideRuntimeClient.cs:line 318
--- End of stack trace from previous location ---
at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 894
at Orleans.Runtime.TaskRequest`1.CompleteInvokeAsync(Task`1 resultTask) in /_/src/Orleans.Co…[truncated]
2026-08-23 19:29:28Z memex-portal-deployment-7d6b864b54-w4xnl fail: Orleans.Messaging[100071]
Failed to address message Request [S10.244.4.87:11111:146498551 sys.svc.stream.agent/10.244.4.87:11111@146498551+Memory_3_memory-6-0xC0000006]->[ pubsubrendezvous/Memory/null/Admin/Build] Orleans.Streams.IPubSubRendezvousGrain.RegisterProducer(Orleans.Runtime.QualifiedStreamId, Orleans.Runtime.GrainId) #708EA2136C0E9AA0
Orleans.Runtime.OrleansException: Silo S10.244.4.87:11111:146498551 is not owner of pubsubrendezvous/Memory/null/Admin/Build, cannot forward LookUpAsync to owner S10.244.3.44:11111:146515001 because hop limit is reached
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 849
at Orleans.Runtime.TaskRequest`1.Invoke() in /_/src/Orleans.Core.Abstractions/Runtime/GrainReference.cs:line 714
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 133
at MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) in /home/runner/work/MeshWeaver/MeshWeaver/src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:line 38
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 95
at Orleans.Runtime.InsideRuntimeClient.Invoke(IGrainContext target, Message message) in /_/src/Orleans.Runtime/Core/InsideRuntimeClient.cs:line 318
--- End of stack trace from previous location ---
at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 894
at Orleans.Runtime.TaskRequest`1.Complete…[truncated]
2026-08-23 19:29:31Z memex-portal-deployment-7d6b864b54-w4xnl fail: Orleans.Messaging[100071]
Failed to address message Request [S10.244.4.87:11111:146498551 sys.client/hosted-10.244.4.87:11111@146498551]->[ messagehub/Store/Catalog] MeshWeaver.Connection.Orleans.IMessageHubGrain.DeliverMessage(MeshWeaver.Messaging.IMessageDelivery) #708EA2136C0E9B68
Orleans.Runtime.OrleansException: Silo S10.244.4.87:11111:146498551 is not owner of messagehub/Store/Catalog, cannot forward LookUpAsync to owner S10.244.3.44:11111:146515001 because hop limit is reached
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 849
at Orleans.Runtime.TaskRequest`1.Invoke() in /_/src/Orleans.Core.Abstractions/Runtime/GrainReference.cs:line 714
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 133
at MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) in /home/runner/work/MeshWeaver/MeshWeaver/src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:line 38
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 95
at Orleans.Runtime.InsideRuntimeClient.Invoke(IGrainContext target, Message message) in /_/src/Orleans.Runtime/Core/InsideRuntimeClient.cs:line 318
--- End of stack trace from previous location ---
at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 894
at Orleans.Runtime.TaskRequest`1.CompleteInvokeAsync(Task`1 resultTask) in /_/src/Orleans.Core.Abstractions/Runtime/Grai…[truncated]
2026-08-23 19:29:37Z memex-portal-deployment-7d6b864b54-w4xnl fail: Orleans.Messaging[100071]
Failed to address message Request [S10.244.4.87:11111:146498551 sys.svc.stream.agent/10.244.4.87:11111@146498551+Memory_4_memory-7-0xE0000007]->[ pubsubrendezvous/Memory/null/rbuergi/_UserActivity/rbuergi] Orleans.Streams.IPubSubRendezvousGrain.RegisterProducer(Orleans.Runtime.QualifiedStreamId, Orleans.Runtime.GrainId) #708EA2136C0E996B
Orleans.Runtime.OrleansException: Silo S10.244.4.87:11111:146498551 is not owner of pubsubrendezvous/Memory/null/rbuergi/_UserActivity/rbuergi, cannot forward LookUpAsync to owner S10.244.3.44:11111:146515001 because hop limit is reached
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 849
at Orleans.Runtime.TaskRequest`1.Invoke() in /_/src/Orleans.Core.Abstractions/Runtime/GrainReference.cs:line 714
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 133
at MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) in /home/runner/work/MeshWeaver/MeshWeaver/src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:line 38
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 95
at Orleans.Runtime.InsideRuntimeClient.Invoke(IGrainContext target, Message message) in /_/src/Orleans.Runtime/Core/InsideRuntimeClient.cs:line 318
--- End of stack trace from previous location ---
at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 894
at Or…[truncated]
2026-08-23 19:29:43Z memex-portal-deployment-7d6b864b54-w4xnl fail: Orleans.Messaging[100071]
Failed to address message Request [S10.244.4.87:11111:146498551 sys.svc.stream.agent/10.244.4.87:11111@146498551+Memory_3_memory-6-0xC0000006]->[ pubsubrendezvous/Memory/null/Admin/Build] Orleans.Streams.IPubSubRendezvousGrain.RegisterProducer(Orleans.Runtime.QualifiedStreamId, Orleans.Runtime.GrainId) #708EA2136C0E9754
Orleans.Runtime.OrleansException: Silo S10.244.4.87:11111:146498551 is not owner of pubsubrendezvous/Memory/null/Admin/Build, cannot forward LookUpAsync to owner S10.244.3.44:11111:146515001 because hop limit is reached
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 849
at Orleans.Runtime.TaskRequest`1.Invoke() in /_/src/Orleans.Core.Abstractions/Runtime/GrainReference.cs:line 714
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 133
at MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) in /home/runner/work/MeshWeaver/MeshWeaver/src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:line 38
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 95
at Orleans.Runtime.InsideRuntimeClient.Invoke(IGrainContext target, Message message) in /_/src/Orleans.Runtime/Core/InsideRuntimeClient.cs:line 318
--- End of stack trace from previous location ---
at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 894
at Orleans.Runtime.TaskRequest`1.Complete…[truncated]
2026-08-23 19:29:45Z memex-portal-deployment-7d6b864b54-w4xnl fail: Orleans.Messaging[100071]
Failed to address message Request [S10.244.4.87:11111:146498551 sys.client/hosted-10.244.4.87:11111@146498551]->[ messagehub/LocalSyncDemo/_Sync/party-1] MeshWeaver.Connection.Orleans.IMessageHubGrain.DeliverMessage(MeshWeaver.Messaging.IMessageDelivery) #708EA2136C0E9438
Orleans.Runtime.OrleansException: Silo S10.244.4.87:11111:146498551 is not owner of messagehub/LocalSyncDemo/_Sync/party-1, cannot forward LookUpAsync to owner S10.244.3.44:11111:146515001 because hop limit is reached
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 849
at Orleans.Runtime.TaskRequest`1.Invoke() in /_/src/Orleans.Core.Abstractions/Runtime/GrainReference.cs:line 714
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 133
at MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) in /home/runner/work/MeshWeaver/MeshWeaver/src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:line 38
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 95
at Orleans.Runtime.InsideRuntimeClient.Invoke(IGrainContext target, Message message) in /_/src/Orleans.Runtime/Core/InsideRuntimeClient.cs:line 318
--- End of stack trace from previous location ---
at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 894
at Orleans.Runtime.TaskRequest`1.CompleteInvokeAsync(Task`1 resultTask) in /_/src/Orleans.Co…[truncated]
2026-08-26 10:02:23Z memex-portal-deployment-558d86bb48-vl44h fail: Orleans.Messaging[100071]
Failed to address message Request [S10.244.2.53:11111:146743336 sys.svc.stream.agent/10.244.2.53:11111@146743336+Memory_2_memory-1-0x20000001]->[ memorystreamqueue/be8eb06fb48875590100002001000000] Orleans.Providers.IMemoryStreamQueueGrain.Dequeue(System.Int32) #1639EA7A86E2AC70[ForwardCount=1]
Orleans.Runtime.OrleansException: Current directory at S10.244.4.102:11111:146743316 is not stable to perform the lookup for grainId memorystreamqueue/be8eb06fb48875590100002001000000 (it maps to S10.244.2.241:11111:146743301, which is not a valid silo). Retry later.
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 890
at Orleans.Runtime.TaskRequest`1.Invoke() in /_/src/Orleans.Core.Abstractions/Runtime/GrainReference.cs:line 714
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 133
at MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) in /home/runner/work/MeshWeaver/MeshWeaver/src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:line 38
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 95
at Orleans.Runtime.InsideRuntimeClient.Invoke(IGrainContext target, Message message) in /_/src/Orleans.Runtime/Core/InsideRuntimeClient.cs:line 318
--- End of stack trace from previous location ---
at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 894
at Orleans.Runtime.…[truncated]
2026-08-26 10:02:23Z memex-portal-deployment-558d86bb48-vl44h fail: Orleans.Messaging[100071]
Failed to address message Request [S10.244.2.53:11111:146743336 sys.svc.stream.agent/10.244.2.53:11111@146743336+Memory_3_memory-3-0x60000003]->[ memorystreamqueue/be8eb06fb48875590300006003000000] Orleans.Providers.IMemoryStreamQueueGrain.Dequeue(System.Int32) #1639EA7A86E2AC71[ForwardCount=1]
Orleans.Runtime.OrleansException: Current directory at S10.244.4.102:11111:146743316 is not stable to perform the lookup for grainId memorystreamqueue/be8eb06fb48875590300006003000000 (it maps to S10.244.2.241:11111:146743301, which is not a valid silo). Retry later.
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 890
at Orleans.Runtime.TaskRequest`1.Invoke() in /_/src/Orleans.Core.Abstractions/Runtime/GrainReference.cs:line 714
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 133
at MeshWeaver.Hosting.Orleans.AccessContextGrainCallFilter.Invoke(IIncomingGrainCallContext context) in /home/runner/work/MeshWeaver/MeshWeaver/src/MeshWeaver.Hosting.Orleans/AccessContextGrainCallFilter.cs:line 38
at Orleans.Runtime.GrainMethodInvoker.Invoke() in /_/src/Orleans.Core/Core/GrainMethodInvoker.cs:line 95
at Orleans.Runtime.InsideRuntimeClient.Invoke(IGrainContext target, Message message) in /_/src/Orleans.Runtime/Core/InsideRuntimeClient.cs:line 318
--- End of stack trace from previous location ---
at System.Threading.Tasks.ValueTask`1.ValueTaskSourceAsTask.<>c.<.cctor>b__4_0(Object state)
--- End of stack trace from previous location ---
at Orleans.Runtime.GrainDirectory.LocalGrainDirectory.LookupAsync(GrainId grainId, Int32 hopCount) in /_/src/Orleans.Runtime/GrainDirectory/LocalGrainDirectory.cs:line 894
at Orleans.Runtime.…[truncated]
Opened automatically from Admin/_LogIncident/830c48fa8c2283d1. Recurrences are folded into this issue rather than opening new ones.
Activity
rbuergi commentedon Aug 26, 2026
Narrowed against
origin/main. #2314 (merged today, 07:22Z) fixes an adjacent class, not this one — and half of this issue's evidence is outside any MeshWeaver retry path entirely.The four call sites split into two groups
Group A — MeshWeaver's own grains (
IMessageHubGrain.DeliverMessage,IPodHubGrain.Deliver), routed throughRoutingGrain.RoutingGrain.IsTransientFailure(src/MeshWeaver.Hosting.Orleans/RoutingGrain.cs:1076) is the sole retry gate for both:This issue's stack traces name the exception type explicitly:
Orleans.Runtime.OrleansException— the base type, notOrleansMessageRejectionException— thrown directly out ofLocalGrainDirectory.LookupAsync("cannot forward LookUpAsync … because hop limit is reached", "not stable to perform the lookup … Retry later"). Patternis OrleansMessageRejectionExceptiondoes not match a plainOrleansExceptioninstance, soIsTransientFailurereturnsfalsefor exactly this failure shape — it propagates on the first attempt regardless of #2314.#2314 does not touch this. Its own PR body confirms the fix is scoped to
BuildPodHubRoutegaining the sameIsTransientFailure-gated retryBuildGrainRoutealready had — same classifier, same gap.Group B — Orleans-internal streaming grains (
IPubSubRendezvousGrain.RegisterProducer,IMemoryStreamQueueGrain.Enqueue/Dequeue).grep -rn "IPubSubRendezvousGrain\|IMemoryStreamQueueGrain" src/returns zero direct callers — these are invoked by Orleans' ownMemorystream provider machinery (sys.svc.stream.agent,sys.clientin the log's sender identity), entirely outsideRoutingGrain's retry path. No MeshWeaver-level fix can touch these without changing the stream provider itself.This is very likely the same root as #1742's still-open residual A
Group B's exception ("Current directory … not stable … it maps to S…, which is not a valid silo") is a
MemoryStreamQueueGrainlosing its directory entry during a silo departure mid-rollout — exactly the shape #1742's latest disposition (2026-08-25) scoped as residual A: "a message in flight can die with the silo hosting its queue grain during a roll." That comment already establishes the fix needs a second, durable-but-scoped stream provider and flagsMicrosoft.Orleans.Streaming.AdoNetas pre-release-only — a decision not yet made.Recommendation
Not a duplicate to close as such (different symptom text, and Group A's directory-lookup gap is a smaller, distinct fix from Group B), but the durable resolution for Group B is the same maintainer decision #1742 is already blocked on. Group A (
IsTransientFailurewidening to cover plainOrleansExceptionfrom a directory lookup, if that is judged safe/transient) is a small, separable fix that does not require that decision — worth splitting out if picked up.Leaving open; impact remains low-volume/self-clearing per the issue's own note.
rbuergi commentedon Aug 27, 2026
Defect item 1 is confirmed and fixed in #2518 — the calls really were dropped, and here is why nothing retried them
Your "medium confidence" question was exactly right, and the answer is no, they were not retried. The mechanism, from Orleans' own source:
Because the rejection carries its own exception, the caller never sees the wrapper.
RoutingGrain.IsTransientFailurematchedTimeoutExceptionandOrleansMessageRejectionException; what actually arrives is a bareOrleans.Runtime.OrleansException— the one your log shows, whose sibling variant literally ends "Retry later." (verified as a string literal in the pinned Orleans 10.2.2Orleans.Runtime.dll).So
DeliverToGrainObservablerethrew on the first attempt, and then both exception arms NACK'd the sender with a hard-coded terminalErrorType.Failed. That second half is the more expensive one:SynchronizationStream's resubscribe latch andMeshNodeStreamCache.IsTransientOwnerFailureride outShuttingDownand tear down onFailed— so a live mirror that would have resumed seconds after the handover was killed permanently. And whenPostFailure's own directed NACK hit the same unstable directory, it had no fallback at all and the sender was told nothing.#2518 fixes it as a classification change, not a new retry:
OrleansRoutingService.IsDirectoryUnstablemakes the existing bounded retry-with-fresh-resolve reachable,RoutingGrain.ClassifyDeliveryExceptionreplaces both terminal arms, andPostFailurefalls back to the stream on any failed directed NACK. The marker is pinned against the shipped Orleans assembly's string literals, so an Orleans upgrade that rewords the message fails RED rather than silently reverting the classifier to inert.Your item 2 is NOT covered, and it is a bigger call than it looks
"Why the in-memory stream provider is in use in a multi-silo cloud deployment at all" is the standing decision on #1742 — and worth knowing before anyone acts on it:
Microsoft.Orleans.Streaming.AdoNethas never shipped a stable version, so it is a decision to ship a pre-release package in the reply path, not a config change.Also worth recording against your framing: since the pod-hub transport swap, the memory stream is only the fallback for delivery to a pod-process hub (the roll window, and hubs owned by an Orleans client process, which cannot host a grain). The
pubsubrendezvous/…andmemorystreamqueue/…entries in your own evidence are that fallback plus Orleans' internal streaming, not the primary path. That shrinks item 2's blast radius considerably — see #1742 for the full reasoning.Leaving this open on item 2.
rbuergi commentedon Aug 27, 2026
The durable-stream-provider decision has been re-sized — please read before acting on it
#1742 was investigated today and the finding changes the scope of the pre-release
Microsoft.Orleans.Streaming.AdoNetdecision, which had been framed as "five tickets, one root".It is not. The primary reply path never goes near the stream provider — measured with the router's own trace (
MESHWEAVER_MSG_TRACE=1): a two-siloPingRequestissued onmesh/{id}returnedPOD_HUB_OKfor its reply leg, delivered by directed grain call and processed at the root hub. The durable provider improves only the fallback (queue-grain RAM, Orleans-client-hosted hubs).LogLineParsertruncation half is untouched. Also looks like a collision bucket sharing #2357's events.So size the provider decision on #2320 and #2322 alone.
What actually caused the silent drops
A classifier gap, not a transport one. The transport swap moved the reply leg onto Orleans' own grain directory — exactly what is unstable during a rolling deploy, which is the window every symptom was measured in.
From Orleans' source:
MessageCenter.OnAddressingFailure→RejectMessage(…, Unrecoverable, ex)with the directory's exception attached, andCallbackData.HandleRejectionResponseresolvesrejection?.Exception ?? new OrleansMessageRejectionException(…)— the carried one wins. The router therefore receives a bareOrleans.Runtime.OrleansExceptionwhose own text ends "Retry later." (confirmed as a literal in the pinned Orleans 10.2.2 dll), whileRoutingGrain.IsTransientFailurematched onlyTimeoutExceptionandOrleansMessageRejectionException.Three consequences chained from that one gap:
ErrorType.Failed, which makesSynchronizationStream's latch tear down;PostFailure's own directed NACK hit the same unstable directory and reachedLogUndeliverableNack— total silence.Prod evidence: 16 occurrences across two rolls.
Two stale premises corrected, in case they are load-bearing elsewhere
meshIS a stream-routed address type (MeshConfiguration.cs:68, since fix: /api/content hung ~50% of the time on multi-replica portals (#1729) #1736). The "mesh is not stream-routed — theOrleansCrossSiloReplyTestblack hole" framing is out of date.MessageHubGrain.DeliverMessageTCS candidate (aTaskCompletionSourcewhose completion appeared to depend onOnDeactivateAsync) is bounded —BuildActivationChain'sAmbtimer terminates_hubReadyRawat 30 s on every path except an enrichment that hangs unbounded, which is a separate compile-side concern.Not yet settled, and it gates closing #1742
mesh/{id}is the only stream-routed hub claimed from anIHostedServiceat host start, andAttachPodHubhas a ~3 s claim budget beside a stream subscription gated on 120 s of streaming readiness. A claim that fails to land degrades silently back to the stream. It does not reproduce in-process; #2518 adds the assertion that would catch it, and checking a live pod'sAttachPodHuboutcome is the honest next step.rbuergi commentedon Aug 29, 2026
Fixed by #2518 (
76a32acb0) — verified in the code onorigin/main, not from the PR titleDefect item 1a — the calls are retried.
src/MeshWeaver.Hosting.Orleans/RoutingGrain.cs:1376IsTransientFailurenow reaches the bareOrleansException, and names this issue in place:feeding the pre-existing retry-with-fresh-resolve loop.
Defect item 1b — the NACK is no longer hard-coded terminal.
RoutingGrain.cs:1422:so
SynchronizationStream's resubscribe latch rides the handover out instead of tearing down.Both of your reported phrases are pinned,
src/MeshWeaver.Connection.Orleans/OrleansRoutingService.cs:588-610:DirectoryRetryLaterMarker = "Retry later"DirectoryHopLimitMarker = "hop limit is reached"— documented as "the shape prod logged during two rolling deploys (issue Grain calls are dropped instead of retried when the Orleans directory is unstable during a rollout #2357)"with
AggregateException/InnerExceptionrecursion at:596-597.Pinned by tests (
test/MeshWeaver.Hosting.Orleans.Test/OrleansDirectoryInstabilityClassificationTest.cs)::108asserts the call is made 3 times and does not endFailed;:139an exhausted budget still NACKs transient;:92an ordinaryOrleansExceptionstays terminal (non-vacuity);:203RetryLaterMarker_IsStillTheShippedOrleansWordingre-reads the phrase out of the pinned Orleans assembly, so an upgrade turns the classifier red rather than silently inert.Defect item 2 is not orphaned — the "memory streams at all" question was deliberately re-scoped onto #2320 and #2322, both still open, per the 2026-08-27 sizing comment.
Not claimed: no post-fix production recurrence count was measured (the pre-fix evidence was 16 occurrences across two rolls). If the shape recurs, that is new evidence against a classifier that is otherwise demonstrably correct and guarded.
Closing.
systemorph-com commentedon Sep 17, 2026
Reopened — this fault is happening again.
Still occurring: 26 more since the last update (42 total).
memex-portal-deployment-7d6b864b54-w4xnl,memex-portal-deployment-558d86bb48-vl44h,memex-portal-deployment-9bf79b774-bwgqp,memex-portal-deployment-67dbc7bc9c-lswwx,memex-portal-deployment-9bf79b774-nvnzz,memex-portal-deployment-77cfc55bfc-q4f9r,memex-portal-deployment-77cfc55bfc-767mq,memex-portal-deployment-74bfcd8f6b-gkz48,memex-portal-deployment-74bfcd8f6b-sksm4,memex-portal-deployment-7456f8f447-lgtrrRecent log lines
rbuergi commentedon Sep 18, 2026
Re-closing — the classifier fix is on
mainand pinned by a test; the residual log line is Orleans' ownLast seen
2026-09-10 12:26:14Z(theLast seen:in the bot's own reopen comment, 2026-09-17T07:52:07Z) — quiet 7.7 days as of 2026-09-18T06:05Z, while ingest is live (incidents were still being updated 2026-09-18T05:42Z).Defect item 1 — "are these calls retried?" — is fixed in current
origin/main. Read, not taken from the PR title:IsDirectoryUnstable(:825) matches the bareOrleansExceptionon three markers, and both phrases this issue reported are among them:DirectoryHopLimitMarker = "hop limit is reached"(:848) — whose doc comment names this ticket: "the shape prod logged during two rolling deploys (issue Grain calls are dropped instead of retried when the Orleans directory is unstable during a rollout #2357)";DirectoryRetryLaterMarker = "Retry later"(:842);DirectoryInvalidSiloMarker = "on invalid silo"(:875, added later for the registration side).RoutingGrain.cs:1791reaches it fromClassifyDeliveryException("🚨 THE BARE OrleansException THE TYPE TEST ABOVE CANNOT SEE — issue #1742 / #2357"), so the existing retry-with-fresh-resolve inRoutingGrain.DeliverToGrainObservableis now actually entered. Pinned bytest/MeshWeaver.Hosting.Orleans.Test/OrleansDirectoryInstabilityClassificationTest.cs.Why the counter kept moving anyway. I read the live incident record
Admin/_LogIncident/830c48fa8c2283d1(read-only, on the control instance). Every post-close sample (2026-09-03, 2026-09-07 ×5, 2026-09-10) is the "Current directory at S… is not stable … Retry later." shape onIPodHubGrain.Attach()— i.e. precisely the condition the classifier now treats as transient and retries. The line itself is emitted by Orleans' ownOrleans.Messaginglogger at the addressing layer, below where MeshWeaver can suppress it, so a perfect fix still leaves the log line and the incident counter ticking during a rolling deploy. The defect this issue names — dropped instead of retried — is what was fixed, and it is verified in code.Item 2 (the
Memorystream provider in a clustered deployment) was separately re-sized on this thread and belongs to the durable-stream-provider work, not here.The 2026-09-17T07:51–07:53Z reopen was part of a bulk wave whose predicate read an accumulated counter rather than "occurred since the close" — analysed in Reading a Recurrence Reopen.
Closing a dormant incident is safe by design: a recurrence re-opens the issue automatically with fresh evidence, so nothing is lost by closing while quiet.
review(#4923): narrow the departed-silo guard off the OrleansExceptio…