Merge branch 'stable-3.11'

* stable-3.11:
  Disable replication lag tracking by configuration

Change-Id: I1c32657335b5aea1def4de7c866008d7b80d80f2
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 0ae4738..a7a05d3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java
@@ -56,6 +56,7 @@
 
   private static final String REF_DATABASE = "ref-database";
   private static final String REPLICATION_LAG_REFRESH_INTERVAL = "replicationLagRefreshInterval";
+  private static final String REPLICATION_LAG_ENABLED = "replicationLagEnabled";
   private static final Duration REPLICATION_LAG_REFRESH_INTERVAL_DEFAULT = Duration.ofSeconds(60);
 
   private static final String REPLICATION_CONFIG = "replication.config";
@@ -77,6 +78,7 @@
   private final Supplier<ReplicationFilter> replicationFilter;
   private final Config multiSiteConfig;
   private final Supplier<Duration> replicationLagRefreshInterval;
+  private final Supplier<Boolean> replicationLagEnabled;
 
   @Inject
   Configuration(SitePaths sitePaths) {
@@ -110,6 +112,12 @@
                         REPLICATION_LAG_REFRESH_INTERVAL,
                         REPLICATION_LAG_REFRESH_INTERVAL_DEFAULT.toMillis(),
                         TimeUnit.MILLISECONDS)));
+    replicationLagEnabled =
+        memoize(
+            () ->
+                lazyMultiSiteCfg
+                    .get()
+                    .getBoolean(REF_DATABASE, null, REPLICATION_LAG_ENABLED, true));
   }
 
   public Config getMultiSiteConfig() {
@@ -148,6 +156,10 @@
     return replicationLagRefreshInterval.get();
   }
 
