Merge branch 'stable-3.6' into master

* stable-3.6:
  Format correctly Build file with buildifier
  Consume events-broker from source
  Skip web sessions replay for persisted cache

Change-Id: I710be1c22628d9b0edbb75068bc3f5dbe91f0fab
diff --git a/BUILD b/BUILD
index f0fff60..87e21b0 100644
--- a/BUILD
+++ b/BUILD
@@ -1,24 +1,24 @@
 load("//tools/bzl:junit.bzl", "junit_tests")
 load(
     "//tools/bzl:plugin.bzl",
-    "gerrit_plugin",
     "PLUGIN_DEPS",
     "PLUGIN_TEST_DEPS",
+    "gerrit_plugin",
 )
 
 gerrit_plugin(
     name = "websession-broker",
     srcs = glob(["src/main/java/**/*.java"]),
-    resources = glob(["src/main/resources/**/*"]),
-    deps = [
-        "@events-broker//jar",
-    ],
     manifest_entries = [
         "Gerrit-PluginName: websession-broker",
         "Gerrit-HttpModule: com.googlesource.gerrit.plugins.websession.broker.BrokerBasedWebSession$Module",
         "Implementation-Title: Broker WebSession",
         "Implementation-URL: https://review.gerrithub.io/admin/repos/GerritForge/plugins_websession-broker",
     ],
+    resources = glob(["src/main/resources/**/*"]),
+    deps = [
+        ":events-broker-neverlink",
+    ],
 )
 
 junit_tests(
@@ -38,6 +38,12 @@
     exports = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [
         ":websession-broker__plugin",
         "@mockito//jar",
-        "@events-broker//jar",
+        "//plugins/events-broker",
     ],
 )
