From ba67f71ca843de8507377f276a073c04d76d36ae Mon Sep 17 00:00:00 2001 From: Christopher Batey Date: Wed, 3 Oct 2018 13:01:38 +0100 Subject: [PATCH] Treat MemberStatus.Removed as terminal state in ClusterReadView (#25499) * Fixes #25489 where cluster event for a previous state can override the call to cluster.close settings it to remove * Fix case where Removed is used as a placeholder for unknown --- .../src/main/scala/akka/cluster/ClusterReadView.scala | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala b/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala index 54ffddaf88..456d0f2f12 100644 --- a/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala +++ b/akka-cluster/src/main/scala/akka/cluster/ClusterReadView.scala @@ -35,6 +35,9 @@ private[akka] class ClusterReadView(cluster: Cluster) extends Closeable { @volatile private var _cachedSelf: OptionVal[Member] = OptionVal.None + @volatile + private var _closed: Boolean = false + /** * Current internal cluster stats, updated periodically via event bus. */ @@ -87,7 +90,12 @@ private[akka] class ClusterReadView(cluster: Cluster) extends Closeable { e match { case e: MemberEvent if e.member.address == selfAddress ⇒ - _cachedSelf = OptionVal.Some(e.member) + _cachedSelf match { + case OptionVal.Some(s) if s.status == MemberStatus.Removed && _closed ⇒ + // ignore as Cluster.close has been called + case _ ⇒ + _cachedSelf = OptionVal.Some(e.member) + } case _ ⇒ } case s: CurrentClusterState ⇒ _state = s @@ -186,6 +194,7 @@ private[akka] class ClusterReadView(cluster: Cluster) extends Closeable { * Unsubscribe to cluster events. */ def close(): Unit = { + _closed = true _cachedSelf = OptionVal.Some(self.copy(MemberStatus.Removed)) if (!eventBusListener.isTerminated) eventBusListener ! PoisonPill