Github user adeneche commented on a diff in the pull request:
https://github.com/apache/drill/pull/503#discussion_r63308753
--- Diff:
exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/Foreman.java ---
@@ -1221,6 +1223,12 @@ public void interrupted(final InterruptedException
e) {
* to the user
*/
public void moveToState(final QueryState newState, final Exception ex)
{
+ // if the current thread is the foreman thread, throw an exception
+ // otherwise the foreman will be blocked forever on
acceptExternalEvents
+ if (myThreadRef == Thread.currentThread()) {
--- End diff --
In practice, the foreman thread is never meant to call moveToState
otherwise it would block forever on the latch. The only cases I've seen this
happen are when the foreman [fails to submit a remote
fragment](https://github.com/apache/drill/blob/master/exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/Foreman.java#L1194),
and when the foreman [fails to send the final state to the
user](https://github.com/apache/drill/blob/master/exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/Foreman.java#L1238)
In both cases, the default behavior is to have another thread (rpc) call
moveToState, but sometimes,
[RpcBus.send](https://github.com/apache/drill/blob/master/exec/rpc/src/main/java/org/apache/drill/exec/rpc/RpcBus.java#L126)
causes the foreman thread to explicitly call moveToState.
For example, in the second case, throwing an exception in moveToState will
cause the foreman to stop submitting the remaining remote fragments and it will
be propagated to Foreman.run where it will cause the foreman to [move to a
failed
state](https://github.com/apache/drill/blob/master/exec/java-exec/src/main/java/org/apache/drill/exec/work/foreman/Foreman.java#L264)
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---