Github user ilooner commented on a diff in the pull request:
https://github.com/apache/drill/pull/1105#discussion_r173543287
--- Diff:
exec/java-exec/src/main/java/org/apache/drill/exec/work/fragment/FragmentExecutor.java
---
@@ -245,19 +306,17 @@ public Void run() throws Exception {
// we have a heap out of memory error. The JVM in unstable, exit.
CatastrophicFailure.exit(e, "Unable to handle out of memory
condition in FragmentExecutor.", -2);
}
+ } catch (InterruptedException e) {
+ // Swallow interrupted exceptions since we intentionally interrupt
the root when cancelling a query
+ logger.trace("Interruped root: {}", e);
} catch (Throwable t) {
fail(t);
} finally {
- // no longer allow this thread to be interrupted. We synchronize
here to make sure that cancel can't set an
- // interruption after we have moved beyond this block.
- synchronized (myThreadRef) {
- myThreadRef.set(null);
- Thread.interrupted();
- }
-
- // Make sure the event processor is started at least once
- eventProcessor.start();
+ // Don't process any more termination requests, we are done.
+ eventProcessor.terminate();
--- End diff --
There is a corner case. If we didn't include eventProcessor.terminate() we
could theoretically receive a cancellation request for the first time after the
interrupts were cleared for the FragmentExecutor#run thread. The cancellation
would then interrupt the Thread again, and our FragmentExecutor would finish
and leave the thread it used in an interrupted state. This could cause problems
for the next FragmentExecutor that uses the same thread.
---