Node never joins a cluster when a list of seed nodes consists exclusively of more than one "selfAddress"
#25,820 opened on 2018/10/23
Repository metrics
- Stars
- (13,277 個のスター)
- PR merge metrics
- (平均マージ 8d 19h) (30d で 10 merged PRs)
説明
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.