Merge branch 'stable-3.11' into stable-3.12
* stable-3.11:
Set GERRIT_BRANCH to stable-3.11 for local E2E test environment
Change-Id: Id11f3258a7c31310ed56a8313f2c5f9df468f526
diff --git a/README.md b/README.md
index 1e6882c..2e13f45 100644
--- a/README.md
+++ b/README.md
@@ -32,21 +32,38 @@
The multi-site plugin can only be built in tree mode, by cloning
Gerrit and the multi-site plugin code, and checking them out on the desired branch.
-Example of cloning Gerrit and multi-site for a stable-2.16 build:
+To build the multi-site plugin in addition to the gerrit core plugins also the
+following plugins need to be present in the plugins directory:
+
+- pull-replication
+- healthcheck
+- events-broker
+- global-refdb
+
+Example of cloning Gerrit, the multi-site plugin and the plugins it depends on
+for a stable-3.11 build:
```
-git clone -b stable-2.16 https://gerrit.googlesource.com/gerrit
-git clone -b stable-2.16 https://gerrit.googlesource.com/plugins/multi-site
+git clone --recurse-submodules -b stable-3.11 https://gerrit.googlesource.com/gerrit
+git clone -b stable-3.11 https://gerrit.googlesource.com/plugins/multi-site
+git clone -b stable-3.11 https://gerrit.googlesource.com/modules/events-broker
+git clone -b stable-3.11 https://gerrit.googlesource.com/modules/global-refdb
+git clone -b stable-3.11 https://gerrit.googlesource.com/plugins/healthcheck
+git clone -b stable-3.11 https://gerrit.googlesource.com/plugins/pull-replication
cd gerrit/plugins
ln -s ../../multi-site .
+ln -s ../../events-broker .
+ln -s ../../global-refdb .
+ln -s ../../healthcheck .
+ln -s ../../pull-replication .
```
Example of building the multi-site plugin:
```
cd gerrit
-bazel build plugins/multi-site
+bazelisk build plugins/multi-site
```
The multi-site.jar plugin is generated to `bazel-bin/plugins/multi-site/multi-site.jar`.
@@ -55,13 +72,13 @@
```
cd gerrit
-bazel test plugins/multi-site:multi_site_tests
+bazelisk test plugins/multi-site/...
```
**NOTE**: The multi-site tests include also the use of Docker containers for
instantiating and using a Kafka/Zookeeper broker. Make sure you have a Docker
daemon running (/var/run/docker.sock accessible) or a DOCKER_HOST pointing to
-a Docker server.
+a Docker server. In addition docker-compose needs to be installed.
## Pre-requisites
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java
index 4415aea..1be09aa 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java
@@ -58,6 +58,8 @@
private static final String REPLICATION_LAG_REFRESH_INTERVAL = "replicationLagRefreshInterval";
private static final String REPLICATION_LAG_ENABLED = "replicationLagEnabled";
private static final Duration REPLICATION_LAG_REFRESH_INTERVAL_DEFAULT = Duration.ofSeconds(60);
+ private static final String PUSH_REPLICATION_FILTER_ENABLED = "pushReplicationFilterEnabled";
+ private static final String PULL_REPLICATION_FILTER_ENABLED = "pullReplicationFilterEnabled";
private static final String LOCAL_REF_LOCK_TIMEOUT = "localRefLockTimeout";
private static final Duration LOCAL_REF_LOCK_TIMEOUT_DEFAULT = Duration.ofSeconds(30);
@@ -81,6 +83,8 @@
private final Config multiSiteConfig;
private final Supplier<Duration> replicationLagRefreshInterval;
private final Supplier<Boolean> replicationLagEnabled;
+ private final Supplier<Boolean> pushReplicationFilterEnabled;
+ private final Supplier<Boolean> pullReplicationFilterEnabled;
private final Supplier<Long> localRefLockTimeoutMsec;
@Inject
@@ -121,6 +125,19 @@
lazyMultiSiteCfg
.get()
.getBoolean(REF_DATABASE, null, REPLICATION_LAG_ENABLED, true));
+
+ pushReplicationFilterEnabled =
+ memoize(
+ () ->
+ lazyMultiSiteCfg
+ .get()
+ .getBoolean(REF_DATABASE, null, PUSH_REPLICATION_FILTER_ENABLED, true));
+ pullReplicationFilterEnabled =
+ memoize(
+ () ->
+ lazyMultiSiteCfg
+ .get()
+ .getBoolean(REF_DATABASE, null, PULL_REPLICATION_FILTER_ENABLED, true));
localRefLockTimeoutMsec =
memoize(
() ->
@@ -173,6 +190,14 @@
return replicationLagEnabled.get();
}
+ public boolean pushReplicationFilterEnabled() {
+ return pushReplicationFilterEnabled.get();
+ }
+
+ public boolean pullRepllicationFilterEnabled() {
+ return pullReplicationFilterEnabled.get();
+ }
+
public long localRefLockTimeoutMsec() {
return localRefLockTimeoutMsec.get();
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java
index db06c9f..3ced8c6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java
@@ -35,14 +35,10 @@
public class PluginModule extends LifecycleModule {
private static final FluentLogger log = FluentLogger.forEnclosingClass();
- private static final String[] FILTER_MODULES_CLASS_NAMES =
- new String[] {
- /* Class names are defined as String for avoiding this class failing to load
- * if either replication or pull-replication plugins are missing.
- */
- "com.googlesource.gerrit.plugins.multisite.validation.PullReplicationFilterModule",
- "com.googlesource.gerrit.plugins.multisite.validation.PushReplicationFilterModule"
- };
+ public static final String PULL_REPLICATION_FILTER_MODULE =
+ "com.googlesource.gerrit.plugins.multisite.validation.PullReplicationFilterModule";
+ public static final String PUSH_REPLICATION_FILTER_MODULE =
+ "com.googlesource.gerrit.plugins.multisite.validation.PushReplicationFilterModule";
private final Configuration config;
private final WorkQueue workQueue;
@@ -89,25 +85,33 @@
private Iterable<AbstractModule> detectFilterModules() {
ImmutableList.Builder<AbstractModule> filterModulesBuilder = ImmutableList.builder();
- for (String filterClassName : FILTER_MODULES_CLASS_NAMES) {
- try {
- @SuppressWarnings("unchecked")
- Class<AbstractModule> filterClass = (Class<AbstractModule>) Class.forName(filterClassName);
-
- AbstractModule filterModule = parentInjector.getInstance(filterClass);
- // Check if the filterModule would be valid for creating a child Guice Injector
- parentInjector.createChildInjector(filterModule);
-
- filterModulesBuilder.add(filterModule);
- } catch (NoClassDefFoundError | ClassNotFoundException e) {
- log.atFine().withCause(e).log(
- "Not loading %s because of missing the associated replication plugin", filterClassName);
- } catch (Exception e) {
- throw new ProvisionException(
- "Unable to instantiate replication filter " + filterClassName, e);
- }
+ if (config.pushReplicationFilterEnabled()) {
+ bindReplicationFilterClass(PUSH_REPLICATION_FILTER_MODULE, filterModulesBuilder);
+ }
+ if (config.pullRepllicationFilterEnabled()) {
+ bindReplicationFilterClass(PULL_REPLICATION_FILTER_MODULE, filterModulesBuilder);
}
return filterModulesBuilder.build();
}
+
+ private void bindReplicationFilterClass(
+ String filterClassName, ImmutableList.Builder<AbstractModule> filterModulesBuilder) {
+ try {
+ @SuppressWarnings("unchecked")
+ Class<AbstractModule> filterClass = (Class<AbstractModule>) Class.forName(filterClassName);
+
+ AbstractModule filterModule = parentInjector.getInstance(filterClass);
+ // Check if the filterModule would be valid for creating a child Guice Injector
+ parentInjector.createChildInjector(filterModule);
+
+ filterModulesBuilder.add(filterModule);
+ } catch (NoClassDefFoundError | ClassNotFoundException e) {
+ log.atWarning().withCause(e).log(
+ "Not loading %s because of missing the associated replication plugin", filterClassName);
+ } catch (Exception e) {
+ throw new ProvisionException(
+ "Unable to instantiate replication filter " + filterClassName, e);
+ }
+ }
}
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 55e5041..ed72405 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -95,6 +95,16 @@
: Enable the use of a shared ref-database
Defaults: true
+```ref-database.pushReplicationFilterClassEnabled```
+: Enable the filtering of push replication events checking their
+ up-to-date status with the global-refdb.
+ Defaults: true
+
+```ref-database.pullReplicationFilterClassEnabled```
+: Enable the filtering of pull replication events checking their
+ up-to-date status with the global-refdb.
+ Defaults: true
+
```ref-database.localRefLockTimeout```
: Timeout waiting for a local ref to become available to accept
updates or for starting a replication task.