From 128bd13a092d2c80e26c1eb91c68bd48e6e753af Mon Sep 17 00:00:00 2001 From: v3xro <175618876+v3xro@users.noreply.github.com> Date: Wed, 11 Mar 2026 16:12:13 +0000 Subject: [PATCH] Fix #717 by not caching the _internalRef when calling .TryGet on the ActorRegistry --- src/Akka.Hosting.Tests/RequiredActorSpecs.cs | 33 ++++++++++++++++++++ src/Akka.Hosting/ActorRegistry.cs | 4 +-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/Akka.Hosting.Tests/RequiredActorSpecs.cs b/src/Akka.Hosting.Tests/RequiredActorSpecs.cs index c52a9dd2..3f99e314 100644 --- a/src/Akka.Hosting.Tests/RequiredActorSpecs.cs +++ b/src/Akka.Hosting.Tests/RequiredActorSpecs.cs @@ -138,4 +138,37 @@ public async Task ShouldNotCacheNobodyAfterWhenWaitedForRegistration() // assert cachedActorRef.Should().NotBeOfType(); } + + [Fact] + public async Task ShouldNotCacheNobodyBeforeRegistrationWithSyncActorRef() + { + // arrange + using var host = new HostBuilder() + .ConfigureServices(services => + { + services.AddAkka("MySys", (builder, _) => + { + builder.WithActors((system, registry) => + { + var actor = system.ActorOf(Props.Create(() => new MyActorType()), "myactor"); + registry.Register(actor); + }); + }); + }) + .Build(); + + var myRequiredActor = host.Services.GetRequiredService>(); + + Action shouldThrow = () => _ = myRequiredActor.ActorRef; + + shouldThrow.Should().Throw(); + + await host.StartAsync(); + + // act + var cachedActorRef = await myRequiredActor.GetAsync(); + + // assert + cachedActorRef.Should().NotBeOfType(); + } } \ No newline at end of file diff --git a/src/Akka.Hosting/ActorRegistry.cs b/src/Akka.Hosting/ActorRegistry.cs index 017eebc2..62870a29 100644 --- a/src/Akka.Hosting/ActorRegistry.cs +++ b/src/Akka.Hosting/ActorRegistry.cs @@ -62,9 +62,9 @@ public IActorRef ActorRef return _internalRef; // attempt 2 - synchronously check the registry (fast path) - if (_registry.TryGet(out _internalRef)) + if (_registry.TryGet(out var internalRef)) { - return _internalRef; + return _internalRef = internalRef; }