From 37321ee63fd6e2e96928e327342cc35a50352d14 Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Wed, 1 Jul 2015 17:45:15 +0200 Subject: [PATCH] =act #17805 Don't change self on restart" * we hold on to the same ActorRef instance anyway in the new Actor instance --- akka-actor/src/main/scala/akka/actor/ActorCell.scala | 6 +++--- .../src/main/scala/akka/actor/dungeon/FaultHandling.scala | 6 +++--- project/MiMa.scala | 5 ++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index db56d3185d..97f8bf63e8 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -567,7 +567,7 @@ private[akka] class ActorCell( protected def create(failure: Option[ActorInitializationException]): Unit = { def clearOutActorIfNonNull(): Unit = { if (actor != null) { - clearActorFields(actor) + clearActorFields(actor, recreate = false) actor = null // ensure that we know that we failed during creation } } @@ -640,8 +640,8 @@ private[akka] class ActorCell( throw new IllegalArgumentException("ActorCell has no props field") } - final protected def clearActorFields(actorInstance: Actor): Unit = { - setActorFields(actorInstance, context = null, self = system.deadLetters) + final protected def clearActorFields(actorInstance: Actor, recreate: Boolean): Unit = { + setActorFields(actorInstance, context = null, self = if (recreate) self else system.deadLetters) currentMessage = null behaviorStack = emptyBehaviorStack } diff --git a/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala b/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala index 3a290227b6..1bc158a01c 100644 --- a/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala +++ b/akka-actor/src/main/scala/akka/actor/dungeon/FaultHandling.scala @@ -69,7 +69,7 @@ private[akka] trait FaultHandling { this: ActorCell ⇒ val ex = new PreRestartException(self, e, cause, optionalMessage) publish(Error(ex, self.path.toString, clazz(failedActor), e.getMessage)) } finally { - clearActorFields(failedActor) + clearActorFields(failedActor, recreate = true) } } assert(mailbox.isSuspended, "mailbox must be suspended during restart, status=" + mailbox.currentStatus) @@ -217,7 +217,7 @@ private[akka] trait FaultHandling { this: ActorCell ⇒ if (system.settings.DebugLifecycle) publish(Debug(self.path.toString, clazz(a), "stopped")) - clearActorFields(a) + clearActorFields(a, recreate = false) clearActorCellFields(this) actor = null } @@ -245,7 +245,7 @@ private[akka] trait FaultHandling { this: ActorCell ⇒ publish(Error(e, self.path.toString, clazz(freshActor), "restarting " + child)) }) } catch handleNonFatalOrInterruptedException { e ⇒ - clearActorFields(actor) // in order to prevent preRestart() from happening again + clearActorFields(actor, recreate = false) // in order to prevent preRestart() from happening again handleInvokeFailure(survivors, new PostRestartException(self, e, cause)) } } diff --git a/project/MiMa.scala b/project/MiMa.scala index 3c3eeba44a..ef3d2cb260 100644 --- a/project/MiMa.scala +++ b/project/MiMa.scala @@ -537,7 +537,10 @@ object MiMa extends AutoPlugin { FilterAnyProblem("akka.remote.RemoteWatcher$Stats"), // toString is available on any object, mima is confused due to a generated toString appearing #17722 - ProblemFilters.exclude[MissingMethodProblem]("akka.japi.Pair.toString") + ProblemFilters.exclude[MissingMethodProblem]("akka.japi.Pair.toString"), + + // #17805 + ProblemFilters.exclude[MissingMethodProblem]("akka.actor.ActorCell.clearActorFields") ) }