From c806abb96a6c41c06d1e7036271d0eef25308526 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 5 Feb 2020 10:05:05 +0100 Subject: [PATCH] Don't initialize Lmdb when rememberEntities not used, #28567 * Sharding defines durable.keys in reference.conf * That will trigger initialization of LmdbDurableStore for the ddata Replicator that is used by Sharding * but that is only needed if rememberEntities is enabled * This will optimize startup time for ClusterSharding, and reduced runtime complexity of accessing file system --- .../cluster/sharding/ClusterSharding.scala | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) 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 788fc4827f..b5ad320ea1 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 @@ -695,8 +695,6 @@ private[akka] class ClusterShardingGuardian extends Actor { val sharding = ClusterSharding(context.system) val majorityMinCap = context.system.settings.config.getInt("akka.cluster.sharding.distributed-data.majority-min-cap") - private lazy val replicatorSettings = - ReplicatorSettings(context.system.settings.config.getConfig("akka.cluster.sharding.distributed-data")) private var replicatorByRole = Map.empty[Option[String], ActorRef] private def coordinatorSingletonManagerName(encName: String): String = @@ -705,6 +703,18 @@ private[akka] class ClusterShardingGuardian extends Actor { private def coordinatorPath(encName: String): String = (self.path / coordinatorSingletonManagerName(encName) / "singleton" / "coordinator").toStringWithoutAddress + private def replicatorSettings(shardingSettings: ClusterShardingSettings) = { + val configuredSettings = + ReplicatorSettings(context.system.settings.config.getConfig("akka.cluster.sharding.distributed-data")) + // Use members within the data center and with the given role (if any) + val replicatorRoles = Set(ClusterSettings.DcRolePrefix + cluster.settings.SelfDataCenter) ++ shardingSettings.role + val settingsWithRoles = configuredSettings.withRoles(replicatorRoles) + if (shardingSettings.rememberEntities) + settingsWithRoles + else + settingsWithRoles.withDurableKeys(Set.empty[String]) + } + private def replicator(settings: ClusterShardingSettings): ActorRef = { if (settings.stateStoreMode == ClusterShardingSettings.StateStoreModeDData) { // one Replicator per role @@ -715,9 +725,7 @@ private[akka] class ClusterShardingGuardian extends Actor { case Some(r) => URLEncoder.encode(r, ByteString.UTF_8) + "Replicator" case None => "replicator" } - // Use members within the data center and with the given role (if any) - val replicatorRoles = Set(ClusterSettings.DcRolePrefix + cluster.settings.SelfDataCenter) ++ settings.role - val ref = context.actorOf(Replicator.props(replicatorSettings.withRoles(replicatorRoles)), name) + val ref = context.actorOf(Replicator.props(replicatorSettings(settings)), name) replicatorByRole = replicatorByRole.updated(settings.role, ref) ref }