summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java30
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java1
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java34
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainer.java3
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterUtilizationMaintainer.java3
6 files changed, 32 insertions, 41 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java b/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java
index d9039ebbe6e..ba0ede77b55 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/SearchBuilder.java
@@ -177,34 +177,6 @@ public class SearchBuilder {
}
/**
- * Registers the given search object to the internal list of objects to be processed during {@link #build()}. A
- * {@link Search} object is considered to be "processed" if it has not already been processed. This is the case for most
- * programmatically constructed search objects used in unit tests.
- *
- * @param processed The object to import.
- * @return The name of the imported object.
- * @throws IllegalArgumentException Thrown if the given search object has already been processed.
- */
- public String importProcessedSearch(Search processed) {
- if (processed.getName() == null) {
- throw new IllegalArgumentException("Search has no name.");
- }
- String rawName = processed.getName();
- if (!processed.isProcessed()) {
- throw new IllegalArgumentException("A search definition with a search section called '" + rawName +
- "' has not been processed.");
- }
- for (Search search : searchList) {
- if (rawName.equals(search.getName())) {
- throw new IllegalArgumentException("A search definition with a search section called '" + rawName +
- "' has already been added.");
- }
- }
- searchList.add(processed);
- return rawName;
- }
-
- /**
* Only for testing.
*
* Processes and finalizes the imported search definitions so that they become available through the {@link
@@ -380,6 +352,8 @@ public class SearchBuilder {
return builder;
}
+ // TODO: The build methods below just call the create methods above - remove
+
/**
* Convenience factory method to import and build a {@link Search} object from a file. Only for testing.
*
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java
index 4f873b112cf..28cf18802cf 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java
@@ -11,6 +11,7 @@ import com.yahoo.vespa.model.AbstractService;
* @author gjoranv
*/
public class Logserver extends AbstractService {
+
private static final long serialVersionUID = 1L;
private static final String logArchiveDir = "$ROOT/logs/vespa/logarchive";
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
index 7512e14643f..b4e537b2370 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
@@ -307,7 +307,7 @@ public class ApplicationController {
// Delete zones not listed in DeploymentSpec, if allowed
// We do this at deployment time to be able to return a validation failure message when necessary
- application = deleteRemovedDeployments(application);
+ application = deleteRemovedDeployments(application, lock);
// Clean up deployment jobs that are no longer referenced by deployment spec
application = deleteUnreferencedDeploymentJobs(application);
@@ -354,7 +354,7 @@ public class ApplicationController {
return new ActivateResult(new RevisionId(applicationPackage.hash()), prepareResponse);
}
- private Application deleteRemovedDeployments(Application application) {
+ private Application deleteRemovedDeployments(Application application, Lock lock) {
List<Deployment> deploymentsToRemove = application.deployments().values().stream()
.filter(deployment -> deployment.zone().environment() == Environment.prod)
.filter(deployment -> ! application.deploymentSpec().includes(deployment.zone().environment(),
@@ -375,7 +375,7 @@ public class ApplicationController {
Application applicationWithRemoval = application;
for (Deployment deployment : deploymentsToRemove)
- applicationWithRemoval = deactivate(applicationWithRemoval, deployment, false);
+ applicationWithRemoval = deactivate(applicationWithRemoval, deployment.zone(), lock);
return applicationWithRemoval;
}
@@ -556,22 +556,32 @@ public class ApplicationController {
private Application deactivate(Application application, Zone zone, Optional<Deployment> deployment,
boolean requireThatDeploymentHasExpired) {
try (Lock lock = lock(application.id())) {
- if (deployment.isPresent() && requireThatDeploymentHasExpired && ! DeploymentExpirer.hasExpired(
- controller.zoneRegistry(), deployment.get(), clock.instant())) {
+ application = controller.applications().require(application.id()); // re-get with lock
+ if (deployment.isPresent() && requireThatDeploymentHasExpired &&
+ ! DeploymentExpirer.hasExpired(controller.zoneRegistry(), deployment.get(), clock.instant())) {
return application;
}
-
- try {
- configserverClient.deactivate(new DeploymentId(application.id(), zone));
- } catch (NoInstanceException ignored) {
- // ok; already gone
- }
- application = application.withoutDeploymentIn(zone);
+ application = deactivate(application, zone, lock);
store(application, lock);
return application;
}
}
+ /**
+ * Deactivates a locked application without storing it
+ *
+ * @return the application with the deployment in the given zone removed
+ */
+ private Application deactivate(Application application, Zone zone, Lock lock) {
+ try {
+ configserverClient.deactivate(new DeploymentId(application.id(), zone));
+ }
+ catch (NoInstanceException ignored) {
+ // ok; already gone
+ }
+ return application.withoutDeploymentIn(zone);
+ }
+
public DeploymentTrigger deploymentTrigger() { return deploymentTrigger; }
private ApplicationId dashToUnderscore(ApplicationId id) {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
index 3f5877addb7..c8479f448ba 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentTrigger.java
@@ -123,6 +123,8 @@ public class DeploymentTrigger {
applications = applications.notPullRequest();
for (Application application : applications.asList()) {
try (Lock lock = applications().lock(application.id())) {
+ application = controller.applications().get(application.id()).orElse(null); // re-get with lock
+ if (application == null) continue; // application removed
triggerReadyJobs(application, lock);
}
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainer.java
index baf60b612b0..a6bf0112e5d 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterInfoMaintainer.java
@@ -87,6 +87,9 @@ public class ClusterInfoMaintainer extends Maintainer {
protected void maintain() {
for (Application application : controller().applications().asList()) {
try (Lock lock = controller().applications().lock(application.id())) {
+ application = controller.applications().get(application.id()).orElse(null); // re-get inside lock
+ if (application == null) continue; // application removed
+
for (Deployment deployment : application.deployments().values()) {
DeploymentId deploymentId = new DeploymentId(application.id(), deployment.zone());
try {
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterUtilizationMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterUtilizationMaintainer.java
index 8806651c60d..f9a3de87cab 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterUtilizationMaintainer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ClusterUtilizationMaintainer.java
@@ -44,9 +44,10 @@ public class ClusterUtilizationMaintainer extends Maintainer {
@Override
protected void maintain() {
-
for (Application application : controller().applications().asList()) {
try (Lock lock = controller().applications().lock(application.id())) {
+ application = controller.applications().get(application.id()).orElse(null); // re-get inside lock
+ if (application == null) continue; // application removed
for (Deployment deployment : application.deployments().values()) {
Map<ClusterSpec.Id, ClusterUtilization> clusterUtilization = getUpdatedClusterUtilizations(application.id(), deployment.zone());
Application app = application.with(deployment.withClusterUtils(clusterUtilization));