Github user paul-rogers commented on a diff in the pull request:
https://github.com/apache/drill/pull/921#discussion_r150981324
--- Diff:
exec/java-exec/src/main/java/org/apache/drill/exec/work/WorkManager.java ---
@@ -165,32 +169,59 @@ public DrillbitContext getContext() {
*
* <p>This is intended to be used by {@link
org.apache.drill.exec.server.Drillbit#close()}.</p>
*/
- public void waitToExit() {
+ public void waitToExit(Drillbit bit, boolean forcefulShutdown) {
synchronized(this) {
- if (queries.isEmpty() && runningFragments.isEmpty()) {
+ numOfRunningQueries = queries.size();
+ numOfRunningFragments = runningFragments.size();
+ if ( queries.isEmpty() && runningFragments.isEmpty()) {
return;
}
-
+ logger.info("Draining " + queries +" queries and "+
runningFragments+" fragments.");
exitLatch = new ExtendedLatch();
}
-
- // Wait for at most 5 seconds or until the latch is released.
- exitLatch.awaitUninterruptibly(5000);
+ // Wait uninterruptibly until all the queries and running fragments on
that drillbit goes down
+ // to zero
+ if( forcefulShutdown ) {
+ exitLatch.awaitUninterruptibly(5000);
+ } else {
+ exitLatch.awaitUninterruptibly();
+ }
}
/**
* If it is safe to exit, and the exitLatch is in use, signals it so
that waitToExit() will
- * unblock.
+ * unblock. Logs the number of pending fragments and queries that are
running on that
+ * drillbit to track the progress of shutdown process.
*/
private void indicateIfSafeToExit() {
synchronized(this) {
if (exitLatch != null) {
+ logger.info("Waiting for "+ queries.size() +" queries to complete
before shutting down");
+ logger.info("Waiting for "+ runningFragments.size() +" running
fragments to complete before shutting down");
+ if(runningFragments.size() > numOfRunningFragments||
queries.size() > numOfRunningQueries) {
+ logger.info("New Fragments or queries are added while drillbit
is Shutting down");
+ }
if (queries.isEmpty() && runningFragments.isEmpty()) {
+ // Both Queries and Running fragments are empty.
+ // So its safe for the drillbit to exit.
exitLatch.countDown();
}
}
}
}
+ /**
+ * Get the number of queries that are running on a drillbit.
+ * Primarily used to monitor the number of running queries after a
+ * shutdown request is triggered.
+ */
+ public Map<String, Integer> getRemainingQueries() {
+ synchronized (this) {
--- End diff --
Since the entire body is synchronized, put the `synchronized` on the method
itself.
---