Node never joins a cluster when a list of seed nodes consists exclusively of more than one "selfAddress"
#25 820 ouverte le 23 oct. 2018
Métriques du dépôt
- Stars
- (13 277 étoiles)
- Métriques de merge PR
- (Merge moyen 8j 19h) (10 PRs mergées en 30 j)
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.