Node never joins a cluster when a list of seed nodes consists exclusively of more than one "selfAddress"
#25,820 opened on Oct 23, 2018
Repository metrics
- Stars
- (13,277 stars)
- PR merge metrics
- (Avg merge 8d 19h) (10 merged PRs in 30d)
Description
The issue occurs when the list of seed nodes contains multiple occurrences of selfAddress and there are no other addresses in that list. Here is a reproducible example:
val cluster = Cluster(system)
val seedNodes = Seq(cluster.selfAddress, cluster.selfAddress)
cluster.joinSeedNodes(seedNodes)
The root cause of the issue is the following:
- We successfully pass the condition here: https://github.com/akka/akka/blob/master/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala#L605-L607 and instantiate the
FirstSeedNodeProcessactor to join the cluster. - In the
FirstSeedNodeProcesswe filter out all seed nodes that match theselfAddressinstance: https://github.com/akka/akka/blob/master/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala#L1418 . TheremainingSeedNodesends up empty. - As a result the
FirstSeedNodeProcessactor never sends theInitJoinmessage.
Despite the minority of this issue, it may cause some unexpected behavior in case when the seed-node-timeout is high enough.
The quick solution for this issue is to use Set here: https://github.com/akka/akka/blob/master/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala#L599. And if possible pass this Set instances into the FirstSeedNodeProcess and JoinSeedNodeProcess constructors.
I'd be happy to submit a PR if the problem and the proposed solution make sense.