Skip to content

Commit 857801c

Browse files
authored
Fix Settings.InjectTopLevelFallback race condition (#7721)
1 parent 65ba0f4 commit 857801c

File tree

1 file changed

+12
-4
lines changed

1 file changed

+12
-4
lines changed

src/core/Akka/Actor/Settings.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using Akka.Dispatch;
1414
using Akka.Event;
1515
using Akka.Routing;
16+
using Akka.Util;
1617
using ConfigurationFactory = Akka.Configuration.ConfigurationFactory;
1718

1819
namespace Akka.Actor
@@ -27,7 +28,7 @@ public class Settings
2728
{
2829
private readonly Config _userConfig;
2930
//internal static readonly Config AkkaDllConfig = ConfigurationFactory.FromResource<Settings>("Akka.Configuration.Pigeon.conf");
30-
private Config _fallbackConfig;
31+
private readonly AtomicReference<Config> _fallbackConfig;
3132

3233
private void RebuildConfig()
3334
{
@@ -42,13 +43,20 @@ private void RebuildConfig()
4243
/// <summary>
4344
/// Injects a system config at the top of the fallback chain
4445
/// </summary>
45-
/// <param name="config">TBD</param>
46+
/// <param name="config">The latest config to be added to the front of the <see cref="Settings.Config"/> fallback chain</param>
4647
public void InjectTopLevelFallback(Config config)
4748
{
4849
if (Config.Contains(config))
4950
return;
5051

51-
_fallbackConfig = config.SafeWithFallback(_fallbackConfig);
52+
while(true)
53+
{
54+
var oldConfig = _fallbackConfig.Value;
55+
var newConfig = config.SafeWithFallback(oldConfig);
56+
if (_fallbackConfig.CompareAndSet(oldConfig, newConfig))
57+
break;
58+
}
59+
5260
RebuildConfig();
5361
}
5462

@@ -77,7 +85,7 @@ public Settings(ActorSystem system, Config config, ActorSystemSetup setup)
7785
{
7886
Setup = setup;
7987
_userConfig = config;
80-
_fallbackConfig = ConfigurationFactory.Default();
88+
_fallbackConfig = new AtomicReference<Config>(ConfigurationFactory.Default());
8189
RebuildConfig();
8290

8391
System = system;

0 commit comments

Comments
 (0)