diff --git a/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/external/internal/ExternalShardAllocationClientImpl.scala b/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/external/internal/ExternalShardAllocationClientImpl.scala index d315a11ac8..08c6bbf569 100644 --- a/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/external/internal/ExternalShardAllocationClientImpl.scala +++ b/akka-cluster-sharding/src/main/scala/akka/cluster/sharding/external/internal/ExternalShardAllocationClientImpl.scala @@ -17,6 +17,7 @@ import akka.cluster.ddata.LWWMap import akka.cluster.ddata.Replicator.Get import akka.cluster.ddata.Replicator.GetFailure import akka.cluster.ddata.Replicator.GetSuccess +import akka.cluster.ddata.Replicator.NotFound import akka.cluster.ddata.Replicator.ReadMajority import akka.cluster.ddata.Replicator.Update import akka.cluster.ddata.Replicator.UpdateSuccess @@ -79,6 +80,8 @@ final private[external] class ExternalShardAllocationClientImpl(system: ActorSys case success @ GetSuccess(`Key`, _) => Future.successful( success.get(Key).entries.transform((_, asStr) => ShardLocation(AddressFromURIString(asStr)))) + case NotFound(_, _) => + Future.successful(Map.empty[ShardId, ShardLocation]) case GetFailure(_, _) => Future.failed((new ClientTimeoutException(s"Unable to get shard locations after ${timeout.duration.pretty}"))) } diff --git a/akka-cluster-sharding/src/test/scala/akka/cluster/sharding/external/ExternalShardAllocationStrategySpec.scala b/akka-cluster-sharding/src/test/scala/akka/cluster/sharding/external/ExternalShardAllocationStrategySpec.scala index b40a77e718..2384907b25 100644 --- a/akka-cluster-sharding/src/test/scala/akka/cluster/sharding/external/ExternalShardAllocationStrategySpec.scala +++ b/akka-cluster-sharding/src/test/scala/akka/cluster/sharding/external/ExternalShardAllocationStrategySpec.scala @@ -20,6 +20,16 @@ class ExternalShardAllocationStrategySpec extends AkkaSpec(""" val requester = TestProbe() + "ExternalShardAllocationClient" must { + "default to no locations if sharding never started" in { + ExternalShardAllocation(system) + .clientFor("not found") + .shardLocations() + .futureValue + .locations shouldEqual Map.empty + } + } + "ExternalShardAllocation allocate" must { "default to requester if query times out" in { val (strat, _) = createStrategy()