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