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;