summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2018-08-02 10:53:19 +0200
committerMartin Polden <mpolden@mpolden.no>2018-08-02 11:37:08 +0200
commit9cfe5dad619b29bff97ddc408e86f0bef8abcdd5 (patch)
tree3b0bc1cd2a9ae788a02abecb8d7025fe5091709e /node-repository
parent06ad98ef6c60e875733c8345baf767fbff71eb57 (diff)
Shut down deployment executor properly
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java22
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java6
2 files changed, 25 insertions, 3 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java
index e93926e121c..62dc9c2395f 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ApplicationMaintainer.java
@@ -17,8 +17,9 @@ import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -33,7 +34,10 @@ public abstract class ApplicationMaintainer extends Maintainer {
// Use a fixed thread pool to avoid overload on config servers. Resource usage when deploying varies
// a lot between applications, so doing one by one avoids issues where one or more resource-demanding
// deployments happen simultaneously
- private final Executor deploymentExecutor = Executors.newSingleThreadExecutor(new DaemonThreadFactory("node repo application maintainer"));
+ private final ThreadPoolExecutor deploymentExecutor = new ThreadPoolExecutor(1, 1,
+ 0L, TimeUnit.MILLISECONDS,
+ new LinkedBlockingQueue<>(),
+ new DaemonThreadFactory("node repo application maintainer"));
protected ApplicationMaintainer(Deployer deployer, NodeRepository nodeRepository, Duration interval, JobControl jobControl) {
super(nodeRepository, interval, jobControl);
@@ -115,4 +119,16 @@ public abstract class ApplicationMaintainer extends Maintainer {
return ! nodeRepository().getNodes(application, Node.State.active).isEmpty();
}
+ @Override
+ public void deconstruct() {
+ super.deconstruct();
+ this.deploymentExecutor.shutdownNow();
+ try {
+ // Give deployments in progress some time to complete
+ this.deploymentExecutor.awaitTermination(1, TimeUnit.MINUTES);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java
index 2994657f6e3..34e2bd633f3 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java
@@ -29,6 +29,7 @@ import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder;
import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner;
import com.yahoo.vespa.hosted.provision.testutils.MockDeployer;
import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -69,6 +70,11 @@ public class PeriodicApplicationMaintainerTest {
createHostNodes(2, nodeRepository, nodeFlavors);
}
+ @After
+ public void after() {
+ this.fixture.maintainer.deconstruct();
+ }
+
@Test
public void test_application_maintenance() {
// Create applications