quickfix.Session

QuickFIX/J JIRA | marc sperisen | 5 years ago
  1. 0

    Deadlock arises between the following threads: Thread1: "GatewayStateTimer" daemon prio=3 tid=0x04d65388 nid=0x2bef waiting for monitor entry [0x790ff000..0x790ff9f0] at quickfix.SessionState.isLogonSent(SessionState.java:162) - waiting to lock <0x9d12c020> (a quickfix.Session) at quickfix.Session.sentLogon(Session.java:690) at quickfix.Session.isLoggedOn(Session.java:731) at quickfix.Session.sendRaw(Session.java:2151) at quickfix.Session.send(Session.java:2213) at quickfix.Session.sendToTarget(Session.java:590) at com.greatBank.application.fix.Engine.sendMessage(Engine.java:54) at com.greatBank.application.fix.Engine.pingFIX(Engine.java:191) at com.greatBank.application.fix.Engine.access$0(Engine.java:186) at com.greatBank.application.fix.Engine$PingTimerTask.run(Engine.java:176) at java.util.TimerThread.mainLoop(Timer.java:512) at java.util.TimerThread.run(Timer.java:462) -> Thread1 is sending a message: it first acquires the lock senderMsgSeqNumLock and then tries to acquire a lock on the session instance Thread2: "QF/J Session dispatcher: FIX.4.2:SENDER1->TARGET1" daemon prio=3 tid=0x014e5ac8 nid=0x2bfc waiting on condition [0x794ff000..0x794ff970] at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:118) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:716) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:746) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1076) at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:184) at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:256) at quickfix.SessionState.lockSenderMsgSeqNum(SessionState.java:322) at quickfix.Session.sendRaw(Session.java:2117) at quickfix.Session.generateLogout(Session.java:1293) at quickfix.Session.generateLogout(Session.java:1284) at quickfix.Session.reset(Session.java:756) - locked <0x9d12c020> (a quickfix.Session) at quickfix.Session.next(Session.java:836) at quickfix.mina.ThreadPerSessionEventHandlingStrategy$MessageDispatchingThread.run(ThreadPerSessionEventHandlingStrategy.java:119) -> Thread2: while processing an incoming message, the engine notices that it is in a new session time interval (StartTime/EndTime) and therefore a MsqSeqNum reset is started. The reset method acquires a lock on the session and, when generating a Logout, tries to acquire the lock senderMsgSeqNumLock, and then deadlocks with Thread1

    QuickFIX/J JIRA | 5 years ago | marc sperisen
    quickfix.Session

    Root Cause Analysis

    1. quickfix.Session

      No message provided

      at quickfix.Session.sentLogon()
    2. Apache ServiceMix :: Bundles :: ${pkgArtifactId}
      Session.sendToTarget
      1. quickfix.Session.sentLogon(Session.java:690)
      2. quickfix.Session.isLoggedOn(Session.java:731)
      3. quickfix.Session.sendRaw(Session.java:2151)
      4. quickfix.Session.send(Session.java:2213)
      5. quickfix.Session.sendToTarget(Session.java:590)
      5 frames
    3. com.greatBank.application
      Engine$PingTimerTask.run
      1. com.greatBank.application.fix.Engine.sendMessage(Engine.java:54)
      2. com.greatBank.application.fix.Engine.pingFIX(Engine.java:191)
      3. com.greatBank.application.fix.Engine.access$0(Engine.java:186)
      4. com.greatBank.application.fix.Engine$PingTimerTask.run(Engine.java:176)
      4 frames
    4. Java RT
      TimerThread.run
      1. java.util.TimerThread.mainLoop(Timer.java:512)
      2. java.util.TimerThread.run(Timer.java:462)
      2 frames