diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala index 0c450b12f5..cf50f8a54f 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala @@ -236,6 +236,7 @@ private[cluster] class ClusterCoreDaemon(publisher: ActorRef) extends Actor with var gossipStats = GossipStats() var seedNodeProcess: Option[ActorRef] = None + var seedNodeProcessCounter = 0 // for unique names /** * Looks up and returns the remote cluster command connection for the specific address. @@ -372,12 +373,16 @@ private[cluster] class ClusterCoreDaemon(publisher: ActorRef) extends Actor with if (seedNodes == immutable.IndexedSeq(selfAddress)) { self ! ClusterUserAction.JoinTo(selfAddress) None - } else if (seedNodes.head == selfAddress) { - Some(context.actorOf(Props(classOf[FirstSeedNodeProcess], seedNodes). - withDispatcher(UseDispatcher), name = "firstSeedNodeProcess")) } else { - Some(context.actorOf(Props(classOf[JoinSeedNodeProcess], seedNodes). - withDispatcher(UseDispatcher), name = "joinSeedNodeProcess")) + // use unique name of this actor, stopSeedNodeProcess doesn't wait for termination + seedNodeProcessCounter += 1 + if (seedNodes.head == selfAddress) { + Some(context.actorOf(Props(classOf[FirstSeedNodeProcess], seedNodes). + withDispatcher(UseDispatcher), name = "firstSeedNodeProcess-" + seedNodeProcessCounter)) + } else { + Some(context.actorOf(Props(classOf[JoinSeedNodeProcess], seedNodes). + withDispatcher(UseDispatcher), name = "joinSeedNodeProcess-" + seedNodeProcessCounter)) + } } } } diff --git a/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinSeedNodeSpec.scala b/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinSeedNodeSpec.scala index 0077e82dbd..9248750359 100644 --- a/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinSeedNodeSpec.scala +++ b/akka-cluster/src/multi-jvm/scala/akka/cluster/JoinSeedNodeSpec.scala @@ -47,6 +47,10 @@ abstract class JoinSeedNodeSpec runOn(seed1, seed2, seed3) { cluster.joinSeedNodes(seedNodes) + runOn(seed3) { + // it is allowed to call this several times (verifies ticket #3973) + cluster.joinSeedNodes(seedNodes) + } awaitMembersUp(3) } enterBarrier("after-1")