Hello,

I'm trying to set up a simulation where two devices (FSMs) cooperate. The 
two devices exchange messages, and each is guided by an instance of another 
actor to drive the usage pattern. The devices have a timer to change 
behaviour (attempt to exchange a bit of info with the other device), and 
the usagePattern actors have a timer to simulate the user behaviour.

The device timer is scheduled by:

context.system.scheduler.schedule(delay milliseconds, delay milliseconds, 
self, MyMessage())

and the usagePattern is repeatedly scheduling by:
context.system.scheduler.scheduleOnce(123 milliseconds, self, SendNext())
from within the message receive

My problem is that this deadlocks fairly quickly, seemingly when the two 
Device instances tries to send messages to each other (all sends are done 
with ! ). Does anyone have any thoughts on what is causing this, the jvm 
stacktrace is below:


Found one Java-level deadlock:
=============================
"ForkJoinPool-2-worker-7":
  waiting for ownable synchronizer 0x00000007eeb94470, (a 
java.util.concurrent.locks.ReentrantLock$NonfairSync),
  which is held by "ForkJoinPool-2-worker-11"
"ForkJoinPool-2-worker-11":
  waiting for ownable synchronizer 0x00000007eef60c40, (a 
java.util.concurrent.locks.ReentrantLock$NonfairSync),
  which is held by "ForkJoinPool-2-worker-9"
"ForkJoinPool-2-worker-9":
  waiting for ownable synchronizer 0x00000007eeb94470, (a 
java.util.concurrent.locks.ReentrantLock$NonfairSync),
  which is held by "ForkJoinPool-2-worker-11"

Java stack information for the threads listed above:

===================================================

