Node never joins a cluster when a list of seed nodes consists exclusively of more than one "selfAddress"
#25,820 创建于 2018年10月23日
仓库指标
- 星标
- (13,277 个星标)
- PR 合并指标
- (PR 指标待抓取)
描述
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.