From 86a7b4f82f56d25173c6c8461f2d27c40c3d29dd Mon Sep 17 00:00:00 2001 From: Gregorius Soedharmo Date: Thu, 3 Jul 2025 00:47:35 +0700 Subject: [PATCH] Fix `Settings.InjectTopLevelFallback` race condition --- src/core/Akka/Actor/Settings.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/core/Akka/Actor/Settings.cs b/src/core/Akka/Actor/Settings.cs index 985983add5b..120663f5dae 100644 --- a/src/core/Akka/Actor/Settings.cs +++ b/src/core/Akka/Actor/Settings.cs @@ -13,6 +13,7 @@ using Akka.Dispatch; using Akka.Event; using Akka.Routing; +using Akka.Util; using ConfigurationFactory = Akka.Configuration.ConfigurationFactory; namespace Akka.Actor @@ -27,7 +28,7 @@ public class Settings { private readonly Config _userConfig; //internal static readonly Config AkkaDllConfig = ConfigurationFactory.FromResource("Akka.Configuration.Pigeon.conf"); - private Config _fallbackConfig; + private readonly AtomicReference _fallbackConfig; private void RebuildConfig() { @@ -42,13 +43,20 @@ private void RebuildConfig() /// /// Injects a system config at the top of the fallback chain /// - /// TBD + /// The latest config to be added to the front of the fallback chain public void InjectTopLevelFallback(Config config) { if (Config.Contains(config)) return; - _fallbackConfig = config.SafeWithFallback(_fallbackConfig); + while(true) + { + var oldConfig = _fallbackConfig.Value; + var newConfig = config.SafeWithFallback(oldConfig); + if (_fallbackConfig.CompareAndSet(oldConfig, newConfig)) + break; + } + RebuildConfig(); } @@ -77,7 +85,7 @@ public Settings(ActorSystem system, Config config, ActorSystemSetup setup) { Setup = setup; _userConfig = config; - _fallbackConfig = ConfigurationFactory.Default(); + _fallbackConfig = new AtomicReference(ConfigurationFactory.Default()); RebuildConfig(); System = system;