Skip web sessions replay for persisted cache

Replaying all web sessions after startup makes sense when
`web_sessions` cache isn't persisted. For persisted caches
(when cache.*.diskLimit is greater then zero) replay can be skipped
because sessions are already in the cache

Change-Id: I7c3a035830c47c38dd183331ba4f9ea93e5f48c0
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 a0d9218..cbc11bc 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:{}", 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/test/java/com/googlesource/gerrit/plugins/websession/broker/BrokerBasedWebSessionCacheTest.java b/src/test/java/com/googlesource/gerrit/plugins/websession/broker/BrokerBasedWebSessionCacheTest.java
index c8afe82..3ad7ae4 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;
@@ -75,6 +79,7 @@
   @Mock PluginConfigFactory cfg;
   @Mock PluginConfig pluginConfig;
   @Mock WebSessionLogger webSessionLogger;
+  @Mock Config gerritConfig;
   @Captor ArgumentCaptor<Event> eventCaptor;
   @Captor ArgumentCaptor<Val> valCaptor;
 
@@ -89,17 +94,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
@@ -167,6 +163,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;