"ForkJoinPool-2-worker-7":
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000007eeb94470> (a 
java.util.concurrent.locks.ReentrantLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireNanos(AbstractQueuedSynchronizer.java:929)
at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireNanos(AbstractQueuedSynchronizer.java:1245)
at java.util.concurrent.locks.ReentrantLock.tryLock(ReentrantLock.java:445)
at 
akka.testkit.CallingThreadDispatcher.runQueue(CallingThreadDispatcher.scala:275)
at 
akka.testkit.CallingThreadDispatcher.dispatch(CallingThreadDispatcher.scala:208)
at akka.actor.dungeon.Dispatch$class.sendMessage(Dispatch.scala:123)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.Cell$class.sendMessage(ActorCell.scala:290)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.LocalActorRef.$bang(ActorRef.scala:384)
at agents.UsagePattern.handleSendNext(UsagePattern.scala:68)
at agents.UsagePattern$$anonfun$receive$1.applyOrElse(UsagePattern.scala:55)
at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
at agents.UsagePattern.aroundReceive(UsagePattern.scala:21)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
at akka.actor.ActorCell.invoke(ActorCell.scala:487)
at 
akka.testkit.CallingThreadDispatcher.process$1(CallingThreadDispatcher.scala:251)
at 
akka.testkit.CallingThreadDispatcher.runQueue(CallingThreadDispatcher.scala:284)
at 
akka.testkit.CallingThreadDispatcher.dispatch(CallingThreadDispatcher.scala:208)
at akka.actor.dungeon.Dispatch$class.sendMessage(Dispatch.scala:123)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.Cell$class.sendMessage(ActorCell.scala:290)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.LocalActorRef.$bang(ActorRef.scala:384)
at akka.actor.Scheduler$$anon$6.run(Scheduler.scala:106)
at 
scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at 
scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at 
scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

"ForkJoinPool-2-worker-11":
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000007eef60c40> (a 
java.util.concurrent.locks.ReentrantLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireNanos(AbstractQueuedSynchronizer.java:929)
at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireNanos(AbstractQueuedSynchronizer.java:1245)
at java.util.concurrent.locks.ReentrantLock.tryLock(ReentrantLock.java:445)
at 
akka.testkit.CallingThreadDispatcher.runQueue(CallingThreadDispatcher.scala:275)
at 
akka.testkit.CallingThreadDispatcher.dispatch(CallingThreadDispatcher.scala:208)
at akka.actor.dungeon.Dispatch$class.sendMessage(Dispatch.scala:123)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.Cell$class.sendMessage(ActorCell.scala:290)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.LocalActorRef.$bang(ActorRef.scala:384)
at agents.Device.findNextMergeCandidate(Device.scala:205)
at agents.Device$$anonfun$4.applyOrElse(Device.scala:150)
at agents.Device$$anonfun$4.applyOrElse(Device.scala:136)
at 
scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
at akka.actor.FSM$class.processEvent(FSM.scala:604)
at agents.Device.processEvent(Device.scala:27)
at akka.actor.FSM$class.akka$actor$FSM$$processMsg(FSM.scala:598)
at akka.actor.FSM$$anonfun$receive$1.applyOrElse(FSM.scala:592)
at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
at agents.Device.aroundReceive(Device.scala:27)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
at akka.actor.ActorCell.invoke(ActorCell.scala:487)
at 
akka.testkit.CallingThreadDispatcher.process$1(CallingThreadDispatcher.scala:251)
at 
akka.testkit.CallingThreadDispatcher.runQueue(CallingThreadDispatcher.scala:284)
at 
akka.testkit.CallingThreadDispatcher.dispatch(CallingThreadDispatcher.scala:208)
at akka.actor.dungeon.Dispatch$class.sendMessage(Dispatch.scala:123)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.Cell$class.sendMessage(ActorCell.scala:290)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.LocalActorRef.$bang(ActorRef.scala:384)
at akka.actor.Scheduler$$anon$4.run(Scheduler.scala:61)
at 
akka.actor.LightArrayRevolverScheduler$$anon$2$$anon$1.run(Scheduler.scala:242)
at 
scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at 
scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at 
scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

"ForkJoinPool-2-worker-9":

at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000007eeb94470> (a 
java.util.concurrent.locks.ReentrantLock$NonfairSync)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)
at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireNanos(AbstractQueuedSynchronizer.java:929)
at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireNanos(AbstractQueuedSynchronizer.java:1245)
at java.util.concurrent.locks.ReentrantLock.tryLock(ReentrantLock.java:445)
at 
akka.testkit.CallingThreadDispatcher.runQueue(CallingThreadDispatcher.scala:275)
at 
akka.testkit.CallingThreadDispatcher.dispatch(CallingThreadDispatcher.scala:208)
at akka.actor.dungeon.Dispatch$class.sendMessage(Dispatch.scala:123)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.Cell$class.sendMessage(ActorCell.scala:290)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.LocalActorRef.$bang(ActorRef.scala:384)
at agents.Device$$anonfun$3.applyOrElse(Device.scala:125)
at agents.Device$$anonfun$3.applyOrElse(Device.scala:112)
at 
scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
at akka.actor.FSM$class.processEvent(FSM.scala:604)
at agents.Device.processEvent(Device.scala:27)
at akka.actor.FSM$class.akka$actor$FSM$$processMsg(FSM.scala:598)
at akka.actor.FSM$$anonfun$receive$1.applyOrElse(FSM.scala:592)
at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
at agents.Device.aroundReceive(Device.scala:27)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
at akka.actor.ActorCell.invoke(ActorCell.scala:487)
at 
akka.testkit.CallingThreadDispatcher.process$1(CallingThreadDispatcher.scala:251)
at 
akka.testkit.CallingThreadDispatcher.runQueue(CallingThreadDispatcher.scala:284)
at 
akka.testkit.CallingThreadDispatcher.dispatch(CallingThreadDispatcher.scala:208)
at akka.actor.dungeon.Dispatch$class.sendMessage(Dispatch.scala:123)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.Cell$class.sendMessage(ActorCell.scala:290)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.LocalActorRef.$bang(ActorRef.scala:384)
at agents.UsagePattern.handleSendNext(UsagePattern.scala:68)
at agents.UsagePattern$$anonfun$receive$1.applyOrElse(UsagePattern.scala:55)
at akka.actor.Actor$class.aroundReceive(Actor.scala:465)
at agents.UsagePattern.aroundReceive(UsagePattern.scala:21)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
at akka.actor.ActorCell.invoke(ActorCell.scala:487)

at 
akka.testkit.CallingThreadDispatcher.process$1(CallingThreadDispatcher.scala:251)
at 
akka.testkit.CallingThreadDispatcher.runQueue(CallingThreadDispatcher.scala:284)
at 
akka.testkit.CallingThreadDispatcher.dispatch(CallingThreadDispatcher.scala:208)
at akka.actor.dungeon.Dispatch$class.sendMessage(Dispatch.scala:123)

at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.Cell$class.sendMessage(ActorCell.scala:290)
at akka.actor.ActorCell.sendMessage(ActorCell.scala:369)
at akka.actor.LocalActorRef.$bang(ActorRef.scala:384)
at akka.actor.Scheduler$$anon$6.run(Scheduler.scala:106)
at 
scala.concurrent.impl.ExecutionContextImpl$AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at 
scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at 
scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)

Found 1 deadlock.

I'm running this with akka-testkit, using akka 2.3.3 and scala 2.11.1


many thanks
Oskar

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to