Cancel auto-reload runnable at configuration shutdown Avoid having multiple auto-reload runnable when the configuration is shut down and restarted. The situation happens quite often when the configuration is reloaded and generates unnecessary extra concurrency on the configuration objects other than increasingly consuming additional tasks. Bug: Issue 11187 Change-Id: Ic03ce3fceb0df746d20437ae7cf4d2a8f4822d02
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java b/src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java index a09b0c9..6b42464 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java
@@ -29,6 +29,7 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.transport.URIish; @@ -50,6 +51,7 @@ // ReplicationConfig private final Provider<ReplicationQueue> replicationQueue; private final ScheduledExecutorService autoReloadExecutor; + private ScheduledFuture<?> autoReloadRunnable; @Inject public AutoReloadConfigDecorator( @@ -144,13 +146,18 @@ @Override public synchronized int shutdown() { + if (autoReloadRunnable != null) { + autoReloadRunnable.cancel(false); + autoReloadRunnable = null; + } return currentConfig.shutdown(); } @Override public synchronized void startup(WorkQueue workQueue) { currentConfig.startup(workQueue); - autoReloadExecutor.scheduleAtFixedRate( - this::reloadIfNeeded, RELOAD_DELAY, RELOAD_INTERVAL, TimeUnit.SECONDS); + autoReloadRunnable = + autoReloadExecutor.scheduleAtFixedRate( + this::reloadIfNeeded, RELOAD_DELAY, RELOAD_INTERVAL, TimeUnit.SECONDS); } }