diff options
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)); |