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;