From ae0051eb76a2600bdcce5a119de06f367be7d164 Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Thu, 9 Jul 2020 11:07:32 +0200 Subject: Control maintenance jobs with feature flag --- .../yahoo/concurrent/maintenance/JobControl.java | 44 ++++------------------ 1 file changed, 8 insertions(+), 36 deletions(-) (limited to 'vespajlib/src/main/java/com/yahoo/concurrent/maintenance/JobControl.java') diff --git a/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/JobControl.java b/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/JobControl.java index 896443117c9..583337203ab 100644 --- a/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/JobControl.java +++ b/vespajlib/src/main/java/com/yahoo/concurrent/maintenance/JobControl.java @@ -5,11 +5,12 @@ import com.yahoo.transaction.Mutex; import java.util.Collections; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentSkipListMap; /** - * Provides status and control over running maintenance jobs. + * Provides status over running maintenance jobs. * * This is multi-thread safe. * @@ -20,11 +21,11 @@ public class JobControl { /** This is not persisted as all nodes start all jobs */ private final Map startedJobs = new ConcurrentSkipListMap<>(); - /** Used to store deactivation in a persistent shared database to make changes take effect on all nodes */ - private final Db db; + /** Used for managing shared persistent state, to make changes take effect on all nodes */ + private final JobControlState state; - public JobControl(Db db) { - this.db = db; + public JobControl(JobControlState state) { + this.state = Objects.requireNonNull(state); } /** Notifies this that a job was started */ @@ -39,25 +40,13 @@ public class JobControl { public Set jobs() { return Collections.unmodifiableSet(startedJobs.keySet()); } /** Returns a snapshot containing the currently inactive jobs in this */ - public Set inactiveJobs() { return db.readInactiveJobs(); } + public Set inactiveJobs() { return state.readInactiveJobs(); } /** Returns true if this job is not currently deactivated */ public boolean isActive(String jobSimpleClassName) { return ! inactiveJobs().contains(jobSimpleClassName); } - /** Set a job active or inactive */ - public void setActive(String jobSimpleClassName, boolean active) { - try (var lock = db.lockInactiveJobs()) { - Set inactiveJobs = db.readInactiveJobs(); - if (active) - inactiveJobs.remove(jobSimpleClassName); - else - inactiveJobs.add(jobSimpleClassName); - db.writeInactiveJobs(inactiveJobs); - } - } - /** Run given job (inactive or not) immediately */ public void run(String jobSimpleClassName) { var job = startedJobs.get(jobSimpleClassName); @@ -67,24 +56,7 @@ public class JobControl { /** Acquire lock for running given job */ public Mutex lockJob(String jobSimpleClassName) { - return db.lockMaintenanceJob(jobSimpleClassName); - } - - /** The database used for managing job state and synchronization */ - public interface Db { - - /** Returns the set of jobs that are temporarily inactive */ - Set readInactiveJobs(); - - /** Make given jobs as inactive */ - void writeInactiveJobs(Set inactiveJobs); - - /** Acquire lock for changing jobs */ - Mutex lockInactiveJobs(); - - /** Acquire lock for running given job */ - Mutex lockMaintenanceJob(String job); - + return state.lockMaintenanceJob(jobSimpleClassName); } } -- cgit v1.2.3