jbonofre opened a new pull request, #1963:
URL: https://github.com/apache/activemq/pull/1963
The static `READ_CHECK_TIMER` and `WRITE_CHECK_TIMER` in
`AbstractInactivityMonitor` are shared across all transport instances. Java's
Timer permanently marks itself cancelled when its internal thread exits due to
an unhandled Error thrown by a TimerTask. `SchedulerTimerTask` rethrows Error
subclasses, so an `OutOfMemoryError` in any timer task kills the shared timer
thread while the static field remains non-null. All subsequent `schedule()`
calls on new connections then throw `IllegalStateException ("Timer already
cancelled")`, which propagates to `TransportConnector.onAcceptError()` and is
logged as `WARN "Could not accept connection: Timer already cancelled."`
Here's my fix proposal: wrap the `schedule()` calls in
`startConnectCheckTask()` and `startMonitorThreads()` in
`try/catch(IllegalStateException)`. On catch, the dead timer is cancelled (to
let its thread exit), replaced with a fresh instance, and the task is
rescheduled. The guard condition in `startConnectCheckTask()` is also extended
with `|| READ_CHECK_TIMER == null` to cover the case where the field is
unexpectedly `null` when `CHECKER_COUNTER > 0`.
I added three regression tests to InactivityMonitorTest covering:
- READ_CHECK_TIMER cancelled with CHECKER_COUNTER == 0
(startConnectCheckTask path)
- READ_CHECK_TIMER cancelled with CHECKER_COUNTER > 0 (production scenario)
- WRITE_CHECK_TIMER cancelled (startMonitorThreads path)
Also, tests use Wait.waitFor() instead of Thread.sleep() for reliability on
slow CI.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information, visit: https://activemq.apache.org/contact