Reset *ReplicationFilterEnabled automatically at startup When the push/pull-replication plugin is not available, the filtering of refs should also be automatically disabled. That was happening before this change, but the associated property was not reset in the in-memory configuration object, leading other parts of the codebase assume that the filter was enabled when it wasn't. For example, when the multi-site.config looks like [ref-database] pullReplicationFilterClassEnabled = true but there is no pull-replication.jar in the $GERRIT_SITE/plugins then the pullReplicationFilterEnabled() was returning true whilst that wasn't the case, as the pull-replication plugin is not loaded and therefore the filter isn't active and enabled either. Change-Id: I5a19d23f75d0b9e2cb4c19705bd2a043f73ff25d
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java index 1be09aa..7480a46 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java
@@ -22,6 +22,7 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Strings; import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.SitePaths; @@ -83,8 +84,8 @@ private final Config multiSiteConfig; private final Supplier<Duration> replicationLagRefreshInterval; private final Supplier<Boolean> replicationLagEnabled; - private final Supplier<Boolean> pushReplicationFilterEnabled; - private final Supplier<Boolean> pullReplicationFilterEnabled; + private Supplier<Boolean> pushReplicationFilterEnabled; + private Supplier<Boolean> pullReplicationFilterEnabled; private final Supplier<Long> localRefLockTimeoutMsec; @Inject @@ -194,10 +195,18 @@ return pushReplicationFilterEnabled.get(); } + public void disablePushReplicationFilter() { + pushReplicationFilterEnabled = Suppliers.ofInstance(false); + } + public boolean pullRepllicationFilterEnabled() { return pullReplicationFilterEnabled.get(); } + public void disablePullReplicationFilter() { + pullReplicationFilterEnabled = Suppliers.ofInstance(false); + } + public long localRefLockTimeoutMsec() { return localRefLockTimeoutMsec.get(); }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java index 3ced8c6..25cf774 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java +++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java
@@ -86,16 +86,20 @@ ImmutableList.Builder<AbstractModule> filterModulesBuilder = ImmutableList.builder(); if (config.pushReplicationFilterEnabled()) { - bindReplicationFilterClass(PUSH_REPLICATION_FILTER_MODULE, filterModulesBuilder); + if (!bindReplicationFilterClass(PUSH_REPLICATION_FILTER_MODULE, filterModulesBuilder)) { + config.disablePushReplicationFilter(); + } } if (config.pullRepllicationFilterEnabled()) { - bindReplicationFilterClass(PULL_REPLICATION_FILTER_MODULE, filterModulesBuilder); + if (!bindReplicationFilterClass(PULL_REPLICATION_FILTER_MODULE, filterModulesBuilder)) { + config.disablePullReplicationFilter(); + } } return filterModulesBuilder.build(); } - private void bindReplicationFilterClass( + private boolean bindReplicationFilterClass( String filterClassName, ImmutableList.Builder<AbstractModule> filterModulesBuilder) { try { @SuppressWarnings("unchecked") @@ -106,9 +110,11 @@ parentInjector.createChildInjector(filterModule); filterModulesBuilder.add(filterModule); + return true; } catch (NoClassDefFoundError | ClassNotFoundException e) { log.atWarning().withCause(e).log( "Not loading %s because of missing the associated replication plugin", filterClassName); + return false; } catch (Exception e) { throw new ProvisionException( "Unable to instantiate replication filter " + filterClassName, e);