private void HandleFailed(Failed f) //Called handleFailure in Akka JVM
{
CurrentMessage = f;
var failedChild = f.Child;
var failedChildIsNobody = failedChild.IsNobody();
Sender = failedChildIsNobody ? _systemImpl.DeadLetters : failedChild;
//Only act upon the failure, if it comes from a currently known child;
//the UID protects against reception of a Failed from a child which was
//killed in preRestart and re-created in postRestart
ChildRestartStats childStats;
if (TryGetChildStatsByRef(failedChild, out childStats))
{
var statsUid = childStats.Child.Path.Uid;
if (statsUid == f.Uid)
{
var handled = _actor.SupervisorStrategyInternal.HandleFailure(this, f.Cause, childStats, ChildrenContainer.Stats);
if (!handled)
ExceptionDispatchInfo.Capture(f.Cause).Throw();
}
else
{
Publish(new Debug(_self.Path.ToString(), _actor.GetType(), "Dropping Failed(" + f.Cause + ") from old child " + f.Child + " (uid=" + statsUid + " != " + f.Uid + ")"));
}
}
else
{
Publish(new Debug(_self.Path.ToString(), _actor.GetType(), "Dropping Failed(" + f.Cause + ") from unknown child " + failedChild));
}
}