diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-04-29 11:41:02 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-04-29 11:54:42 +0200 |
commit | 18adec188de46c13826b1896d3d8518f8424d67f (patch) | |
tree | ed8258dde129159d630697bc0874a908f9ff794c /configserver/src/main/java/com/yahoo | |
parent | 11fc2eece8075c8eefd104f8754e973425e5304c (diff) |
Use vespajlib maintenance package in configserver
Diffstat (limited to 'configserver/src/main/java/com/yahoo')
6 files changed, 87 insertions, 86 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ConfigServerMaintainer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ConfigServerMaintainer.java new file mode 100644 index 00000000000..06d8d41791d --- /dev/null +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ConfigServerMaintainer.java @@ -0,0 +1,81 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.config.server.maintenance; + +import com.yahoo.concurrent.maintenance.JobControl; +import com.yahoo.concurrent.maintenance.Maintainer; +import com.yahoo.concurrent.maintenance.StringSetSerializer; +import com.yahoo.path.Path; +import com.yahoo.transaction.Mutex; +import com.yahoo.vespa.config.server.ApplicationRepository; +import com.yahoo.vespa.curator.Curator; + +import java.time.Duration; +import java.util.HashSet; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * A maintainer is some job which runs at a fixed interval to perform some maintenance task in the config server. + * + * @author hmusum + */ +public abstract class ConfigServerMaintainer extends Maintainer { + + protected final ApplicationRepository applicationRepository; + + ConfigServerMaintainer(ApplicationRepository applicationRepository, Curator curator, Duration interval) { + this(applicationRepository, curator, interval, interval); + } + + ConfigServerMaintainer(ApplicationRepository applicationRepository, Curator curator, Duration initialDelay, Duration interval) { + super(null, interval, initialDelay, new JobControl(new JobControlDb(curator))); + this.applicationRepository = applicationRepository; + } + + private static class JobControlDb implements JobControl.Db { + + private static final Logger log = Logger.getLogger(JobControlDb.class.getName()); + + private static final Path root = Path.fromString("/configserver/v1/"); + private static final Path lockRoot = root.append("locks"); + private static final Path inactiveJobsPath = root.append("inactiveJobs"); + + private final Curator curator; + private final StringSetSerializer serializer = new StringSetSerializer(); + + public JobControlDb(Curator curator) { + this.curator = curator; + } + + @Override + public Set<String> readInactiveJobs() { + try { + return curator.getData(inactiveJobsPath) + .filter(data -> data.length > 0) + .map(serializer::fromJson).orElseGet(HashSet::new); + } catch (RuntimeException e) { + log.log(Level.WARNING, "Error reading inactive jobs, deleting inactive state"); + writeInactiveJobs(Set.of()); + return new HashSet<>(); + } + } + + @Override + public void writeInactiveJobs(Set<String> inactiveJobs) { + curator.set(inactiveJobsPath, serializer.toJson(inactiveJobs)); + } + + @Override + public Mutex lockInactiveJobs() { + return curator.lock(lockRoot.append("inactiveJobsLock"), Duration.ofSeconds(1)); + } + + @Override + public Mutex lockMaintenanceJob(String job) { + return curator.lock(lockRoot.append(job), Duration.ofSeconds(1)); + } + + } + +} diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ConfigServerMaintenance.java b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ConfigServerMaintenance.java index e2495de18ba..797c18681ec 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ConfigServerMaintenance.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ConfigServerMaintenance.java @@ -37,9 +37,9 @@ public class ConfigServerMaintenance extends AbstractComponent { @Override public void deconstruct() { - //tenantsMaintainer.deconstruct(); - fileDistributionMaintainer.deconstruct(); - sessionsMaintainer.deconstruct(); + //tenantsMaintainer.close(); + fileDistributionMaintainer.close(); + sessionsMaintainer.close(); } /* diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/FileDistributionMaintainer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/FileDistributionMaintainer.java index 8388159ba07..b4ae81376ad 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/FileDistributionMaintainer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/FileDistributionMaintainer.java @@ -16,7 +16,7 @@ import java.time.Duration; * * @author hmusum */ -public class FileDistributionMaintainer extends Maintainer { +public class FileDistributionMaintainer extends ConfigServerMaintainer { private final ApplicationRepository applicationRepository; private final File fileReferencesDir; diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/Maintainer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/Maintainer.java deleted file mode 100644 index e40d9153ad1..00000000000 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/Maintainer.java +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.config.server.maintenance; - -import com.google.common.util.concurrent.UncheckedTimeoutException; -import com.yahoo.component.AbstractComponent; -import com.yahoo.concurrent.DaemonThreadFactory; -import com.yahoo.path.Path; -import com.yahoo.vespa.config.server.ApplicationRepository; -import com.yahoo.vespa.curator.Curator; -import com.yahoo.vespa.curator.Lock; - -import java.time.Duration; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * A maintainer is some job which runs at a fixed interval to perform some maintenance task in the config server. - * - * @author hmusum - */ -public abstract class Maintainer extends AbstractComponent implements Runnable { - - protected static final Logger log = Logger.getLogger(Maintainer.class.getName()); - private static final Path root = Path.fromString("/configserver/v1/"); - private static final Path lockRoot = root.append("locks"); - - private final Duration maintenanceInterval; - private final ScheduledExecutorService service; - protected final ApplicationRepository applicationRepository; - protected final Curator curator; - - Maintainer(ApplicationRepository applicationRepository, Curator curator, Duration interval) { - this(applicationRepository, curator, interval, interval); - } - - Maintainer(ApplicationRepository applicationRepository, Curator curator, Duration initialDelay, Duration interval) { - this.applicationRepository = applicationRepository; - this.curator = curator; - this.maintenanceInterval = interval; - service = new ScheduledThreadPoolExecutor(1, new DaemonThreadFactory(name())); - service.scheduleAtFixedRate(this, initialDelay.toMillis(), interval.toMillis(), TimeUnit.MILLISECONDS); - } - - - @Override - @SuppressWarnings({"try", "unused"}) - public void run() { - try (Lock lock = curator.lock(lockRoot.append(name()), Duration.ofSeconds(1))) { - maintain(); - } catch (UncheckedTimeoutException e) { - // another config server instance is running this job at the moment; ok - } catch (Throwable t) { - log.log(Level.WARNING, this + " failed. Will retry in " + maintenanceInterval.toMinutes() + " minutes", t); - } - } - - @Override - public void deconstruct() { - this.service.shutdown(); - } - - /** - * Called once each time this maintenance job should run - */ - protected abstract void maintain(); - - public String name() { return this.getClass().getSimpleName(); } - - /** - * Returns the name of this - */ - @Override - public final String toString() { - return name(); - } - -} diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java index 7da868303e2..c4f0c5fdd5d 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java @@ -13,7 +13,7 @@ import java.time.Duration; * * @author hmusum */ -public class SessionsMaintainer extends Maintainer { +public class SessionsMaintainer extends ConfigServerMaintainer { private final boolean hostedVespa; SessionsMaintainer(ApplicationRepository applicationRepository, Curator curator, Duration interval) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainer.java index 86bd4e8db8e..f0753638101 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/TenantsMaintainer.java @@ -12,7 +12,7 @@ import java.time.Instant; * * @author hmusum */ -public class TenantsMaintainer extends Maintainer { +public class TenantsMaintainer extends ConfigServerMaintainer { private final Duration ttlForUnusedTenant; |