akka/akka-core

Node never joins a cluster when a list of seed nodes consists exclusively of more than one "selfAddress"

Ouverte

#25 820 ouverte le 23 oct. 2018

 (1 commentaire) (0 réaction) (0 personne assignée)Scala (3 547 forks)batch import
1 - triagedhelp wantedt:cluster

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:

  1. 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 FirstSeedNodeProcess actor to join the cluster.
  2. In the FirstSeedNodeProcess we filter out all seed nodes that match the selfAddress instance: https://github.com/akka/akka/blob/master/akka-cluster/src/main/scala/akka/cluster/ClusterDaemon.scala#L1418 . The remainingSeedNodesends up empty.
  3. As a result the FirstSeedNodeProcess actor never sends the InitJoin message.

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.

Guide contributeur