+  public boolean replicationLagEnabled() {
+    return replicationLagEnabled.get();
+  }
+
   public Collection<Message> validate() {
     return replicationConfigValidation.get();
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/ReplicationStatus.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/ReplicationStatus.java
index 0253588..eb07cce 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/ReplicationStatus.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/ReplicationStatus.java
@@ -232,4 +232,8 @@
   public void onProjectDeleted(Event event) {
     removeProjectFromReplicationLagMetrics(Project.nameKey(event.getProjectName()));
   }
+
+  public boolean replicationLagEnabled() {
+    return config.replicationLagEnabled();
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
index bb971ff..ef71862 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
@@ -70,28 +70,31 @@
                 .setRate()
                 .setUnit("errors"),
             stringField(SUBSCRIBER_FAILURE_COUNTER, "Subscriber failed to consume messages count"));
-    metricMaker.newCallbackMetric(
-        REPLICATION_LAG_SEC,
-        Long.class,
-        new Description("Replication lag (sec)").setGauge().setUnit(Description.Units.SECONDS),
-        replicationStatus::getMaxLag);
-    metricMaker.newCallbackMetric(
-        REPLICATION_LAG_MSEC,
-        Long.class,
-        new Description("Replication lag (msec)")
-            .setGauge()
-            .setUnit(Description.Units.MILLISECONDS),
-        replicationStatus::getMaxLagMillis);
 
-    CallbackMetric1<String, Long> metrics =
-        metricMaker.newCallbackMetric(
-            SubscriberMetrics.REPLICATION_LAG_MSEC_PROJECT,
-            Long.class,
-            new Description("Per-project replication lag (msec)")
-                .setGauge()
-                .setUnit(Description.Units.MILLISECONDS),
-            PROJECT_NAME);
-    metricMaker.newTrigger(metrics, replicationStatus.replicationLagMetricPerProject(metrics));
+    if (replicationStatus.replicationLagEnabled()) {
+      metricMaker.newCallbackMetric(
+          REPLICATION_LAG_SEC,
+          Long.class,
+          new Description("Replication lag (sec)").setGauge().setUnit(Description.Units.SECONDS),
+          replicationStatus::getMaxLag);
+      metricMaker.newCallbackMetric(
+          REPLICATION_LAG_MSEC,
+          Long.class,
+          new Description("Replication lag (msec)")
+              .setGauge()
+              .setUnit(Description.Units.MILLISECONDS),
+          replicationStatus::getMaxLagMillis);
+
+      CallbackMetric1<String, Long> metrics =
+          metricMaker.newCallbackMetric(
+              SubscriberMetrics.REPLICATION_LAG_MSEC_PROJECT,
+              Long.class,
+              new Description("Per-project replication lag (msec)")
+                  .setGauge()
+                  .setUnit(Description.Units.MILLISECONDS),
+              PROJECT_NAME);
+      metricMaker.newTrigger(metrics, replicationStatus.replicationLagMetricPerProject(metrics));
+    }
   }
 
   /**
@@ -131,6 +134,9 @@
   }
 
   public void updateReplicationStatusMetrics(Event event) {
+    if (!replicationStatus.replicationLagEnabled()) {
+      return;
+    }
 
     if (event instanceof RefReplicationDoneEvent
         || event instanceof RefReplicatedEvent
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/event/EventModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/event/EventModule.java
index 8c67823..3d43a24 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/event/EventModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/event/EventModule.java
@@ -47,8 +47,10 @@
     OptionalBinder<ProjectVersionRefUpdate> projectVersionRefUpdateBinder =
         OptionalBinder.newOptionalBinder(binder(), ProjectVersionRefUpdate.class);
     if (configuration.getSharedRefDbConfiguration().getSharedRefDb().isEnabled()) {
-      DynamicSet.bind(binder(), GitBatchRefUpdateListener.class)
-          .to(ProjectVersionRefUpdateImpl.class);
+      if (configuration.replicationLagEnabled()) {
+        DynamicSet.bind(binder(), GitBatchRefUpdateListener.class)
+            .to(ProjectVersionRefUpdateImpl.class);
+      }
       projectVersionRefUpdateBinder.setBinding().to(ProjectVersionRefUpdateImpl.class);
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/http/HttpModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/http/HttpModule.java
index 26bfb53..336bc86 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/http/HttpModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/http/HttpModule.java
@@ -31,7 +31,7 @@
 
   @Override
   protected void configureServlets() {
-    if (config.event().synchronize()) {
+    if (config.event().synchronize() && config.replicationLagEnabled()) {
       serve(String.format("/%s", LAG_ENDPOINT_SEGMENT)).with(ReplicationStatusServlet.class);
     }
   }
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index 7cd3f5c..63469f3 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -91,6 +91,8 @@
 
 `metric=plugins/multi-site/multi_site/subscriber/subscriber_message_consumer_failure_counter/subscriber_msg_consumer_poll_failure_counter, type=com.codahale.metrics.Meter`
 
+### Replication lag
+
 * Subscriber replication lag (sec behind the producer)
 
 `metric=site/multi_site/subscriber/subscriber_replication_status/sec_behind, type=com.google.gerrit.metrics.dropwizard.CallbackMetricImpl`
@@ -98,3 +100,6 @@
 * Subscriber replication lag (millisec behind the producer)
 
 `metric=site/multi_site/subscriber/subscriber_replication_status/msec_behind, type=com.google.gerrit.metrics.dropwizard.CallbackMetricImpl`
+
+> **NOTE**: The replication lag metrics are omitted when `ref-database.replicationLagEnabled` configuration
+> setting in `multi-site.config` is set to `false`.
\ No newline at end of file
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 0485d5b..7547fd9 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -95,10 +95,18 @@
 :   Enable the use of a shared ref-database
     Defaults: true
 
+```ref-database.replicationLagEnabled```
+:   Enable the metrics to trace the auto-replication lag between sites
+    updating the `refs/multi-site/version/*` to the _epoch_ timestamp in
+    milliseconds. Please note that the `replication-lag` REST-API is also
+    disabled if this setting is false.
+    Defaults: true
+
 ```ref-database.replicationLagRefreshInterval```
 :   Enable the auto-refresh of the metrics to trace the auto-replication
     lag by polling on a regular basis. Set to zero for disabling the polling
-    mechanism.
+    mechanism. Disabled automatically when `ref-database.replicationLagEnable`
+    is set to false.
     Defaults: 60 min
 
 ```ref-database.enforcementRules.<policy>```
diff --git a/src/main/resources/Documentation/http-endpoints.md b/src/main/resources/Documentation/http-endpoints.md
index ff56fdf..3774a38 100644
--- a/src/main/resources/Documentation/http-endpoints.md
+++ b/src/main/resources/Documentation/http-endpoints.md
@@ -39,4 +39,6 @@
 * limit=LIMIT
 
 maximum number of projects to return
-*default:10*
\ No newline at end of file
+*default:10*
+
+> **NOTE** This endpoint is disabled when `ref-database.replicationLagEnabled` is set to `false`.
\ No newline at end of file