diff --git a/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/ClusterShardingSettings.scala b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/ClusterShardingSettings.scala index 63ee1ecc99..a000d2c3b4 100644 --- a/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/ClusterShardingSettings.scala +++ b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/ClusterShardingSettings.scala @@ -53,6 +53,7 @@ object ClusterShardingSettings { stateStoreMode = StateStoreMode.byName(classicSettings.stateStoreMode), rememberEntitiesStoreMode = RememberEntitiesStoreMode.byName(classicSettings.rememberEntitiesStore), new TuningParameters(classicSettings.tuningParameters), + classicSettings.coordinatorSingletonOverrideRole, new ClusterSingletonManagerSettings( classicSettings.coordinatorSingletonSettings.singletonName, classicSettings.coordinatorSingletonSettings.role, @@ -98,6 +99,7 @@ object ClusterShardingSettings { coordinatorStateReadMajorityPlus = settings.tuningParameters.coordinatorStateReadMajorityPlus, leastShardAllocationAbsoluteLimit = settings.tuningParameters.leastShardAllocationAbsoluteLimit, leastShardAllocationRelativeLimit = settings.tuningParameters.leastShardAllocationRelativeLimit), + coordinatorSingletonOverrideRole = settings.coordinatorSingletonOverrideRole, new ClassicClusterSingletonManagerSettings( settings.coordinatorSingletonSettings.singletonName, settings.coordinatorSingletonSettings.role, @@ -821,9 +823,41 @@ final class ClusterShardingSettings( val stateStoreMode: ClusterShardingSettings.StateStoreMode, val rememberEntitiesStoreMode: ClusterShardingSettings.RememberEntitiesStoreMode, val tuningParameters: ClusterShardingSettings.TuningParameters, + val coordinatorSingletonOverrideRole: Boolean, val coordinatorSingletonSettings: ClusterSingletonManagerSettings, val leaseSettings: Option[LeaseUsageSettings]) { + @deprecated("Use constructor with coordinatorSingletonOverrideRole", "2.6.20") + def this( + numberOfShards: Int, + role: Option[String], + dataCenter: Option[DataCenter], + rememberEntities: Boolean, + journalPluginId: String, + snapshotPluginId: String, + passivationStrategySettings: ClusterShardingSettings.PassivationStrategySettings, + shardRegionQueryTimeout: FiniteDuration, + stateStoreMode: ClusterShardingSettings.StateStoreMode, + rememberEntitiesStoreMode: ClusterShardingSettings.RememberEntitiesStoreMode, + tuningParameters: ClusterShardingSettings.TuningParameters, + coordinatorSingletonSettings: ClusterSingletonManagerSettings, + leaseSettings: Option[LeaseUsageSettings]) = + this( + numberOfShards, + role, + dataCenter, + rememberEntities, + journalPluginId, + snapshotPluginId, + passivationStrategySettings, + shardRegionQueryTimeout, + stateStoreMode, + rememberEntitiesStoreMode, + tuningParameters, + true, + coordinatorSingletonSettings, + leaseSettings) + @deprecated("Use constructor with passivationStrategySettings", "2.6.18") def this( numberOfShards: Int, @@ -851,6 +885,7 @@ final class ClusterShardingSettings( stateStoreMode, rememberEntitiesStoreMode, tuningParameters, + true, coordinatorSingletonSettings, leaseSettings) @@ -995,6 +1030,7 @@ final class ClusterShardingSettings( stateStoreMode: ClusterShardingSettings.StateStoreMode = stateStoreMode, rememberEntitiesStoreMode: ClusterShardingSettings.RememberEntitiesStoreMode = rememberEntitiesStoreMode, tuningParameters: ClusterShardingSettings.TuningParameters = tuningParameters, + coordinatorSingletonOverrideRole: Boolean = coordinatorSingletonOverrideRole, coordinatorSingletonSettings: ClusterSingletonManagerSettings = coordinatorSingletonSettings, passivationStrategySettings: ClusterShardingSettings.PassivationStrategySettings = passivationStrategySettings, shardRegionQueryTimeout: FiniteDuration = shardRegionQueryTimeout, @@ -1011,6 +1047,7 @@ final class ClusterShardingSettings( stateStoreMode, rememberEntitiesStoreMode, tuningParameters, + coordinatorSingletonOverrideRole, coordinatorSingletonSettings, leaseSettings) } diff --git a/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/internal/ShardedDaemonProcessImpl.scala b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/internal/ShardedDaemonProcessImpl.scala index 10c1f2e271..7ed3742f1c 100644 --- a/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/internal/ShardedDaemonProcessImpl.scala +++ b/akka-cluster-sharding-typed/src/main/scala/akka/cluster/sharding/typed/internal/ShardedDaemonProcessImpl.scala @@ -150,6 +150,7 @@ private[akka] final class ShardedDaemonProcessImpl(system: ActorSystem[_]) StateStoreModeDData, RememberEntitiesStoreModeDData, // not used as remembered entities is off shardingBaseSettings.tuningParameters, + shardingBaseSettings.coordinatorSingletonOverrideRole, shardingBaseSettings.coordinatorSingletonSettings, shardingBaseSettings.leaseSettings) } diff --git a/akka-cluster-sharding/src/main/resources/reference.conf b/akka-cluster-sharding/src/main/resources/reference.conf index fe8a2fc742..ce627cd7af 100644 --- a/akka-cluster-sharding/src/main/resources/reference.conf +++ b/akka-cluster-sharding/src/main/resources/reference.conf @@ -358,10 +358,17 @@ akka.cluster.sharding { # Settings for the coordinator singleton. Same layout as akka.cluster.singleton. # The "role" of the singleton configuration is not used. The singleton role will - # be the same as "akka.cluster.sharding.role". + # be the same as "akka.cluster.sharding.role" if + # "akka.cluster.sharding.coordinator-singleton-role-override" is enabled. Disabling it will allow to + # use separate nodes for the shard coordinator and the shards themselves. # A lease can be configured in these settings for the coordinator singleton coordinator-singleton = ${akka.cluster.singleton} + + # Copies the role for the coordinator singleton from the shards role instead of using the one provided in the + # "akka.cluster.sharding.coordinator-singleton.role" + coordinator-singleton-role-override = on + coordinator-state { # State updates are required to be written to a majority of nodes plus this # number of additional nodes. Can also be set to "all" to require diff --git a/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/ClusterSharding.scala b/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/ClusterSharding.scala index 525e4311b6..2738467790 100755 --- a/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/ClusterSharding.scala +++ b/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/ClusterSharding.scala @@ -805,7 +805,13 @@ private[akka] class ClusterShardingGuardian extends Actor { .withFinalStopMessage(_ == ShardCoordinator.Internal.Terminate) .props .withDeploy(Deploy.local) - val singletonSettings = settings.coordinatorSingletonSettings.withSingletonName("singleton").withRole(role) + + val singletonSettings = if (settings.coordinatorSingletonOverrideRole) { + settings.coordinatorSingletonSettings.withSingletonName("singleton").withRole(role) + } else { + settings.coordinatorSingletonSettings.withSingletonName("singleton") + } + context.actorOf( ClusterSingletonManager .props(singletonProps, terminationMessage = ShardCoordinator.Internal.Terminate, singletonSettings) diff --git a/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/ClusterShardingSettings.scala b/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/ClusterShardingSettings.scala index 1ae3d9e3ed..7435b9437b 100644 --- a/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/ClusterShardingSettings.scala +++ b/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/ClusterShardingSettings.scala @@ -107,6 +107,7 @@ object ClusterShardingSettings { passivationStrategySettings = passivationStrategySettings, shardRegionQueryTimeout = config.getDuration("shard-region-query-timeout", MILLISECONDS).millis, tuningParameters, + config.getBoolean("coordinator-singleton-role-override"), coordinatorSingletonSettings, lease) } @@ -1122,9 +1123,38 @@ final class ClusterShardingSettings( val passivationStrategySettings: ClusterShardingSettings.PassivationStrategySettings, val shardRegionQueryTimeout: FiniteDuration, val tuningParameters: ClusterShardingSettings.TuningParameters, + val coordinatorSingletonOverrideRole: Boolean, val coordinatorSingletonSettings: ClusterSingletonManagerSettings, val leaseSettings: Option[LeaseUsageSettings]) extends NoSerializationVerificationNeeded { + @deprecated( + "Use the ClusterShardingSettings factory methods or the constructor including coordinatorSingletonOverrideRole instead", + "2.6.20") + def this( + role: Option[String], + rememberEntities: Boolean, + journalPluginId: String, + snapshotPluginId: String, + stateStoreMode: String, + rememberEntitiesStore: String, + passivationStrategySettings: ClusterShardingSettings.PassivationStrategySettings, + shardRegionQueryTimeout: FiniteDuration, + tuningParameters: ClusterShardingSettings.TuningParameters, + coordinatorSingletonSettings: ClusterSingletonManagerSettings, + leaseSettings: Option[LeaseUsageSettings]) = + this( + role, + rememberEntities, + journalPluginId, + snapshotPluginId, + stateStoreMode, + rememberEntitiesStore, + passivationStrategySettings, + shardRegionQueryTimeout, + tuningParameters, + true, + coordinatorSingletonSettings, + leaseSettings) @deprecated( "Use the ClusterShardingSettings factory methods or the constructor including passivationStrategySettings instead", @@ -1151,6 +1181,7 @@ final class ClusterShardingSettings( ClusterShardingSettings.PassivationStrategySettings.oldDefault(passivateIdleEntityAfter), shardRegionQueryTimeout, tuningParameters, + true, coordinatorSingletonSettings, leaseSettings) @@ -1335,6 +1366,7 @@ final class ClusterShardingSettings( passivationStrategySettings: ClusterShardingSettings.PassivationStrategySettings = passivationStrategySettings, shardRegionQueryTimeout: FiniteDuration = shardRegionQueryTimeout, tuningParameters: ClusterShardingSettings.TuningParameters = tuningParameters, + coordinatorSingletonOverrideRole: Boolean = coordinatorSingletonOverrideRole, coordinatorSingletonSettings: ClusterSingletonManagerSettings = coordinatorSingletonSettings, leaseSettings: Option[LeaseUsageSettings] = leaseSettings): ClusterShardingSettings = new ClusterShardingSettings( @@ -1347,6 +1379,7 @@ final class ClusterShardingSettings( passivationStrategySettings, shardRegionQueryTimeout, tuningParameters, + coordinatorSingletonOverrideRole, coordinatorSingletonSettings, leaseSettings) }