Jerry Cwiklik created UIMA-5036:
-----------------------------------
Summary: UIMA-DUCC: fix Agent RejectedExecutionException
Key: UIMA-5036
URL: https://issues.apache.org/jira/browse/UIMA-5036
Project: UIMA
Issue Type: Bug
Components: DUCC
Reporter: Jerry Cwiklik
Assignee: Jerry Cwiklik
Fix For: future-DUCC
Fix a race condition which leads to RejectedExecutionException in
LinuxProcessMetricsProcessor.process() method. The method fails with this stack
trace:
java.util.concurrent.RejectedExecutionException: Task
java.util.concurrent.FutureTask@4c38895 rejected from
java.util.concurrent.ThreadPoolExecutor@41c10669[Terminated, pool \
size = 0, active threads = 0, queued tasks = 0, completed tasks = 2052]
at
java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
at
java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
at
java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
at
java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
at
org.apache.uima.ducc.agent.processors.LinuxProcessMetricsProcessor.process(LinuxProcessMetricsProcessor.java:291)
at
org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
at
org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:460)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at
org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:190)
at
org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:165)
at
org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:73)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)
In the above, the thread pool state shows as Terminated when a submit API was
called. This means that the thread pool was stopped when the code was trying to
use the pool.
Each process spawned by an Agent has a Camel driven timer which triggers
metrics collection. The metrics are collected in multiple threads provided by
the thread pool.
The fix is to synchronize code in close() and process() on a common lock. In
stop() the code sets a boolean indicating that the metrics collection should
not take place. In the process(), the code checks the boolean to determine if
it should proceed.
The Camel driven timer is eventually stopped in a code handling process
termination.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)