+
+java_library(
+    name = "events-broker-neverlink",
+    neverlink = 1,
+    exports = ["//plugins/events-broker"],
+)
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index efe7780..1d8851b 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -15,12 +15,6 @@
     BYTE_BUDDY_VERSION = "1.9.10"
 
     maven_jar(
-        name = "events-broker",
-        artifact = "com.gerritforge:events-broker:3.5.0-alpha-202108041529",
-        sha1 = "309fe8cc08c46593d9990d4e5c448cc85e5a62b0",
-    )
-
-    maven_jar(
         name = "byte-buddy",
         artifact = "net.bytebuddy:byte-buddy:" + BYTE_BUDDY_VERSION,
         sha1 = "211a2b4d3df1eeef2a6cacf78d74a1f725e7a840",
diff --git a/src/main/java/com/googlesource/gerrit/plugins/websession/broker/BrokerBasedWebSessionCache.java b/src/main/java/com/googlesource/gerrit/plugins/websession/broker/BrokerBasedWebSessionCache.java
index d7255e2..dae6342 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/websession/broker/BrokerBasedWebSessionCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/websession/broker/BrokerBasedWebSessionCache.java
@@ -30,6 +30,7 @@
 import com.google.gerrit.httpd.WebSessionManager;
 import com.google.gerrit.httpd.WebSessionManager.Val;
 import com.google.gerrit.server.config.GerritInstanceId;
+import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.events.Event;
 import com.google.inject.Inject;
@@ -51,6 +52,7 @@
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
+import org.eclipse.jgit.lib.Config;
 
 @Singleton
 public class BrokerBasedWebSessionCache
@@ -66,6 +68,7 @@
   ExecutorService executor;
   private final WebSessionLogger webSessionLogger;
   private String instanceId;
+  private final boolean shouldReplayAllSessions;
 
   @Inject
   public BrokerBasedWebSessionCache(
@@ -76,16 +79,22 @@
       @PluginName String pluginName,
       WebSessionLogger webSessionLogger,
       @WebSessionProducerExecutor ExecutorService executor,
-      @Nullable @GerritInstanceId String gerritInstanceId) {
+      @Nullable @GerritInstanceId String gerritInstanceId,
+      @GerritServerConfig Config gerritConfig) {
     this.cache = cache;
     this.brokerApi = brokerApi;
     this.timeMachine = timeMachine;
     this.webSessionTopicName = getWebSessionTopicName(cfg, pluginName);
+    this.shouldReplayAllSessions = shouldReplayAllSessions(gerritConfig);
     this.webSessionLogger = webSessionLogger;
     this.executor = executor;
     this.instanceId = gerritInstanceId;
   }
 
+  private Boolean shouldReplayAllSessions(Config gerritConfig) {
+    return gerritConfig.getInt("cache", "web_sessions", "diskLimit", 1024) == 0;
+  }
+
   protected void processMessage(Event message) {
     if (!WebSessionEvent.TYPE.equals(message.getType())) {
       logger.atWarning().log("Skipping web session message of unknown type: %s", message.getType());
@@ -231,7 +240,9 @@
       throw new IllegalStateException("Cannot find binding for BrokerApi");
     }
     brokerApi.get().receiveAsync(webSessionTopicName, this::processMessage);
-    brokerApi.get().replayAllEvents(webSessionTopicName);
+    if (shouldReplayAllSessions) {
+      brokerApi.get().replayAllEvents(webSessionTopicName);
+    }
   }
 
   @Override
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index d18e927..86b1063 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -6,6 +6,8 @@
 Clone (or link) this plugin to the `plugins` directory of Gerrit's
 source tree. Put the external dependency Bazel build file into
 the Gerrit /plugins directory, replacing the existing empty one.
+The plugin depends on [events-broker](https://gerrit.googlesource.com/modules/events-broker)
+which is linked directly from source with the same 'in-tree' plugin structure.
 
 ```
   cd gerrit/plugins
diff --git a/src/test/java/com/googlesource/gerrit/plugins/websession/broker/BrokerBasedWebSessionCacheTest.java b/src/test/java/com/googlesource/gerrit/plugins/websession/broker/BrokerBasedWebSessionCacheTest.java
index 833d0f8..ba7175d 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/websession/broker/BrokerBasedWebSessionCacheTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/websession/broker/BrokerBasedWebSessionCacheTest.java
@@ -15,7 +15,10 @@
 package com.googlesource.gerrit.plugins.websession.broker;
 
 import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -38,6 +41,7 @@
 import com.googlesource.gerrit.plugins.websession.broker.util.TimeMachine;
 import java.time.Instant;
 import java.util.concurrent.ExecutorService;
+import org.eclipse.jgit.lib.Config;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -76,6 +80,7 @@
   @Mock PluginConfigFactory cfg;
   @Mock PluginConfig pluginConfig;
   @Mock WebSessionLogger webSessionLogger;
+  @Mock Config gerritConfig;
   @Captor ArgumentCaptor<Event> eventCaptor;
   @Captor ArgumentCaptor<Val> valCaptor;
 
@@ -90,17 +95,8 @@
         .thenReturn("gerrit_web_session");
     when(cfg.getFromGerritConfig(PLUGIN_NAME)).thenReturn(pluginConfig);
     when(timeMachine.now()).thenReturn(Instant.EPOCH);
-    DynamicItem<BrokerApi> item = DynamicItem.itemOf(BrokerApi.class, brokerApi);
-    objectUnderTest =
-        new BrokerBasedWebSessionCache(
-            cache,
-            item,
-            timeMachine,
-            cfg,
-            PLUGIN_NAME,
-            webSessionLogger,
-            executorServce,
-            instanceId);
+
+    objectUnderTest = createBroker();
   }
 
   @Test
@@ -168,6 +164,53 @@
     assertThat(cache.getIfPresent(eventMessageKey(eventMessage))).isNull();
   }
 
+  @Test
+  public void shouldSkipSessionsReplayForPersistedCache() {
+    when(gerritConfig.getInt(eq("cache"), eq("web_sessions"), eq("diskLimit"), anyInt()))
+        .thenReturn(2048);
+    objectUnderTest = createBroker();
+
+    objectUnderTest.start();
+
+    verify(brokerApi, never()).replayAllEvents(anyString());
+  }
+
+  @Test
+  public void shouldReplaySessionsForInMemoryCache() {
+    when(gerritConfig.getInt(eq("cache"), eq("web_sessions"), eq("diskLimit"), anyInt()))
+        .thenReturn(0);
+
+    objectUnderTest = createBroker();
+
+    objectUnderTest.start();
+
+    verify(brokerApi, times(1)).replayAllEvents(anyString());
+  }
+
+  @Test
+  public void shouldSkipSessionsReplayForDefaultCacheSettings() {
+    when(gerritConfig.getInt(eq("cache"), eq("web_sessions"), eq("diskLimit"), anyInt()))
+        .thenReturn(1024);
+
+    objectUnderTest = createBroker();
+    objectUnderTest.start();
+    verify(brokerApi, never()).replayAllEvents(anyString());
+  }
+
+  private BrokerBasedWebSessionCache createBroker() {
+    DynamicItem<BrokerApi> item = DynamicItem.itemOf(BrokerApi.class, brokerApi);
+    return new BrokerBasedWebSessionCache(
+        cache,
+        item,
+        timeMachine,
+        cfg,
+        PLUGIN_NAME,
+        webSessionLogger,
+        executorServce,
+        instanceId,
+        gerritConfig);
+  }
+
   private Val createVal(Event message) {
     WebSessionEvent event = (WebSessionEvent) message;