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;