-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Settings.InjectTopLevelFallback
race condition can cause failures
#7426
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
This issue looks interesting and seems unassigned. I recently investigated #2357, so this seems like a natural next step. |
By all means, please go ahead - however, be forewarned: the right steps to take here are to propose a design change first (bear in mind our contributor guidelines: https://getakka.net/community/contributing/index.html) since this impacts live systems. So it'd be a good idea to propose a design here and maybe do a small proof of concept to get some feedback first. |
Got it, thanks for the clarification! |
Design Proposal: Thread-Safe Configuration Injection for Akka.NET PluginsBackgroundCurrently, Akka.NET plugins such as system.Settings.InjectTopLevelFallback(SomeConfig); This ensures that necessary configuration values (e.g., for serialization or actor behavior) are available when a plugin is initialized. The ProblemThis approach is not thread-safe. This can result in:
throw ConfigurationException.NullOrEmptyConfig("akka.cluster.singleton");
GoalsWe need a mechanism that:
Proposed SolutionIntroduce a static utility called public static class ConfigurationStaging
{
public static void Register(string key, Func<Config> configProvider);
public static void ApplyAll(Settings settings);
} How it works:
Example Plugin Usage static class ClusterSingletonManagerSettings
{
static ClusterSingletonManagerSettings()
{
ConfigurationStaging.Register(
"akka.cluster.singleton",
() => ClusterSingletonManager.DefaultConfig()
);
}
} This way, plugins do not inject config immediately. Instead, all configs are applied once in a controlled, deterministic order when the |
Version Information
Version of Akka.NET? v1.5.15
Which Akka.NET Modules? Akka.Cluster.Tools, others too presumably
Describe the bug
Consider the following method in the
ClusterSingletonManagerSettings
class:akka.net/src/contrib/cluster/Akka.Cluster.Tools/Singleton/ClusterSingletonManagerSettings.cs
Lines 28 to 36 in 55644b1
It uses
system.Settings.InjectTopLevelFallback
in order to make sure that its serialization definitions are available for Akka.Remote so all of the Cluster.Singleton-specific messages can be deserialized.However, the way
system.Settings.InjectTopLevelFallback
works is inherently racy - multiple components all starting up at the same time might inject their configs all at once and we can end up "missing" a config injection, which causes the following line to fail occasionally:akka.net/src/contrib/cluster/Akka.Cluster.Tools/Singleton/ClusterSingletonManagerSettings.cs
Lines 33 to 34 in 55644b1
Expected behavior
Plugins should be able to add their configurations to Akka.NET in a thread-safe, reliable manner that is also
CTOR
-friendly (no-Task
).Actual behavior
There is a small chance that the plugin configuration never gets properly registered and it crash - it's also possible for the default HOCON to get quite large as a result of many plugins multiplicatively registering their configuration values.
Additional context
We had talked about solving this problem in v1.4, when we attempted to replace our built-in HOCON implementation with https://github.com/akkadotnet/HOCON. The suggestion at the time was to have some means looking for known configuration sections and then staging them altogether inside the
ActorSystem
.Given that #7246 is a huge goal for v1.6, any sort of assembly-scanning solution is off the table - what we probably need is something functionally similar to
InjectTopLevelFallback
now but with thread-safety.The text was updated successfully, but these errors were encountered: