Jean-Louis Monteiro created AMQ-9808:
----------------------------------------

             Summary: Dead lock when using CRON schedule with 
AMQ_SCHEDULED_REPEAT
                 Key: AMQ-9808
                 URL: https://issues.apache.org/jira/browse/AMQ-9808
             Project: ActiveMQ Classic
          Issue Type: Bug
          Components: Job Scheduler
    Affects Versions: 6.1.8, 5.18.7, 5.19.1
            Reporter: Jean-Louis Monteiro


This bug is highlighted by the current JmsSchedulerTest@testCron() test case.

When using a CRON expression with repeat != 0, there is a deadlock happening 
between JobSchedulerImpl and JobSchedulerStoreImpl.

The original cron job is read inside JobSchedulerImpl.mainLoop(). That loop 
holds JobSchedulerStoreImpl.readLockIndex() for the whole iteration.

When it hits the cron branch with repeat != 0, the code tries to spawn a new 
(non-cron) schedule by calling schedule(jobId, payload, "", delay, period, 
repeat) while the read lock is still held. schedule() writes a new 
KahaAddScheduledJobCommand, and JobSchedulerStoreImpl.process() needs the same 
indexLock in write mode. Since the scheduler thread already holds the read 
lock, it can’t acquire the write lock and blocks forever.

 
{code:java}
  "JobScheduler:JMS" #46 [38147] daemon prio=5 os_prio=31 cpu=3.54ms 
elapsed=273.52s tid=0x0000000ac8330800 nid=38147 waiting on condition  
[0x0000000171df6000]
     java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
        - parking to wait for  <0x0000000343ac3e80> (a 
java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
        at 
java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:223)
        at 
java.util.concurrent.locks.AbstractQueuedLongSynchronizer.acquire([email protected]/AbstractQueuedLongSynchronizer.java:410)
        at 
java.util.concurrent.locks.AbstractQueuedLongSynchronizer.acquire([email protected]/AbstractQueuedLongSynchronizer.java:650)
        at 
java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock([email protected]/ReentrantReadWriteLock.java:966)
        at 
org.apache.activemq.store.kahadb.scheduler.JobSchedulerStoreImpl$8.visit(JobSchedulerStoreImpl.java:684)
        at 
org.apache.activemq.store.kahadb.data.KahaAddScheduledJobCommand.visit(KahaAddScheduledJobCommand.java:283)
        at 
org.apache.activemq.store.kahadb.scheduler.JobSchedulerStoreImpl.process(JobSchedulerStoreImpl.java:679)
        at 
org.apache.activemq.store.kahadb.AbstractKahaDBStore.store(AbstractKahaDBStore.java:495)
        at 
org.apache.activemq.store.kahadb.AbstractKahaDBStore.store(AbstractKahaDBStore.java:403)
        at 
org.apache.activemq.store.kahadb.scheduler.JobSchedulerImpl.doSchedule(JobSchedulerImpl.java:252)
        at 
org.apache.activemq.store.kahadb.scheduler.JobSchedulerImpl.schedule(JobSchedulerImpl.java:100)
        at 
org.apache.activemq.store.kahadb.scheduler.JobSchedulerImpl.mainLoop(JobSchedulerImpl.java:782)
        at 
org.apache.activemq.store.kahadb.scheduler.JobSchedulerImpl.run(JobSchedulerImpl.java:699)
        at java.lang.Thread.runWith([email protected]/Thread.java:1487)
        at java.lang.Thread.run([email protected]/Thread.java:1474)
  "ActiveMQ Journal Checkpoint Worker" #43 [38915] daemon prio=5 os_prio=31 
cpu=4.77ms elapsed=273.69s tid=0x0000000ac82f5000 nid=38915 waiting on 
condition  [0x00000001719de000]
     java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
        - parking to wait for  <0x0000000343ac3e80> (a 
java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
        at 
java.util.concurrent.locks.LockSupport.park([email protected]/LockSupport.java:223)
        at 
java.util.concurrent.locks.AbstractQueuedLongSynchronizer.acquire([email protected]/AbstractQueuedLongSynchronizer.java:410)
        at 
java.util.concurrent.locks.AbstractQueuedLongSynchronizer.acquire([email protected]/AbstractQueuedLongSynchronizer.java:650)
        at 
java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock([email protected]/ReentrantReadWriteLock.java:966)
        at 
org.apache.activemq.store.kahadb.AbstractKahaDBStore.checkpointCleanup(AbstractKahaDBStore.java:739)
        at 
org.apache.activemq.store.kahadb.AbstractKahaDBStore$2.run(AbstractKahaDBStore.java:707)
 {code}
 

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact


Reply via email to