nathanmarz/storm · error · InterruptedException
Disruptor processing interrupted
Error message
Disruptor processing interrupted
What it means
Thrown inside DisruptorQueue.consumeBatchToCursor when the consumer thread waiting on/processing the ring buffer is interrupted (InterruptedException) while handling events or flushing the cache. It signals that the executor's batching thread was interrupted, typically during topology shutdown, and the interrupt is wrapped and rethrown so Storm's shutdown logic can recognize it.
Solutions
- If seen during topology kill/deactivate, it is expected shutdown behavior and can be ignored.
- If seen during normal operation, check for external code calling Thread.interrupt() on Storm worker threads.
- Ensure custom event handlers passed to the queue do not swallow or spuriously trigger interrupts.
- Restart the worker if the consumer thread is left in a bad state after an unexpected interrupt.
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at storm-core/src/jvm/backtype/storm/utils/DisruptorQueue.java:102 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of nathanmarz/storm@cdb116e942 (2026-09-12).
Data as JSON: /api/errors/a0efdc2156db8952.
Report an issue: GitHub.
Appendix: source
Thrown at storm-core/src/jvm/backtype/storm/utils/DisruptorQueue.java:102
}
}
private void consumeBatchToCursor(long cursor, EventHandler<Object> handler) {
for(long curr = _consumer.get() + 1; curr <= cursor; curr++) {
try {
MutableObject mo = _buffer.get(curr);
Object o = mo.o;
mo.setObject(null);
if(o==FLUSH_CACHE) {
Object c = null;
while(true) {
c = _cache.poll();
if(c==null) break;
else handler.onEvent(c, curr, true);
}
} else if(o==INTERRUPT) {
throw new InterruptedException("Disruptor processing interrupted");
} else {
handler.onEvent(o, curr, curr == cursor);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//TODO: only set this if the consumer cursor has changed?
_consumer.set(cursor);
}
/*
* Caches until consumerStarted is called, upon which the cache is flushed to the consumer
*/
public void publish(Object obj) {
try {
publish(obj, true);
} catch (InsufficientCapacityException ex) {View on GitHub (pinned to cdb116e942)