[REEF-1655] Close the driver restart manager on driver shutdown
* Make `DriverRuntimeRestartManager` implement `AutoCloseable` to shut down the timer thread;
* Invoke `.close()` method in `DriverRuntimeStopHandler` on driver shutdown
JIRA:
[REEF-1655](https://issues.apache.org/jira/browse/REEF-1655)
Pull request:
This closes #1170
diff --git a/lang/java/reef-common/src/main/java/org/apache/reef/driver/restart/DriverRestartManager.java b/lang/java/reef-common/src/main/java/org/apache/reef/driver/restart/DriverRestartManager.java
index 58c809e..c8f9f24 100644
--- a/lang/java/reef-common/src/main/java/org/apache/reef/driver/restart/DriverRestartManager.java
+++ b/lang/java/reef-common/src/main/java/org/apache/reef/driver/restart/DriverRestartManager.java
@@ -44,15 +44,17 @@
@DriverSide
@Private
@Unstable
-public final class DriverRestartManager implements DriverIdlenessSource {
+public final class DriverRestartManager implements DriverIdlenessSource, AutoCloseable {
+
private static final String CLASS_NAME = DriverRestartManager.class.getName();
private static final Logger LOG = Logger.getLogger(CLASS_NAME);
+ private final Timer restartCompletedTimer = new Timer(this.getClass().getSimpleName() + ":Timer");
+
private final DriverRuntimeRestartManager driverRuntimeRestartManager;
private final Set<EventHandler<DriverRestartCompleted>> driverRestartCompletedHandlers;
private final Set<EventHandler<DriverRestartCompleted>> serviceDriverRestartCompletedHandlers;
private final int driverRestartEvaluatorRecoverySeconds;
- private final Timer restartCompletedTimer = new Timer();
private RestartEvaluators restartEvaluators;
private DriverRestartState state = DriverRestartState.NOT_RESTARTED;
@@ -335,4 +337,13 @@
CLASS_NAME + " currently in the process of restart.";
return new IdleMessage(CLASS_NAME, idleMessage, idleState);
}
+
+ /**
+ * Close the restart timer.
+ */
+ @Override
+ public void close() {
+ LOG.log(Level.FINER, "Closing restart timer. Final state: {0}", this.state);
+ this.restartCompletedTimer.cancel();
+ }
}
diff --git a/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/DriverRuntimeStopHandler.java b/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/DriverRuntimeStopHandler.java
index 678a596..d344cf3 100644
--- a/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/DriverRuntimeStopHandler.java
+++ b/lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/DriverRuntimeStopHandler.java
@@ -21,6 +21,7 @@
import org.apache.reef.annotations.audience.DriverSide;
import org.apache.reef.annotations.audience.Private;
import org.apache.reef.driver.parameters.ResourceManagerPreserveEvaluators;
+import org.apache.reef.driver.restart.DriverRestartManager;
import org.apache.reef.exception.DriverFatalRuntimeException;
import org.apache.reef.runtime.common.driver.api.ResourceManagerStopHandler;
import org.apache.reef.runtime.common.driver.evaluator.Evaluators;
@@ -44,6 +45,7 @@
private static final Logger LOG = Logger.getLogger(DriverRuntimeStopHandler.class.getName());
+ private final DriverRestartManager driverRestartManager;
private final DriverStatusManager driverStatusManager;
private final ResourceManagerStopHandler resourceManagerStopHandler;
private final RemoteManager remoteManager;
@@ -51,13 +53,15 @@
private final boolean preserveEvaluatorsAcrossRestarts;
@Inject
- DriverRuntimeStopHandler(
+ private DriverRuntimeStopHandler(
+ @Parameter(ResourceManagerPreserveEvaluators.class) final boolean preserveEvaluatorsAcrossRestarts,
+ final DriverRestartManager driverRestartManager,
final DriverStatusManager driverStatusManager,
final ResourceManagerStopHandler resourceManagerStopHandler,
final RemoteManager remoteManager,
- final Evaluators evaluators,
- @Parameter(ResourceManagerPreserveEvaluators.class) final boolean preserveEvaluatorsAcrossRestarts) {
+ final Evaluators evaluators) {
+ this.driverRestartManager = driverRestartManager;
this.driverStatusManager = driverStatusManager;
this.resourceManagerStopHandler = resourceManagerStopHandler;
this.remoteManager = remoteManager;
@@ -93,5 +97,7 @@
LOG.log(Level.WARNING, "Error when closing the RemoteManager", e);
throw new RuntimeException("Unable to close the RemoteManager.", e);
}
+
+ this.driverRestartManager.close();
}
}