Skip to content

Commit 2bced4c

Browse files
authored
fix: discard ReceiveTimeout when timeout message is null #32015 (#32016)
* fix: discard ReceiveTimeout when timeout message is null #32015 * removed unused code
1 parent 3efbba1 commit 2bced4c

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright (C) 2023 Lightbend Inc. <https://www.lightbend.com>
3+
*/
4+
5+
package akka.actor.typed.internal.adpater
6+
7+
import scala.concurrent.duration.DurationInt
8+
import org.scalatest.wordspec.AnyWordSpecLike
9+
import akka.actor.testkit.typed.scaladsl._
10+
import akka.actor.typed._
11+
import akka.actor.typed.scaladsl.Behaviors
12+
import akka.actor.typed.scaladsl.adapter._
13+
14+
class ActorAdapterSpec extends ScalaTestWithActorTestKit with AnyWordSpecLike {
15+
16+
sealed trait Command
17+
case object Begin extends Command
18+
case object End extends Command
19+
case object Timeout extends Command
20+
21+
sealed trait Event
22+
case object Ended extends Event
23+
24+
def evidence(monitor: ActorRef[Event]): Behavior[Command] =
25+
Behaviors.setup { context =>
26+
Behaviors.receiveMessage[Command] {
27+
case Begin =>
28+
context.setReceiveTimeout(100.milliseconds, Timeout)
29+
context.cancelReceiveTimeout()
30+
context.self.toClassic ! akka.actor.ReceiveTimeout
31+
context.self ! End
32+
Behaviors.same
33+
34+
case Timeout =>
35+
Behaviors.stopped
36+
37+
case End =>
38+
monitor ! Ended
39+
Behaviors.stopped
40+
}
41+
}
42+
43+
"An ActorAdapter" must {
44+
"not cause actor crash after recieve timeout was cancelled with ReceiveTimeout waiting in mailbox" in {
45+
val probe = TestProbe[Event]("evt")
46+
val behavior = evidence(probe.ref)
47+
48+
val ref = spawn(behavior)
49+
ref ! Begin
50+
probe.expectMessage(Ended)
51+
}
52+
}
53+
}

akka-actor-typed/src/main/scala/akka/actor/typed/internal/adapter/ActorAdapter.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ import akka.util.OptionVal
9090
} else Terminated(ActorRefAdapter(ref))
9191
handleSignal(msg)
9292
case classic.ReceiveTimeout =>
93-
handleMessage(ctx.receiveTimeoutMsg)
93+
// discard when null as timeout was cancelled after RecieveTimeout was already enqueued into the mailbox
94+
if (ctx.receiveTimeoutMsg != null)
95+
handleMessage(ctx.receiveTimeoutMsg)
9496
case wrapped: AdaptMessage[Any, T] @unchecked =>
9597
withSafelyAdapted(() => wrapped.adapt()) {
9698
case AdaptWithRegisteredMessageAdapter(msg) =>

0 commit comments

Comments
 (0)