Merge branch 'stable-3.3' into stable-3.4
* stable-3.3:
Fix merge issue for ForwardedIndexGroupHandlerTest class
Add 'Forwarded-BatchIndex-Event' to events skipped from high-availability
Do not forward events from high-availability
Fix cache eviction for projects cache
Adjust tests to reflect real life situation
Honour index retries when indexing groups
Change-Id: I4806868dc8c59a6e3ee5adcc34b9333612dfe188
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index 223778e..b91d0d7 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -9,6 +9,6 @@
maven_jar(
name = "events-broker",
- artifact = "com.gerritforge:events-broker:3.3.2",
- sha1 = "d8bcb77047cc12dd7c623b5b4de70a25499d3d6c",
+ artifact = "com.gerritforge:events-broker:3.4.0.4",
+ sha1 = "8d361d863382290e33828116e65698190118d0f1",
)
diff --git a/setup_local_env/configs/gerrit.config b/setup_local_env/configs/gerrit.config
index c4df06a..5dce6e6 100644
--- a/setup_local_env/configs/gerrit.config
+++ b/setup_local_env/configs/gerrit.config
@@ -5,6 +5,7 @@
installModule = com.gerritforge.gerrit.eventbroker.BrokerApiModule # events-broker module to setup BrokerApi dynamic item
installModule = com.googlesource.gerrit.plugins.multisite.Module # multi-site needs to be a gerrit lib
installDbModule = com.googlesource.gerrit.plugins.multisite.GitModule
+ instanceId = $INSTANCE_ID
[database]
type = h2
database = $LOCATION_TEST_SITE/db/ReviewDB
@@ -43,7 +44,7 @@
[plugin "events-kafka"]
sendAsync = true
bootstrapServers = localhost:$BROKER_PORT
- groupId = $GROUP_ID
+ groupId = $INSTANCE_ID
numberOfSubscribers = 6
securityProtocol = PLAINTEXT
pollingIntervalMs = 1000
@@ -55,12 +56,12 @@
pollingIntervalMs = 1000
region = us-east-1
endpoint = http://localhost:$BROKER_PORT
- applicationName = $GROUP_ID
+ applicationName = $INSTANCE_ID
initialPosition = trim_horizon
[plugin "events-gcloud-pubsub"]
numberOfSubscribers = 6
gcloudProject="test-project"
- subscriptionId=$GROUP_ID
+ subscriptionId=$INSTANCE_ID
privateKeyLocation="not used in local mode"
[plugin "metrics-reporter-prometheus"]
prometheusBearerToken = token
diff --git a/setup_local_env/setup.sh b/setup_local_env/setup.sh
index b91033a..f745482 100755
--- a/setup_local_env/setup.sh
+++ b/setup_local_env/setup.sh
@@ -16,7 +16,7 @@
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
-GERRIT_BRANCH=stable-3.3
+GERRIT_BRANCH=stable-3.4
GERRIT_CI=https://gerrit-ci.gerritforge.com/view/Plugins-$GERRIT_BRANCH/job
LAST_BUILD=lastSuccessfulBuild/artifact/bazel-bin/plugins
EVENTS_BROKER_VER=`grep 'com.gerritforge:events-broker' $(dirname $0)/../external_plugin_deps.bzl | cut -d '"' -f 2 | cut -d ':' -f 3`
@@ -70,7 +70,7 @@
export GERRIT_HOSTNAME=$7
export REPLICATION_HOSTNAME=$8
export REMOTE_DEBUG_PORT=$9
- export GROUP_ID=${10}
+ export INSTANCE_ID=${10}
export REPLICATION_URL=$(get_replication_url $REPLICATION_LOCATION_TEST_SITE $REPLICATION_HOSTNAME)
echo "Replacing variables for file $file and copying to $CONFIG_TEST_SITE/$file_name"
@@ -122,21 +122,21 @@
GERRIT_SITE1_SSHD_PORT=$3
CONFIG_TEST_SITE_1=$LOCATION_TEST_SITE_1/etc
GERRIT_SITE1_REMOTE_DEBUG_PORT="5005"
- GERRIT_SITE1_GROUP_ID="instance-1"
+ GERRIT_SITE1_INSTANCE_ID="instance-1"
# SITE 2
GERRIT_SITE2_HOSTNAME=$4
GERRIT_SITE2_HTTPD_PORT=$5
GERRIT_SITE2_SSHD_PORT=$6
CONFIG_TEST_SITE_2=$LOCATION_TEST_SITE_2/etc
GERRIT_SITE2_REMOTE_DEBUG_PORT="5006"
- GERRIT_SITE2_GROUP_ID="instance-2"
+ GERRIT_SITE2_INSTANCE_ID="instance-2"
# Set config SITE1
- copy_config_files $CONFIG_TEST_SITE_1 $GERRIT_SITE1_HTTPD_PORT $LOCATION_TEST_SITE_1 $GERRIT_SITE1_SSHD_PORT $GERRIT_SITE2_HTTPD_PORT $LOCATION_TEST_SITE_2 $GERRIT_SITE1_HOSTNAME $GERRIT_SITE2_HOSTNAME $GERRIT_SITE1_REMOTE_DEBUG_PORT $GERRIT_SITE1_GROUP_ID
+ copy_config_files $CONFIG_TEST_SITE_1 $GERRIT_SITE1_HTTPD_PORT $LOCATION_TEST_SITE_1 $GERRIT_SITE1_SSHD_PORT $GERRIT_SITE2_HTTPD_PORT $LOCATION_TEST_SITE_2 $GERRIT_SITE1_HOSTNAME $GERRIT_SITE2_HOSTNAME $GERRIT_SITE1_REMOTE_DEBUG_PORT $GERRIT_SITE1_INSTANCE_ID
# Set config SITE2
- copy_config_files $CONFIG_TEST_SITE_2 $GERRIT_SITE2_HTTPD_PORT $LOCATION_TEST_SITE_2 $GERRIT_SITE2_SSHD_PORT $GERRIT_SITE1_HTTPD_PORT $LOCATION_TEST_SITE_1 $GERRIT_SITE1_HOSTNAME $GERRIT_SITE2_HOSTNAME $GERRIT_SITE2_REMOTE_DEBUG_PORT $GERRIT_SITE2_GROUP_ID
+ copy_config_files $CONFIG_TEST_SITE_2 $GERRIT_SITE2_HTTPD_PORT $LOCATION_TEST_SITE_2 $GERRIT_SITE2_SSHD_PORT $GERRIT_SITE1_HTTPD_PORT $LOCATION_TEST_SITE_1 $GERRIT_SITE1_HOSTNAME $GERRIT_SITE2_HOSTNAME $GERRIT_SITE2_REMOTE_DEBUG_PORT $GERRIT_SITE2_INSTANCE_ID
}
function is_docker_desktop {
@@ -411,10 +411,10 @@
fi
if [ $DOWNLOAD_WEBSESSION_PLUGIN = "true" ];then
echo "Downloading websession-broker plugin $GERRIT_BRANCH"
- wget $GERRIT_CI/plugin-websession-broker-bazel-$GERRIT_BRANCH/$LAST_BUILD/websession-broker/websession-broker.jar \
+ wget $GERRIT_CI/plugin-websession-broker-bazel-master-$GERRIT_BRANCH/$LAST_BUILD/websession-broker/websession-broker.jar \
-O $DEPLOYMENT_LOCATION/websession-broker.jar || { echo >&2 "Cannot download websession-broker plugin: Check internet connection. Abort\
ing"; exit 1; }
- wget $GERRIT_CI/plugin-healthcheck-bazel-$GERRIT_BRANCH/$LAST_BUILD/healthcheck/healthcheck.jar \
+ wget $GERRIT_CI/plugin-healthcheck-bazel-master-$GERRIT_BRANCH/$LAST_BUILD/healthcheck/healthcheck.jar \
-O $DEPLOYMENT_LOCATION/healthcheck.jar || { echo >&2 "Cannot download healthcheck plugin: Check internet connection. Abort\
ing"; exit 1; }
else
@@ -445,7 +445,7 @@
if [ "$BROKER_TYPE" = "kinesis" ]; then
echo "Downloading events-aws-kinesis plugin $GERRIT_BRANCH"
- wget $GERRIT_CI/plugin-events-aws-kinesis-bazel-$GERRIT_BRANCH/$LAST_BUILD/events-aws-kinesis/events-aws-kinesis.jar \
+ wget $GERRIT_CI/plugin-events-aws-kinesis-bazel-master-$GERRIT_BRANCH/$LAST_BUILD/events-aws-kinesis/events-aws-kinesis.jar \
-O $DEPLOYMENT_LOCATION/events-aws-kinesis.jar || { echo >&2 "Cannot download events-aws-kinesis plugin: Check internet connection. Abort\
ing"; exit 1; }
fi
@@ -453,7 +453,7 @@
if [ "$BROKER_TYPE" = "gcloud-pubsub" ]; then
echo "Downloading events-gcloud-pubsub plugin $GERRIT_BRANCH"
- wget $GERRIT_CI/plugin-events-gcloud-pubsub-bazel-$GERRIT_BRANCH/$LAST_BUILD/events-gcloud-pubsub/events-gcloud-pubsub.jar \
+ wget $GERRIT_CI/plugin-events-gcloud-pubsub-bazel-master-$GERRIT_BRANCH/$LAST_BUILD/events-gcloud-pubsub/events-gcloud-pubsub.jar \
-O $DEPLOYMENT_LOCATION/events-gcloud-pubsub.jar || { echo >&2 "Cannot download events-gcloud-pubsub plugin: Check internet connection. Abort\
ing"; exit 1; }
fi
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/Log4jMessageLogger.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/Log4jMessageLogger.java
index 7c88655..95c417f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Log4jMessageLogger.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Log4jMessageLogger.java
@@ -14,9 +14,9 @@
package com.googlesource.gerrit.plugins.multisite;
-import com.gerritforge.gerrit.eventbroker.EventGsonProvider;
-import com.gerritforge.gerrit.eventbroker.EventMessage;
import com.google.gerrit.extensions.systemstatus.ServerInformation;
+import com.google.gerrit.server.events.Event;
+import com.google.gerrit.server.events.EventGsonProvider;
import com.google.gerrit.server.util.PluginLogFile;
import com.google.gerrit.server.util.SystemLog;
import com.google.gson.Gson;
@@ -41,7 +41,7 @@
}
@Override
- public void log(Direction direction, String topic, EventMessage event) {
+ public void log(Direction direction, String topic, Event event) {
msgLog.info("{} {} {}", direction, topic, gson.toJson(event));
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/Log4jProjectVersionLogger.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/Log4jProjectVersionLogger.java
index c2c4b46..23c720a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Log4jProjectVersionLogger.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Log4jProjectVersionLogger.java
@@ -45,4 +45,9 @@
verLog.info("{ \"project\":\"{}\", \"version\":{} }", projectName, currentVersion);
}
}
+
+ @Override
+ public void logDeleted(Project.NameKey projectName) {
+ verLog.info("{ \"project\":\"{}\", \"status\":\"DELETED\" }", projectName);
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/MessageLogger.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/MessageLogger.java
index b1f3e79..cc64b02 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/MessageLogger.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/MessageLogger.java
@@ -14,7 +14,7 @@
package com.googlesource.gerrit.plugins.multisite;
-import com.gerritforge.gerrit.eventbroker.EventMessage;
+import com.google.gerrit.server.events.Event;
public interface MessageLogger {
@@ -23,5 +23,5 @@
CONSUME;
}
- public void log(Direction direction, String topic, EventMessage event);
+ public void log(Direction direction, String topic, Event event);
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
index f44f4f7..ad53449 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
@@ -16,30 +16,18 @@
import com.gerritforge.gerrit.globalrefdb.validation.LibModule;
import com.google.gerrit.lifecycle.LifecycleModule;
-import com.google.gerrit.server.config.SitePaths;
import com.google.inject.CreationException;
import com.google.inject.Inject;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
import com.google.inject.spi.Message;
+import com.googlesource.gerrit.plugins.multisite.broker.BrokerModule;
import com.googlesource.gerrit.plugins.multisite.cache.CacheModule;
import com.googlesource.gerrit.plugins.multisite.event.EventModule;
import com.googlesource.gerrit.plugins.multisite.forwarder.ForwarderModule;
import com.googlesource.gerrit.plugins.multisite.forwarder.router.RouterModule;
import com.googlesource.gerrit.plugins.multisite.index.IndexModule;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.Collection;
-import java.util.UUID;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
public class Module extends LifecycleModule {
- private static final Logger log = LoggerFactory.getLogger(Module.class);
private Configuration config;
@Inject
@@ -72,57 +60,8 @@
install(new IndexModule());
}
+ install(new BrokerModule());
+
install(new RouterModule());
}
-
- @Provides
- @Singleton
- @InstanceId
- UUID getInstanceId(SitePaths sitePaths) throws IOException {
- UUID instanceId = null;
- Path dataDir = sitePaths.data_dir.resolve(Configuration.PLUGIN_NAME);
- if (!dataDir.toFile().exists()) {
- dataDir.toFile().mkdirs();
- }
- String serverIdFile =
- dataDir.toAbsolutePath().toString() + "/" + Configuration.INSTANCE_ID_FILE;
-
- instanceId = tryToLoadSavedInstanceId(serverIdFile);
-
- if (instanceId == null) {
- instanceId = UUID.randomUUID();
- Files.createFile(Paths.get(serverIdFile));
- try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(serverIdFile))) {
- writer.write(instanceId.toString());
- } catch (IOException e) {
- log.warn(
- String.format(
- "Cannot write instance ID, a new one will be generated at instance restart. (%s)",
- e.getMessage()));
- }
- }
- return instanceId;
- }
-
- private UUID tryToLoadSavedInstanceId(String serverIdFile) {
- if (Files.exists(Paths.get(serverIdFile))) {
- try (BufferedReader br = Files.newBufferedReader(Paths.get(serverIdFile))) {
- return UUID.fromString(br.readLine());
- } catch (IOException e) {
- log.warn(
- String.format(
- "Cannot read instance ID from path '%s', deleting the old file and generating a new ID: (%s)",
- serverIdFile, e.getMessage()));
- try {
- Files.delete(Paths.get(serverIdFile));
- } catch (IOException e1) {
- log.warn(
- String.format(
- "Cannot delete old instance ID file at path '%s' with instance ID while generating a new one: (%s)",
- serverIdFile, e1.getMessage()));
- }
- }
- }
- return null;
- }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/ProjectVersionLogger.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/ProjectVersionLogger.java
index 6ababb6..2ee2c13 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/ProjectVersionLogger.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/ProjectVersionLogger.java
@@ -19,4 +19,6 @@
public interface ProjectVersionLogger {
public void log(Project.NameKey projectName, long currentVersion, long replicationLag);
+
+ public void logDeleted(Project.NameKey projectName);
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerApiWrapper.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerApiWrapper.java
index 71be5e6..f58efa7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerApiWrapper.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerApiWrapper.java
@@ -15,62 +15,101 @@
package com.googlesource.gerrit.plugins.multisite.broker;
import com.gerritforge.gerrit.eventbroker.BrokerApi;
-import com.gerritforge.gerrit.eventbroker.EventMessage;
import com.gerritforge.gerrit.eventbroker.TopicSubscriber;
+import com.google.common.base.Strings;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.SettableFuture;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.server.events.Event;
import com.google.inject.Inject;
-import com.googlesource.gerrit.plugins.multisite.InstanceId;
import com.googlesource.gerrit.plugins.multisite.MessageLogger;
import com.googlesource.gerrit.plugins.multisite.MessageLogger.Direction;
import com.googlesource.gerrit.plugins.multisite.forwarder.Context;
import java.util.Set;
-import java.util.UUID;
+import java.util.concurrent.Executor;
import java.util.function.Consumer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class BrokerApiWrapper implements BrokerApi {
+ private static final Logger log = LoggerFactory.getLogger(BrokerApiWrapper.class);
+ private final Executor executor;
private final DynamicItem<BrokerApi> apiDelegate;
private final BrokerMetrics metrics;
private final MessageLogger msgLog;
- private final UUID instanceId;
@Inject
public BrokerApiWrapper(
+ @BrokerExecutor Executor executor,
DynamicItem<BrokerApi> apiDelegate,
BrokerMetrics metrics,
- MessageLogger msgLog,
- @InstanceId UUID instanceId) {
+ MessageLogger msgLog) {
this.apiDelegate = apiDelegate;
+ this.executor = executor;
this.metrics = metrics;
this.msgLog = msgLog;
- this.instanceId = instanceId;
}
- public boolean send(String topic, Event event) {
- return send(topic, apiDelegate.get().newMessage(instanceId, event));
- }
-
- @Override
- public boolean send(String topic, EventMessage message) {
- if (Context.isForwardedEvent()) {
- return true;
- }
- boolean succeeded = false;
+ public boolean sendSync(String topic, Event event) {
try {
- succeeded = apiDelegate.get().send(topic, message);
- } finally {
- if (succeeded) {
- msgLog.log(Direction.PUBLISH, topic, message);
- metrics.incrementBrokerPublishedMessage();
- } else {
- metrics.incrementBrokerFailedToPublishMessage();
- }
+ return send(topic, event).get();
+ } catch (Throwable e) {
+ log.error(
+ "Failed to publish event '{}' to topic '{}' - error: {} - stack trace: {}",
+ event,
+ topic,
+ e.getMessage(),
+ e.getStackTrace());
+ metrics.incrementBrokerFailedToPublishMessage();
+ return false;
}
- return succeeded;
}
@Override
- public void receiveAsync(String topic, Consumer<EventMessage> messageConsumer) {
+ public ListenableFuture<Boolean> send(String topic, Event message) {
+ SettableFuture<Boolean> resultFuture = SettableFuture.create();
+ if (Context.isForwardedEvent()) {
+ resultFuture.set(true);
+ return resultFuture;
+ }
+
+ if (Strings.isNullOrEmpty(message.instanceId)) {
+ log.warn(
+ "Dropping event '{}' because event instance id cannot be null or empty",
+ message.toString());
+ resultFuture.set(true);
+ return resultFuture;
+ }
+
+ ListenableFuture<Boolean> resfultF = apiDelegate.get().send(topic, message);
+ Futures.addCallback(
+ resfultF,
+ new FutureCallback<Boolean>() {
+ @Override
+ public void onSuccess(Boolean result) {
+ msgLog.log(Direction.PUBLISH, topic, message);
+ metrics.incrementBrokerPublishedMessage();
+ }
+
+ @Override
+ public void onFailure(Throwable throwable) {
+ log.error(
+ "Failed to publish message '{}' to topic '{}' - error: {}",
+ message.toString(),
+ topic,
+ throwable.getMessage());
+ metrics.incrementBrokerFailedToPublishMessage();
+ }
+ },
+ executor);
+
+ return resfultF;
+ }
+
+ @Override
+ public void receiveAsync(String topic, Consumer<Event> messageConsumer) {
apiDelegate.get().receiveAsync(topic, messageConsumer);
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/InstanceId.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerExecutor.java
similarity index 83%
rename from src/main/java/com/googlesource/gerrit/plugins/multisite/InstanceId.java
rename to src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerExecutor.java
index 87306a2..aa24eb1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/InstanceId.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerExecutor.java
@@ -1,4 +1,4 @@
-// Copyright (C) 2019 The Android Open Source Project
+// Copyright (C) 2021 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-package com.googlesource.gerrit.plugins.multisite;
+package com.googlesource.gerrit.plugins.multisite.broker;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@@ -21,4 +21,4 @@
@Retention(RUNTIME)
@BindingAnnotation
-public @interface InstanceId {}
+@interface BrokerExecutor {}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerExecutorProvider.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerExecutorProvider.java
new file mode 100644
index 0000000..e843263
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerExecutorProvider.java
@@ -0,0 +1,29 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.multisite.broker;
+
+import com.google.gerrit.server.git.WorkQueue;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.googlesource.gerrit.plugins.multisite.ExecutorProvider;
+
+@Singleton
+class BrokerExecutorProvider extends ExecutorProvider {
+
+ @Inject
+ BrokerExecutorProvider(WorkQueue workQueue) {
+ super(workQueue, 1, "Multi-Site-Broker");
+ }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerModule.java
new file mode 100644
index 0000000..a5dac4a
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerModule.java
@@ -0,0 +1,28 @@
+// Copyright (C) 2021 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.multisite.broker;
+
+import com.google.gerrit.lifecycle.LifecycleModule;
+import java.util.concurrent.Executor;
+
+public class BrokerModule extends LifecycleModule {
+
+ @Override
+ protected void configure() {
+ bind(Executor.class)
+ .annotatedWith(BrokerExecutor.class)
+ .toProvider(BrokerExecutorProvider.class);
+ }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/CacheEvictionHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/CacheEvictionHandler.java
index 2990264..e418da5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/CacheEvictionHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/CacheEvictionHandler.java
@@ -17,6 +17,7 @@
import com.google.common.cache.RemovalNotification;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.server.cache.CacheRemovalListener;
+import com.google.gerrit.server.config.GerritInstanceId;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.multisite.forwarder.CacheEvictionForwarder;
import com.googlesource.gerrit.plugins.multisite.forwarder.Context;
@@ -28,21 +29,25 @@
private final Executor executor;
private final DynamicSet<CacheEvictionForwarder> forwarders;
private final CachePatternMatcher matcher;
+ private final String instanceId;
@Inject
CacheEvictionHandler(
DynamicSet<CacheEvictionForwarder> forwarders,
@CacheExecutor Executor executor,
- CachePatternMatcher matcher) {
+ CachePatternMatcher matcher,
+ @GerritInstanceId String instanceId) {
this.forwarders = forwarders;
this.executor = executor;
this.matcher = matcher;
+ this.instanceId = instanceId;
}
@Override
public void onRemoval(String plugin, String cache, RemovalNotification<K, V> notification) {
if (!Context.isForwardedEvent() && !notification.wasEvicted() && matcher.matches(cache)) {
- executor.execute(new CacheEvictionTask(new CacheEvictionEvent(cache, notification.getKey())));
+ executor.execute(
+ new CacheEvictionTask(new CacheEvictionEvent(cache, notification.getKey(), instanceId)));
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/CachePatternMatcher.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/CachePatternMatcher.java
index b8521a3..2dcb09a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/CachePatternMatcher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/CachePatternMatcher.java
@@ -25,7 +25,7 @@
@Singleton
class CachePatternMatcher {
- private static final List<String> DEFAULT_PATTERNS =
+ private static final ImmutableList<String> DEFAULT_PATTERNS =
ImmutableList.of("^groups.*", "ldap_groups", "ldap_usernames", "projects", "sshkeys");
private final Pattern pattern;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/ProjectListUpdateHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/ProjectListUpdateHandler.java
index fdc6fc3..44f8417 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/ProjectListUpdateHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/cache/ProjectListUpdateHandler.java
@@ -19,6 +19,7 @@
import com.google.gerrit.extensions.events.ProjectDeletedListener;
import com.google.gerrit.extensions.events.ProjectEvent;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.config.GerritInstanceId;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.multisite.forwarder.Context;
@@ -33,15 +34,18 @@
private final DynamicSet<ProjectListUpdateForwarder> forwarders;
private final Executor executor;
private final ProjectsFilter projectsFilter;
+ private final String instanceId;
@Inject
public ProjectListUpdateHandler(
DynamicSet<ProjectListUpdateForwarder> forwarders,
@CacheExecutor Executor executor,
- ProjectsFilter filter) {
+ ProjectsFilter filter,
+ @GerritInstanceId String instanceId) {
this.forwarders = forwarders;
this.executor = executor;
this.projectsFilter = filter;
+ this.instanceId = instanceId;
}
@Override
@@ -59,7 +63,8 @@
private void process(ProjectEvent event, boolean delete) {
if (!Context.isForwardedEvent() && projectsFilter.matches(event.getProjectName())) {
executor.execute(
- new ProjectListUpdateTask(new ProjectListUpdateEvent(event.getProjectName(), delete)));
+ new ProjectListUpdateTask(
+ new ProjectListUpdateEvent(event.getProjectName(), delete, instanceId)));
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/AbstractSubcriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/AbstractSubcriber.java
index b37f434..7a20c7f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/AbstractSubcriber.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/AbstractSubcriber.java
@@ -14,20 +14,19 @@
package com.googlesource.gerrit.plugins.multisite.consumer;
-import com.gerritforge.gerrit.eventbroker.EventMessage;
import com.google.common.base.Strings;
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.config.GerritInstanceId;
+import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.googlesource.gerrit.plugins.multisite.Configuration;
-import com.googlesource.gerrit.plugins.multisite.InstanceId;
import com.googlesource.gerrit.plugins.multisite.MessageLogger;
import com.googlesource.gerrit.plugins.multisite.MessageLogger.Direction;
import com.googlesource.gerrit.plugins.multisite.forwarder.CacheNotFoundException;
import com.googlesource.gerrit.plugins.multisite.forwarder.events.EventTopic;
import com.googlesource.gerrit.plugins.multisite.forwarder.router.ForwardedEventRouter;
import java.io.IOException;
-import java.util.UUID;
import java.util.function.Consumer;
public abstract class AbstractSubcriber {
@@ -44,13 +43,13 @@
public AbstractSubcriber(
ForwardedEventRouter eventRouter,
DynamicSet<DroppedEventListener> droppedEventListeners,
- @InstanceId UUID instanceId,
+ @GerritInstanceId String gerritInstanceId,
MessageLogger msgLog,
SubscriberMetrics subscriberMetrics,
Configuration cfg) {
this.eventRouter = eventRouter;
this.droppedEventListeners = droppedEventListeners;
- this.instanceId = instanceId.toString();
+ this.instanceId = gerritInstanceId;
this.msgLog = msgLog;
this.subscriberMetrics = subscriberMetrics;
this.cfg = cfg;
@@ -59,12 +58,12 @@
protected abstract EventTopic getTopic();
- public Consumer<EventMessage> getConsumer() {
+ public Consumer<Event> getConsumer() {
return this::processRecord;
}
- private void processRecord(EventMessage event) {
- String sourceInstanceId = event.getHeader().sourceInstanceId;
+ private void processRecord(Event event) {
+ String sourceInstanceId = event.instanceId;
if (Strings.isNullOrEmpty(sourceInstanceId) || instanceId.equals(sourceInstanceId)) {
if (Strings.isNullOrEmpty(sourceInstanceId)) {
@@ -80,14 +79,14 @@
} else {
try {
msgLog.log(Direction.CONSUME, topic, event);
- eventRouter.route(event.getEvent());
+ eventRouter.route(event);
subscriberMetrics.incrementSubscriberConsumedMessage();
subscriberMetrics.updateReplicationStatusMetrics(event);
} catch (IOException e) {
- logger.atSevere().withCause(e).log("Malformed event '%s'", event.getHeader());
+ logger.atSevere().withCause(e).log("Malformed event '%s'", event);
subscriberMetrics.incrementSubscriberFailedToConsumeMessage();
} catch (PermissionBackendException | CacheNotFoundException e) {
- logger.atSevere().withCause(e).log("Cannot handle message '%s'", event.getHeader());
+ logger.atSevere().withCause(e).log("Cannot handle message '%s'", event);
subscriberMetrics.incrementSubscriberFailedToConsumeMessage();
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java
index 5bbaee0..80f61f6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java
@@ -15,14 +15,13 @@
package com.googlesource.gerrit.plugins.multisite.consumer;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.config.GerritInstanceId;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.multisite.Configuration;
-import com.googlesource.gerrit.plugins.multisite.InstanceId;
import com.googlesource.gerrit.plugins.multisite.MessageLogger;
import com.googlesource.gerrit.plugins.multisite.forwarder.events.EventTopic;
import com.googlesource.gerrit.plugins.multisite.forwarder.router.IndexEventRouter;
-import java.util.UUID;
@Singleton
public class BatchIndexEventSubscriber extends AbstractSubcriber {
@@ -30,7 +29,7 @@
public BatchIndexEventSubscriber(
IndexEventRouter eventRouter,
DynamicSet<DroppedEventListener> droppedEventListeners,
- @InstanceId UUID instanceId,
+ @GerritInstanceId String instanceId,
MessageLogger msgLog,
SubscriberMetrics subscriberMetrics,
Configuration cfg) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/CacheEvictionEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/CacheEvictionEventSubscriber.java
index eae66b4..5f57156 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/CacheEvictionEventSubscriber.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/CacheEvictionEventSubscriber.java
@@ -15,14 +15,13 @@
package com.googlesource.gerrit.plugins.multisite.consumer;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.config.GerritInstanceId;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.multisite.Configuration;
-import com.googlesource.gerrit.plugins.multisite.InstanceId;
import com.googlesource.gerrit.plugins.multisite.MessageLogger;
import com.googlesource.gerrit.plugins.multisite.forwarder.events.EventTopic;
import com.googlesource.gerrit.plugins.multisite.forwarder.router.CacheEvictionEventRouter;
-import java.util.UUID;
@Singleton
public class CacheEvictionEventSubscriber extends AbstractSubcriber {
@@ -30,7 +29,7 @@
public CacheEvictionEventSubscriber(
CacheEvictionEventRouter eventRouter,
DynamicSet<DroppedEventListener> droppedEventListeners,
- @InstanceId UUID instanceId,
+ @GerritInstanceId String instanceId,
MessageLogger msgLog,
SubscriberMetrics subscriberMetrics,
Configuration cfg) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/DroppedEventListener.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/DroppedEventListener.java
index 6f4680c..b34e02c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/DroppedEventListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/DroppedEventListener.java
@@ -14,7 +14,7 @@
package com.googlesource.gerrit.plugins.multisite.consumer;
-import com.gerritforge.gerrit.eventbroker.EventMessage;
+import com.google.gerrit.server.events.Event;
public interface DroppedEventListener {
/**
@@ -22,5 +22,5 @@
*
* @param event information about the event.
*/
- void onEventDropped(EventMessage event);
+ void onEventDropped(Event event);
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java
index 49d470a..8809799 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java
@@ -15,14 +15,13 @@
package com.googlesource.gerrit.plugins.multisite.consumer;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.config.GerritInstanceId;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.multisite.Configuration;
-import com.googlesource.gerrit.plugins.multisite.InstanceId;
import com.googlesource.gerrit.plugins.multisite.MessageLogger;
import com.googlesource.gerrit.plugins.multisite.forwarder.events.EventTopic;
import com.googlesource.gerrit.plugins.multisite.forwarder.router.IndexEventRouter;
-import java.util.UUID;
@Singleton
public class IndexEventSubscriber extends AbstractSubcriber {
@@ -30,7 +29,7 @@
public IndexEventSubscriber(
IndexEventRouter eventRouter,
DynamicSet<DroppedEventListener> droppedEventListeners,
- @InstanceId UUID instanceId,
+ @GerritInstanceId String instanceId,
MessageLogger msgLog,
SubscriberMetrics subscriberMetrics,
Configuration cfg) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/ProjectUpdateEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/ProjectUpdateEventSubscriber.java
index 6ff0969..239f3ac 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/ProjectUpdateEventSubscriber.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/ProjectUpdateEventSubscriber.java
@@ -15,14 +15,13 @@
package com.googlesource.gerrit.plugins.multisite.consumer;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.config.GerritInstanceId;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.multisite.Configuration;
-import com.googlesource.gerrit.plugins.multisite.InstanceId;
import com.googlesource.gerrit.plugins.multisite.MessageLogger;
import com.googlesource.gerrit.plugins.multisite.forwarder.events.EventTopic;
import com.googlesource.gerrit.plugins.multisite.forwarder.router.ProjectListUpdateRouter;
-import java.util.UUID;
@Singleton
public class ProjectUpdateEventSubscriber extends AbstractSubcriber {
@@ -30,7 +29,7 @@
public ProjectUpdateEventSubscriber(
ProjectListUpdateRouter eventRouter,
DynamicSet<DroppedEventListener> droppedEventListeners,
- @InstanceId UUID instanceId,
+ @GerritInstanceId String instanceId,
MessageLogger msgLog,
SubscriberMetrics subscriberMetrics,
Configuration cfg) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java
index 20c355e..57a3f51 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java
@@ -15,14 +15,13 @@
package com.googlesource.gerrit.plugins.multisite.consumer;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.config.GerritInstanceId;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.multisite.Configuration;
-import com.googlesource.gerrit.plugins.multisite.InstanceId;
import com.googlesource.gerrit.plugins.multisite.MessageLogger;
import com.googlesource.gerrit.plugins.multisite.forwarder.events.EventTopic;
import com.googlesource.gerrit.plugins.multisite.forwarder.router.StreamEventRouter;
-import java.util.UUID;
@Singleton
public class StreamEventSubscriber extends AbstractSubcriber {
@@ -30,7 +29,7 @@
public StreamEventSubscriber(
StreamEventRouter eventRouter,
DynamicSet<DroppedEventListener> droppedEventListeners,
- @InstanceId UUID instanceId,
+ @GerritInstanceId String instanceId,
MessageLogger msgLog,
SubscriberMetrics subscriberMetrics,
Configuration cfg) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
index 4459859..f7d5f99 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
@@ -14,22 +14,24 @@
package com.googlesource.gerrit.plugins.multisite.consumer;
-import com.gerritforge.gerrit.eventbroker.EventMessage;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.flogger.FluentLogger;
import com.google.gerrit.entities.Project;
import com.google.gerrit.metrics.Counter1;
import com.google.gerrit.metrics.Description;
import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.server.events.Event;
+import com.google.gerrit.server.events.ProjectEvent;
import com.google.gerrit.server.events.RefUpdatedEvent;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.googlesource.gerrit.plugins.multisite.MultiSiteMetrics;
import com.googlesource.gerrit.plugins.multisite.ProjectVersionLogger;
import com.googlesource.gerrit.plugins.multisite.validation.ProjectVersionRefUpdate;
-import com.googlesource.gerrit.plugins.replication.RefReplicatedEvent;
-import com.googlesource.gerrit.plugins.replication.RefReplicationDoneEvent;
-import com.googlesource.gerrit.plugins.replication.ReplicationScheduledEvent;
+import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationSucceededEvent;
+import com.googlesource.gerrit.plugins.replication.events.RefReplicatedEvent;
+import com.googlesource.gerrit.plugins.replication.events.RefReplicationDoneEvent;
+import com.googlesource.gerrit.plugins.replication.events.ReplicationScheduledEvent;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -98,25 +100,33 @@
subscriberFailureCounter.increment(SUBSCRIBER_FAILURE_COUNTER);
}
- public void updateReplicationStatusMetrics(EventMessage eventMessage) {
- Event event = eventMessage.getEvent();
- if (event instanceof RefReplicationDoneEvent) {
- RefReplicationDoneEvent replicationDone = (RefReplicationDoneEvent) event;
- updateReplicationLagMetrics(
- replicationDone.getProjectNameKey(), replicationDone.getRefName());
- } else if (event instanceof RefReplicatedEvent) {
- RefReplicatedEvent replicated = (RefReplicatedEvent) event;
- updateReplicationLagMetrics(replicated.getProjectNameKey(), replicated.getRefName());
- } else if (event instanceof ReplicationScheduledEvent) {
- ReplicationScheduledEvent updated = (ReplicationScheduledEvent) event;
- updateReplicationLagMetrics(updated.getProjectNameKey(), updated.getRefName());
- } else if (event instanceof RefUpdatedEvent) {
- RefUpdatedEvent updated = (RefUpdatedEvent) event;
- updateReplicationLagMetrics(updated.getProjectNameKey(), updated.getRefName());
+ public void updateReplicationStatusMetrics(Event event) {
+
+ if (event instanceof RefReplicationDoneEvent
+ || event instanceof RefReplicatedEvent
+ || event instanceof ReplicationScheduledEvent
+ || event instanceof RefUpdatedEvent) {
+ ProjectEvent projectEvent = (ProjectEvent) event;
+ updateReplicationLagMetrics(projectEvent.getProjectNameKey());
+ } else if (event instanceof ProjectDeletionReplicationSucceededEvent) {
+ ProjectDeletionReplicationSucceededEvent projectDeletion =
+ (ProjectDeletionReplicationSucceededEvent) event;
+ removeProjectFromReplicationLagMetrics(projectDeletion.getProjectNameKey());
}
}
- private void updateReplicationLagMetrics(Project.NameKey projectName, String ref) {
+ private void removeProjectFromReplicationLagMetrics(Project.NameKey projectName) {
+ Optional<Long> localVersion = projectVersionRefUpdate.getProjectLocalVersion(projectName.get());
+
+ if (!localVersion.isPresent() && localVersionPerProject.containsKey(projectName.get())) {
+ replicationStatusPerProject.remove(projectName.get());
+ localVersionPerProject.remove(projectName.get());
+ verLogger.logDeleted(projectName);
+ logger.atFine().log("Removed project '%s' from replication lag metrics", projectName);
+ }
+ }
+
+ private void updateReplicationLagMetrics(Project.NameKey projectName) {
Optional<Long> remoteVersion =
projectVersionRefUpdate.getProjectRemoteVersion(projectName.get());
Optional<Long> localVersion = projectVersionRefUpdate.getProjectLocalVersion(projectName.get());
@@ -138,4 +148,14 @@
projectName, localVersion.isPresent() ? "remote" : "local");
}
}
+
+ @VisibleForTesting
+ Long getReplicationStatus(String projectName) {
+ return replicationStatusPerProject.get(projectName);
+ }
+
+ @VisibleForTesting
+ Long getLocalVersion(String projectName) {
+ return localVersionPerProject.get(projectName);
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/broker/BrokerForwarder.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/broker/BrokerForwarder.java
index 3522731..ac4c38e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/broker/BrokerForwarder.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/broker/BrokerForwarder.java
@@ -49,6 +49,6 @@
return true;
}
- return broker.send(eventTopic.topic(cfg), event);
+ return broker.sendSync(eventTopic.topic(cfg), event);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/broker/BrokerStreamEventForwarder.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/broker/BrokerStreamEventForwarder.java
index 9ff4688..8a020fc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/broker/BrokerStreamEventForwarder.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/broker/BrokerStreamEventForwarder.java
@@ -35,6 +35,6 @@
@Override
public boolean send(Event event) {
- return broker.send(EventTopic.STREAM_EVENT_TOPIC.topic(cfg), event);
+ return broker.sendSync(EventTopic.STREAM_EVENT_TOPIC.topic(cfg), event);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java
index 317eb76..065ef7e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java
@@ -21,8 +21,8 @@
public int accountId;
- public AccountIndexEvent(int accountId) {
- super(TYPE);
+ public AccountIndexEvent(int accountId, String instanceId) {
+ super(TYPE, instanceId);
this.accountId = accountId;
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/CacheEvictionEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/CacheEvictionEvent.java
index 1c2185f..4444756 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/CacheEvictionEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/CacheEvictionEvent.java
@@ -22,8 +22,8 @@
public String cacheName;
public Object key;
- public CacheEvictionEvent(String cacheName, Object key) {
- super(TYPE);
+ public CacheEvictionEvent(String cacheName, Object key, String instanceId) {
+ super(TYPE, instanceId);
this.cacheName = cacheName;
this.key = key;
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java
index ab4ddf4..64fbdfb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java
@@ -28,8 +28,8 @@
public String targetSha;
public boolean deleted;
- public ChangeIndexEvent(String projectName, int changeId, boolean deleted) {
- super(TYPE);
+ public ChangeIndexEvent(String projectName, int changeId, boolean deleted, String instanceId) {
+ super(TYPE, instanceId);
this.projectName = projectName;
this.changeId = changeId;
this.deleted = deleted;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java
index 4981b2f..05ac198 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java
@@ -24,8 +24,8 @@
public final String groupUUID;
public final ObjectId sha1;
- public GroupIndexEvent(String groupUUID, @Nullable ObjectId sha1) {
- super(TYPE);
+ public GroupIndexEvent(String groupUUID, @Nullable ObjectId sha1, String instanceId) {
+ super(TYPE, instanceId);
this.groupUUID = groupUUID;
this.sha1 = sha1;
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/IndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/IndexEvent.java
index ea2c3fb..2fdda72 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/IndexEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/IndexEvent.java
@@ -15,7 +15,7 @@
package com.googlesource.gerrit.plugins.multisite.forwarder.events;
public abstract class IndexEvent extends MultiSiteEvent {
- protected IndexEvent(String type) {
- super(type);
+ protected IndexEvent(String type, String instanceId) {
+ super(type, instanceId);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/MultiSiteEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/MultiSiteEvent.java
index 404d168..f29204b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/MultiSiteEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/MultiSiteEvent.java
@@ -29,7 +29,8 @@
register(ProjectListUpdateEvent.TYPE, ProjectListUpdateEvent.class);
}
- protected MultiSiteEvent(String type) {
+ protected MultiSiteEvent(String type, String instanceId) {
super(type);
+ this.instanceId = instanceId;
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java
index 8bdb7b5..954befb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java
@@ -21,8 +21,8 @@
public String projectName;
- public ProjectIndexEvent(String projectName) {
- super(TYPE);
+ public ProjectIndexEvent(String projectName, String instanceId) {
+ super(TYPE, instanceId);
this.projectName = projectName;
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectListUpdateEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectListUpdateEvent.java
index d030e5b..0e18b27 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectListUpdateEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectListUpdateEvent.java
@@ -22,8 +22,8 @@
public String projectName;
public boolean remove;
- public ProjectListUpdateEvent(String projectName, boolean remove) {
- super(TYPE);
+ public ProjectListUpdateEvent(String projectName, boolean remove, String instanceId) {
+ super(TYPE, instanceId);
this.projectName = projectName;
this.remove = remove;
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java
index 202fb42..2cf83cd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java
@@ -32,7 +32,7 @@
import com.googlesource.gerrit.plugins.multisite.forwarder.events.GroupIndexEvent;
import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent;
import com.googlesource.gerrit.plugins.multisite.forwarder.events.ProjectIndexEvent;
-import com.googlesource.gerrit.plugins.replication.RefReplicationDoneEvent;
+import com.googlesource.gerrit.plugins.replication.events.RefReplicationDoneEvent;
import java.io.IOException;
import java.util.Optional;
import java.util.Set;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/StreamEventRouter.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/StreamEventRouter.java
index 4ef3426..95a3e66 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/StreamEventRouter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/StreamEventRouter.java
@@ -18,7 +18,7 @@
import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedEventHandler;
-import com.googlesource.gerrit.plugins.replication.RefReplicationDoneEvent;
+import com.googlesource.gerrit.plugins.replication.events.RefReplicationDoneEvent;
import java.io.IOException;
public class StreamEventRouter implements ForwardedEventRouter<Event> {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/index/ChangeCheckerImpl.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/index/ChangeCheckerImpl.java
index 08b26f7..983a07b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/index/ChangeCheckerImpl.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/index/ChangeCheckerImpl.java
@@ -19,6 +19,7 @@
import com.google.gerrit.exceptions.StorageException;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.change.ChangeFinder;
+import com.google.gerrit.server.config.GerritInstanceId;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.util.ManualRequestContext;
@@ -42,6 +43,7 @@
private final OneOffRequestContext oneOffReqCtx;
private final String changeId;
private final ChangeFinder changeFinder;
+ private final String instanceId;
private Optional<Long> computedChangeTs = Optional.empty();
private Optional<ChangeNotes> changeNotes = Optional.empty();
@@ -55,12 +57,14 @@
CommentsUtil commentsUtil,
ChangeFinder changeFinder,
OneOffRequestContext oneOffReqCtx,
+ @GerritInstanceId String instanceId,
@Assisted String changeId) {
this.changeFinder = changeFinder;
this.gitRepoMgr = gitRepoMgr;
this.commentsUtil = commentsUtil;
this.oneOffReqCtx = oneOffReqCtx;
this.changeId = changeId;
+ this.instanceId = instanceId;
}
@Override
@@ -69,7 +73,8 @@
return getComputedChangeTs()
.map(
ts -> {
- ChangeIndexEvent event = new ChangeIndexEvent(projectName, changeId, deleted);
+ ChangeIndexEvent event =
+ new ChangeIndexEvent(projectName, changeId, deleted, instanceId);
event.eventCreatedOn = ts;
event.targetSha = getBranchTargetSha();
return event;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/index/IndexEventHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/index/IndexEventHandler.java
index eef3e4b..02f1b1c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/index/IndexEventHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/index/IndexEventHandler.java
@@ -21,6 +21,7 @@
import com.google.gerrit.extensions.events.GroupIndexedListener;
import com.google.gerrit.extensions.events.ProjectIndexedListener;
import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.config.GerritInstanceId;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.multisite.forwarder.Context;
import com.googlesource.gerrit.plugins.multisite.forwarder.ForwarderTask;
@@ -48,6 +49,7 @@
private final ChangeCheckerImpl.Factory changeChecker;
private final ProjectsFilter projectsFilter;
private final GroupChecker groupChecker;
+ private final String instanceId;
@Inject
IndexEventHandler(
@@ -55,18 +57,20 @@
DynamicSet<IndexEventForwarder> forwarders,
ChangeCheckerImpl.Factory changeChecker,
ProjectsFilter projectsFilter,
- GroupChecker groupChecker) {
+ GroupChecker groupChecker,
+ @GerritInstanceId String instanceId) {
this.forwarders = forwarders;
this.executor = executor;
this.changeChecker = changeChecker;
this.projectsFilter = projectsFilter;
this.groupChecker = groupChecker;
+ this.instanceId = instanceId;
}
@Override
public void onAccountIndexed(int id) {
if (!Context.isForwardedEvent()) {
- IndexAccountTask task = new IndexAccountTask(new AccountIndexEvent(id));
+ IndexAccountTask task = new IndexAccountTask(new AccountIndexEvent(id, instanceId));
if (queuedTasks.add(task)) {
executor.execute(task);
}
@@ -87,7 +91,8 @@
public void onGroupIndexed(String groupUUID) {
if (!Context.isForwardedEvent()) {
IndexGroupTask task =
- new IndexGroupTask(new GroupIndexEvent(groupUUID, groupChecker.getGroupHead(groupUUID)));
+ new IndexGroupTask(
+ new GroupIndexEvent(groupUUID, groupChecker.getGroupHead(groupUUID), instanceId));
if (queuedTasks.add(task)) {
executor.execute(task);
}
@@ -97,7 +102,7 @@
@Override
public void onProjectIndexed(String projectName) {
if (!Context.isForwardedEvent() && projectsFilter.matches(projectName)) {
- IndexProjectTask task = new IndexProjectTask(new ProjectIndexEvent(projectName));
+ IndexProjectTask task = new IndexProjectTask(new ProjectIndexEvent(projectName, instanceId));
if (queuedTasks.add(task)) {
executor.execute(task);
}
@@ -132,7 +137,7 @@
private void executeDeleteChangeTask(int id) {
if (!Context.isForwardedEvent()) {
- IndexChangeTask task = new IndexChangeTask(new ChangeIndexEvent("", id, true));
+ IndexChangeTask task = new IndexChangeTask(new ChangeIndexEvent("", id, true, instanceId));
if (queuedTasks.add(task)) {
executor.execute(task);
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdate.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdate.java
index 28eddbb..ea7dada 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdate.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectVersionRefUpdate.java
@@ -36,7 +36,6 @@
import com.googlesource.gerrit.plugins.multisite.forwarder.Context;
import java.io.IOException;
import java.util.Optional;
-import java.util.Set;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectIdRef;
@@ -48,7 +47,7 @@
@Singleton
public class ProjectVersionRefUpdate implements EventListener {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
- private static final Set<RefUpdate.Result> SUCCESSFUL_RESULTS =
+ private static final ImmutableSet<RefUpdate.Result> SUCCESSFUL_RESULTS =
ImmutableSet.of(RefUpdate.Result.NEW, RefUpdate.Result.FORCED, RefUpdate.Result.NO_CHANGE);
public static final String MULTI_SITE_VERSIONING_REF = "refs/multi-site/version";
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index 623871b..159e4a0 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -7,7 +7,8 @@
message broker for aligning with the other masters over different sites.
The masters must be:
-
+* Gerrit instance id is mandatory for @PLUGIN@ plugin. All the master
+ must have [gerrit.instanceId](https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#gerrit) populated.
* events-broker library must be installed as a library module in the
`$GERRIT_SITE/lib` directory of all the masters
* global-refdb library must be installed as a library module in the
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/ModuleTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/ModuleTest.java
deleted file mode 100644
index 2df60dd..0000000
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/ModuleTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (C) 2017 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.googlesource.gerrit.plugins.multisite;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.gerrit.server.config.SitePaths;
-import java.io.File;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.UUID;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ModuleTest {
-
- @Mock(answer = Answers.RETURNS_DEEP_STUBS)
- private Configuration configMock;
-
- @Rule public TemporaryFolder tempFolder = new TemporaryFolder();
-
- private Module module;
-
- @Before
- public void setup() {
- module = new Module(configMock);
- }
-
- @Test
- public void shouldGetInstanceId() throws Exception {
- File tmpSitePath = tempFolder.newFolder();
- File tmpPluginDataPath =
- Paths.get(tmpSitePath.getPath(), "data", Configuration.PLUGIN_NAME).toFile();
- tmpPluginDataPath.mkdirs();
- Path path = Paths.get(tmpPluginDataPath.getPath(), Configuration.INSTANCE_ID_FILE);
- SitePaths sitePaths = new SitePaths(Paths.get(tmpSitePath.getPath()));
- assertThat(path.toFile().exists()).isFalse();
-
- UUID gotUUID1 = module.getInstanceId(sitePaths);
- assertThat(gotUUID1).isNotNull();
- assertThat(path.toFile().exists()).isTrue();
-
- UUID gotUUID2 = module.getInstanceId(sitePaths);
- assertThat(gotUUID1).isEqualTo(gotUUID2);
- }
-}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerApiWrapperTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerApiWrapperTest.java
index 92fa101..7d1751c 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerApiWrapperTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerApiWrapperTest.java
@@ -1,15 +1,19 @@
package com.googlesource.gerrit.plugins.multisite.broker;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.only;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.gerritforge.gerrit.eventbroker.BrokerApi;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.SettableFuture;
import com.google.gerrit.extensions.registration.DynamicItem;
import com.google.gerrit.server.events.Event;
+import com.google.gerrit.server.events.ProjectCreatedEvent;
import com.googlesource.gerrit.plugins.multisite.MessageLogger;
-import java.util.UUID;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -22,28 +26,35 @@
@Mock private BrokerApi brokerApi;
@Mock Event event;
@Mock MessageLogger msgLog;
- private UUID instanceId = UUID.randomUUID();
private String topic = "index";
private BrokerApiWrapper objectUnderTest;
@Before
public void setUp() {
+ event.instanceId = "instance-id";
objectUnderTest =
new BrokerApiWrapper(
- DynamicItem.itemOf(BrokerApi.class, brokerApi), brokerMetrics, msgLog, instanceId);
+ MoreExecutors.directExecutor(),
+ DynamicItem.itemOf(BrokerApi.class, brokerApi),
+ brokerMetrics,
+ msgLog);
}
@Test
public void shouldIncrementBrokerMetricCounterWhenMessagePublished() {
- when(brokerApi.send(any(), any())).thenReturn(true);
+ SettableFuture<Boolean> resultF = SettableFuture.create();
+ resultF.set(true);
+ when(brokerApi.send(any(), any())).thenReturn(resultF);
objectUnderTest.send(topic, event);
verify(brokerMetrics, only()).incrementBrokerPublishedMessage();
}
@Test
public void shouldIncrementBrokerFailedMetricCounterWhenMessagePublishingFailed() {
- when(brokerApi.send(any(), any())).thenReturn(false);
+ SettableFuture<Boolean> resultF = SettableFuture.create();
+ resultF.setException(new Exception("Force Future failure"));
+ when(brokerApi.send(any(), any())).thenReturn(resultF);
objectUnderTest.send(topic, event);
verify(brokerMetrics, only()).incrementBrokerFailedToPublishMessage();
}
@@ -53,10 +64,26 @@
when(brokerApi.send(any(), any()))
.thenThrow(new RuntimeException("Unexpected runtime exception"));
try {
- objectUnderTest.send(topic, event);
+ objectUnderTest.sendSync(topic, event);
} catch (RuntimeException e) {
// expected
}
verify(brokerMetrics, only()).incrementBrokerFailedToPublishMessage();
}
+
+ @Test
+ public void shouldSkipMessageSendingWhenInstanceIdIsNull() {
+ ProjectCreatedEvent event = new ProjectCreatedEvent();
+ event.instanceId = null;
+ objectUnderTest.send(topic, event);
+ verify(brokerApi, never()).send(any(), eq(event));
+ }
+
+ @Test
+ public void shouldSkipMessageSendingWhenInstanceIdIsEmpty() {
+ ProjectCreatedEvent event = new ProjectCreatedEvent();
+ event.instanceId = "";
+ objectUnderTest.send(topic, event);
+ verify(brokerApi, never()).send(any(), eq(event));
+ }
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/cache/CacheEvictionHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/cache/CacheEvictionHandlerTest.java
index 67be583..ce222d0 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/cache/CacheEvictionHandlerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/cache/CacheEvictionHandlerTest.java
@@ -36,9 +36,10 @@
@Test
public void shouldNotPublishAccountsCacheEvictions() {
-
+ String instanceId = "instance-id";
final CacheEvictionHandler<String, String> handler =
- new CacheEvictionHandler<>(DynamicSet.emptySet(), executorMock, defaultCacheMatcher);
+ new CacheEvictionHandler<>(
+ DynamicSet.emptySet(), executorMock, defaultCacheMatcher, instanceId);
handler.onRemoval(
"test", "accounts", RemovalNotification.create("test", "accounts", RemovalCause.EXPLICIT));
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/cache/ProjectListUpdateHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/cache/ProjectListUpdateHandlerTest.java
index 4263ddb..c8216bd 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/cache/ProjectListUpdateHandlerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/cache/ProjectListUpdateHandlerTest.java
@@ -41,6 +41,8 @@
@RunWith(MockitoJUnitRunner.class)
public class ProjectListUpdateHandlerTest {
+ private static final String INSTANCE_ID = "instance-id";
+
private ProjectListUpdateHandler handler;
@Mock private ProjectListUpdateForwarder forwarder;
@@ -51,7 +53,7 @@
when(projectsFilter.matches(any(String.class))).thenReturn(true);
handler =
new ProjectListUpdateHandler(
- asDynamicSet(forwarder), MoreExecutors.directExecutor(), projectsFilter);
+ asDynamicSet(forwarder), MoreExecutors.directExecutor(), projectsFilter, INSTANCE_ID);
}
private DynamicSet<ProjectListUpdateForwarder> asDynamicSet(
@@ -69,7 +71,8 @@
handler.onNewProjectCreated(event);
verify(forwarder)
.updateProjectList(
- any(ProjectListUpdateTask.class), eq(new ProjectListUpdateEvent(projectName, false)));
+ any(ProjectListUpdateTask.class),
+ eq(new ProjectListUpdateEvent(projectName, false, INSTANCE_ID)));
}
@Test
@@ -80,7 +83,8 @@
handler.onProjectDeleted(event);
verify(forwarder)
.updateProjectList(
- any(ProjectListUpdateTask.class), eq(new ProjectListUpdateEvent(projectName, true)));
+ any(ProjectListUpdateTask.class),
+ eq(new ProjectListUpdateEvent(projectName, true, INSTANCE_ID)));
}
@Test
@@ -101,18 +105,22 @@
handler.onNewProjectCreated(event);
verify(forwarder, never())
.updateProjectList(
- any(ProjectListUpdateTask.class), eq(new ProjectListUpdateEvent(projectName, true)));
+ any(ProjectListUpdateTask.class),
+ eq(new ProjectListUpdateEvent(projectName, true, INSTANCE_ID)));
}
@Test
public void testProjectUpdateTaskToString() throws Exception {
String projectName = "someProjectName";
ProjectListUpdateTask task =
- handler.new ProjectListUpdateTask(new ProjectListUpdateEvent(projectName, false));
+ handler
+ .new ProjectListUpdateTask(new ProjectListUpdateEvent(projectName, false, INSTANCE_ID));
assertThat(task.toString())
.isEqualTo(String.format("Update project list in target instance: add '%s'", projectName));
- task = handler.new ProjectListUpdateTask(new ProjectListUpdateEvent(projectName, true));
+ task =
+ handler
+ .new ProjectListUpdateTask(new ProjectListUpdateEvent(projectName, true, INSTANCE_ID));
assertThat(task.toString())
.isEqualTo(
String.format("Update project list in target instance: remove '%s'", projectName));
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java
index 8aa043d..aa17c36 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java
@@ -14,21 +14,23 @@
package com.googlesource.gerrit.plugins.multisite.consumer;
+import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
-import com.gerritforge.gerrit.eventbroker.EventMessage;
-import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDatabaseWrapper;
import com.google.common.base.Suppliers;
import com.google.gerrit.entities.Project;
import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.server.data.RefUpdateAttribute;
+import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.events.RefUpdatedEvent;
-import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
import com.googlesource.gerrit.plugins.multisite.ProjectVersionLogger;
import com.googlesource.gerrit.plugins.multisite.validation.ProjectVersionRefUpdate;
+import com.googlesource.gerrit.plugins.replication.events.ProjectDeletionReplicationSucceededEvent;
+import java.net.URISyntaxException;
import java.util.Optional;
-import java.util.UUID;
+import org.eclipse.jgit.transport.URIish;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -41,17 +43,13 @@
private static final Project.NameKey A_TEST_PROJECT_NAME_KEY =
Project.nameKey(A_TEST_PROJECT_NAME);
- @Mock private SharedRefDatabaseWrapper sharedRefDb;
- @Mock private GitReferenceUpdated gitReferenceUpdated;
@Mock private MetricMaker metricMaker;
@Mock private ProjectVersionLogger verLogger;
@Mock private ProjectVersionRefUpdate projectVersionRefUpdate;
private SubscriberMetrics metrics;
- private EventMessage.Header msgHeader;
@Before
public void setup() throws Exception {
- msgHeader = new EventMessage.Header(UUID.randomUUID(), UUID.randomUUID());
metrics = new SubscriberMetrics(metricMaker, projectVersionRefUpdate, verLogger);
}
@@ -63,7 +61,7 @@
when(projectVersionRefUpdate.getProjectLocalVersion(A_TEST_PROJECT_NAME))
.thenReturn(globalRefDbVersion);
- EventMessage eventMessage = new EventMessage(msgHeader, newRefUpdateEvent());
+ Event eventMessage = newRefUpdateEvent();
metrics.updateReplicationStatusMetrics(eventMessage);
@@ -79,13 +77,100 @@
when(projectVersionRefUpdate.getProjectLocalVersion(A_TEST_PROJECT_NAME))
.thenReturn(globalRefDbVersion);
- EventMessage eventMessage = new EventMessage(msgHeader, newRefUpdateEvent());
+ Event eventMessage = newRefUpdateEvent();
metrics.updateReplicationStatusMetrics(eventMessage);
verify(verLogger).log(A_TEST_PROJECT_NAME_KEY, globalRefDbVersion.get(), replicationLag);
}
+ @Test
+ public void
+ shouldLogUponProjectDeletionSuccessWhenLocalVersionDoesNotExistAndSubscriberMetricsExist()
+ throws Exception {
+ long nowSecs = System.currentTimeMillis() / 1000;
+ long replicationLagSecs = 60;
+ Optional<Long> globalRefDbVersion = Optional.of(nowSecs);
+ when(projectVersionRefUpdate.getProjectRemoteVersion(A_TEST_PROJECT_NAME))
+ .thenReturn(globalRefDbVersion.map(ts -> ts + replicationLagSecs));
+ when(projectVersionRefUpdate.getProjectLocalVersion(A_TEST_PROJECT_NAME))
+ .thenReturn(globalRefDbVersion);
+
+ Event refUpdateEventMessage = newRefUpdateEvent();
+ metrics.updateReplicationStatusMetrics(refUpdateEventMessage);
+
+ assertThat(metrics.getReplicationStatus(A_TEST_PROJECT_NAME)).isEqualTo(replicationLagSecs);
+ assertThat(metrics.getLocalVersion(A_TEST_PROJECT_NAME)).isEqualTo(nowSecs);
+
+ when(projectVersionRefUpdate.getProjectLocalVersion(A_TEST_PROJECT_NAME))
+ .thenReturn(Optional.empty());
+
+ Event projectDeleteEventMessage = projectDeletionSuccess();
+ metrics.updateReplicationStatusMetrics(projectDeleteEventMessage);
+
+ verify(verLogger).logDeleted(A_TEST_PROJECT_NAME_KEY);
+ }
+
+ @Test
+ public void shouldNotLogUponProjectDeletionSuccessWhenSubscriberMetricsDoNotExist()
+ throws Exception {
+ Event eventMessage = projectDeletionSuccess();
+ when(projectVersionRefUpdate.getProjectLocalVersion(A_TEST_PROJECT_NAME))
+ .thenReturn(Optional.empty());
+
+ assertThat(metrics.getReplicationStatus(A_TEST_PROJECT_NAME)).isNull();
+ assertThat(metrics.getLocalVersion(A_TEST_PROJECT_NAME)).isNull();
+
+ metrics.updateReplicationStatusMetrics(eventMessage);
+
+ verifyZeroInteractions(verLogger);
+ }
+
+ @Test
+ public void shouldNotLogUponProjectDeletionSuccessWhenLocalVersionStillExists() throws Exception {
+ Event eventMessage = projectDeletionSuccess();
+ Optional<Long> anyRefVersionValue = Optional.of(System.currentTimeMillis() / 1000);
+ when(projectVersionRefUpdate.getProjectLocalVersion(A_TEST_PROJECT_NAME))
+ .thenReturn(anyRefVersionValue);
+
+ metrics.updateReplicationStatusMetrics(eventMessage);
+
+ verifyZeroInteractions(verLogger);
+ }
+
+ @Test
+ public void shouldRemoveProjectMetricsUponProjectDeletionSuccess() throws Exception {
+ long nowSecs = System.currentTimeMillis() / 1000;
+ long replicationLagSecs = 60;
+ Optional<Long> globalRefDbVersion = Optional.of(nowSecs);
+ when(projectVersionRefUpdate.getProjectRemoteVersion(A_TEST_PROJECT_NAME))
+ .thenReturn(globalRefDbVersion.map(ts -> ts + replicationLagSecs));
+ when(projectVersionRefUpdate.getProjectLocalVersion(A_TEST_PROJECT_NAME))
+ .thenReturn(globalRefDbVersion);
+
+ Event eventMessage = newRefUpdateEvent();
+
+ metrics.updateReplicationStatusMetrics(eventMessage);
+
+ assertThat(metrics.getReplicationStatus(A_TEST_PROJECT_NAME)).isEqualTo(replicationLagSecs);
+ assertThat(metrics.getLocalVersion(A_TEST_PROJECT_NAME)).isEqualTo(nowSecs);
+
+ when(projectVersionRefUpdate.getProjectLocalVersion(A_TEST_PROJECT_NAME))
+ .thenReturn(Optional.empty());
+ Event projectDeleteEvent = projectDeletionSuccess();
+
+ metrics.updateReplicationStatusMetrics(projectDeleteEvent);
+
+ assertThat(metrics.getReplicationStatus(A_TEST_PROJECT_NAME)).isNull();
+ assertThat(metrics.getLocalVersion(A_TEST_PROJECT_NAME)).isNull();
+ }
+
+ private ProjectDeletionReplicationSucceededEvent projectDeletionSuccess()
+ throws URISyntaxException {
+ return new ProjectDeletionReplicationSucceededEvent(
+ A_TEST_PROJECT_NAME, new URIish("git://target"));
+ }
+
private RefUpdatedEvent newRefUpdateEvent() {
RefUpdateAttribute refUpdate = new RefUpdateAttribute();
refUpdate.project = A_TEST_PROJECT_NAME;
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/event/CacheEvictionEventRouterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/event/CacheEvictionEventRouterTest.java
index 76c001f..6762ba2 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/event/CacheEvictionEventRouterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/event/CacheEvictionEventRouterTest.java
@@ -34,6 +34,7 @@
@RunWith(MockitoJUnitRunner.class)
public class CacheEvictionEventRouterTest {
+ private static final String INSTANCE_ID = "instance-id";
private static Gson gson = new EventGsonProvider().get();
private CacheEvictionEventRouter router;
@Mock private ForwardedCacheEvictionHandler cacheEvictionHandler;
@@ -45,7 +46,7 @@
@Test
public void routerShouldSendEventsToTheAppropriateHandler_CacheEviction() throws Exception {
- final CacheEvictionEvent event = new CacheEvictionEvent("cache", "key");
+ final CacheEvictionEvent event = new CacheEvictionEvent("cache", "key", INSTANCE_ID);
router.route(event);
verify(cacheEvictionHandler).evict(CacheEntry.from(event.cacheName, event.key));
@@ -54,7 +55,7 @@
@Test
public void routerShouldSendEventsToTheAppropriateHandler_CacheEvictionWithSlash()
throws Exception {
- final CacheEvictionEvent event = new CacheEvictionEvent("cache", "some/key");
+ final CacheEvictionEvent event = new CacheEvictionEvent("cache", "some/key", INSTANCE_ID);
router.route(event);
verify(cacheEvictionHandler).evict(CacheEntry.from(event.cacheName, event.key));
@@ -63,7 +64,8 @@
@Test
public void routerShouldSendEventsToTheAppropriateHandler_ProjectCacheEvictionWithSlash()
throws Exception {
- final CacheEvictionEvent event = new CacheEvictionEvent(Constants.PROJECTS, "some/project");
+ final CacheEvictionEvent event =
+ new CacheEvictionEvent(Constants.PROJECTS, "some/project", INSTANCE_ID);
router.route(event);
verify(cacheEvictionHandler)
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java
index 1dc07bd..8efa2ed 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java
@@ -33,7 +33,7 @@
import com.googlesource.gerrit.plugins.multisite.forwarder.events.ProjectIndexEvent;
import com.googlesource.gerrit.plugins.multisite.forwarder.router.IndexEventRouter;
import com.googlesource.gerrit.plugins.multisite.forwarder.router.StreamEventRouter;
-import com.googlesource.gerrit.plugins.replication.RefReplicationDoneEvent;
+import com.googlesource.gerrit.plugins.replication.events.RefReplicationDoneEvent;
import java.util.Optional;
import org.eclipse.jgit.lib.ObjectId;
import org.junit.Before;
@@ -44,7 +44,7 @@
@RunWith(MockitoJUnitRunner.class)
public class IndexEventRouterTest {
-
+ private static final String INSTANCE_ID = "instance-id";
private IndexEventRouter router;
@Mock private ForwardedIndexAccountHandler indexAccountHandler;
@Mock private ForwardedIndexChangeHandler indexChangeHandler;
@@ -66,7 +66,7 @@
@Test
public void routerShouldSendEventsToTheAppropriateHandler_AccountIndex() throws Exception {
- final AccountIndexEvent event = new AccountIndexEvent(1);
+ final AccountIndexEvent event = new AccountIndexEvent(1, INSTANCE_ID);
router.route(event);
verify(indexAccountHandler)
@@ -80,7 +80,7 @@
StreamEventRouter streamEventRouter = new StreamEventRouter(forwardedEventHandler, router);
- final AccountIndexEvent event = new AccountIndexEvent(1);
+ final AccountIndexEvent event = new AccountIndexEvent(1, INSTANCE_ID);
router.route(event);
verify(indexAccountHandler)
@@ -96,7 +96,7 @@
@Test
public void routerShouldSendEventsToTheAppropriateHandler_GroupIndex() throws Exception {
final String groupId = "12";
- final GroupIndexEvent event = new GroupIndexEvent(groupId, ObjectId.zeroId());
+ final GroupIndexEvent event = new GroupIndexEvent(groupId, ObjectId.zeroId(), INSTANCE_ID);
router.route(event);
verify(indexGroupHandler)
@@ -108,7 +108,7 @@
@Test
public void routerShouldSendEventsToTheAppropriateHandler_ProjectIndex() throws Exception {
final String projectName = "projectName";
- final ProjectIndexEvent event = new ProjectIndexEvent(projectName);
+ final ProjectIndexEvent event = new ProjectIndexEvent(projectName, INSTANCE_ID);
router.route(event);
verify(indexProjectHandler)
@@ -119,7 +119,7 @@
@Test
public void routerShouldSendEventsToTheAppropriateHandler_ChangeIndex() throws Exception {
- final ChangeIndexEvent event = new ChangeIndexEvent("projectName", 3, false);
+ final ChangeIndexEvent event = new ChangeIndexEvent("projectName", 3, false, INSTANCE_ID);
router.route(event);
verify(indexChangeHandler)
@@ -133,7 +133,7 @@
@Test
public void routerShouldSendEventsToTheAppropriateHandler_ChangeIndexDelete() throws Exception {
- final ChangeIndexEvent event = new ChangeIndexEvent("projectName", 3, true);
+ final ChangeIndexEvent event = new ChangeIndexEvent("projectName", 3, true, INSTANCE_ID);
router.route(event);
verify(indexChangeHandler)
@@ -147,7 +147,7 @@
@Test
public void routerShouldFailForNotRecognisedEvents() throws Exception {
- final IndexEvent newEventType = new IndexEvent("new-type") {};
+ final IndexEvent newEventType = new IndexEvent("new-type", INSTANCE_ID) {};
assertThrows(UnsupportedOperationException.class, () -> router.route(newEventType));
verifyZeroInteractions(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/event/ProjectListUpdateRouterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/event/ProjectListUpdateRouterTest.java
index 93daf92..8a21c39 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/event/ProjectListUpdateRouterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/event/ProjectListUpdateRouterTest.java
@@ -38,7 +38,8 @@
@Test
public void routerShouldSendEventsToTheAppropriateHandler_ProjectListUpdate() throws Exception {
- final ProjectListUpdateEvent event = new ProjectListUpdateEvent("project", false);
+ String instanceId = "instance-id";
+ final ProjectListUpdateEvent event = new ProjectListUpdateEvent("project", false, instanceId);
router.route(event);
verify(projectListUpdateHandler).update(event);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/BrokerForwarderTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/BrokerForwarderTest.java
index e3d1ae0..28bf56d 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/BrokerForwarderTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/BrokerForwarderTest.java
@@ -68,10 +68,10 @@
}
}
- public class TestEvent extends MultiSiteEvent {
+ public static class TestEvent extends MultiSiteEvent {
protected TestEvent() {
- super("test");
+ super("test", "instance-id");
}
}
@@ -93,7 +93,7 @@
@Test
public void shouldSendEventToBrokerFromGenericSourceThread() {
brokerForwarder.send(newForwarderTask(), testTopic, testEvent);
- verify(brokerMock).send(eq(testTopicName), eq(testEvent));
+ verify(brokerMock).sendSync(eq(testTopicName), eq(testEvent));
}
@Test
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java
index 826e154..75596ed 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java
@@ -22,6 +22,7 @@
import com.google.common.collect.Sets;
import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
import com.google.gerrit.acceptance.TestPlugin;
+import com.google.gerrit.acceptance.config.GerritConfig;
import com.google.gerrit.entities.Project;
import com.google.gerrit.extensions.api.projects.ProjectInput;
import com.google.gerrit.extensions.registration.DynamicSet;
@@ -123,8 +124,10 @@
}
@Test
+ @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
public void shouldEvictProjectCache() throws Exception {
- objectUnderTest.route(new CacheEvictionEvent(ProjectCacheImpl.CACHE_NAME, project.get()));
+ objectUnderTest.route(
+ new CacheEvictionEvent(ProjectCacheImpl.CACHE_NAME, project.get(), "instance-id"));
evictionsCacheTracker.waitForExpectedEvictions();
assertThat(evictionsCacheTracker.trackedEvictionsFor(ProjectCacheImpl.CACHE_NAME))
@@ -132,6 +135,7 @@
}
@Test
+ @GerritConfig(name = "gerrit.instanceId", value = "instance-id")
public void shouldEvictProjectCacheWithSlash() throws Exception {
ProjectInput in = new ProjectInput();
in.name = name("my/project");
@@ -141,7 +145,7 @@
restartCacheEvictionsTracking();
objectUnderTest.route(
- new CacheEvictionEvent(ProjectCacheImpl.CACHE_NAME, projectNameKey.get()));
+ new CacheEvictionEvent(ProjectCacheImpl.CACHE_NAME, projectNameKey.get(), "instance-id"));
evictionsCacheTracker.waitForExpectedEvictions();
assertThat(evictionsCacheTracker.trackedEvictionsFor(ProjectCacheImpl.CACHE_NAME))
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerTest.java
index 90ae8da..dbd358d 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerTest.java
@@ -15,6 +15,7 @@
package com.googlesource.gerrit.plugins.multisite.forwarder;
import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.testing.GerritJUnit.assertThrows;
import static org.mockito.Mockito.doReturn;
import com.google.common.cache.Cache;
@@ -48,10 +49,12 @@
public void shouldThrowAnExceptionWhenCacheNotFound() throws Exception {
CacheEntry entry = new CacheEntry("somePlugin", "unexistingCache", null);
- exception.expect(CacheNotFoundException.class);
- exception.expectMessage(
- String.format("cache %s.%s not found", entry.getPluginName(), entry.getCacheName()));
- handler.evict(entry);
+ CacheNotFoundException thrown =
+ assertThrows(CacheNotFoundException.class, () -> handler.evict(entry));
+ assertThat(thrown)
+ .hasMessageThat()
+ .isEqualTo(
+ String.format("cache %s.%s not found", entry.getPluginName(), entry.getCacheName()));
}
@Test
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandlerTest.java
index 32c6319..02efb77 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandlerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandlerTest.java
@@ -61,9 +61,11 @@
@Test
public void deleteIsNotSupported() throws Exception {
- exception.expect(UnsupportedOperationException.class);
- exception.expectMessage("Delete from account index not supported");
- handler.index(id, Operation.DELETE, Optional.empty());
+ UnsupportedOperationException thrown =
+ assertThrows(
+ UnsupportedOperationException.class,
+ () -> handler.index(id, Operation.DELETE, Optional.empty()));
+ assertThat(thrown).hasMessageThat().isEqualTo("Delete from account index not supported");
}
@Test
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java
index 96470b6..452a0d2 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java
@@ -104,7 +104,9 @@
public void changeIsStillIndexedEvenWhenOutdated() throws Exception {
setupChangeAccessRelatedMocks(CHANGE_EXISTS, CHANGE_OUTDATED);
handler.index(
- TEST_CHANGE_ID, Operation.INDEX, Optional.of(new ChangeIndexEvent("foo", 1, false)));
+ TEST_CHANGE_ID,
+ Operation.INDEX,
+ Optional.of(new ChangeIndexEvent("foo", 1, false, "instance-id")));
verify(indexerMock, times(1)).index(any(Change.class));
}
@@ -125,8 +127,9 @@
@Test
public void indexerThrowsStorageExceptionTryingToIndexChange() throws Exception {
setupChangeAccessRelatedMocks(CHANGE_EXISTS, THROW_STORAGE_EXCEPTION, CHANGE_UP_TO_DATE);
- exception.expect(StorageException.class);
- handler.index(TEST_CHANGE_ID, Operation.INDEX, Optional.empty());
+ assertThrows(
+ StorageException.class,
+ () -> handler.index(TEST_CHANGE_ID, Operation.INDEX, Optional.empty()));
}
@Test
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandlerTest.java
index 982ac52..b49dbfa 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandlerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandlerTest.java
@@ -74,9 +74,11 @@
@Test
public void deleteIsNotSupported() throws Exception {
- exception.expect(UnsupportedOperationException.class);
- exception.expectMessage("Delete from group index not supported");
- handler.index(uuid, Operation.DELETE, Optional.empty());
+ UnsupportedOperationException thrown =
+ assertThrows(
+ UnsupportedOperationException.class,
+ () -> handler.index(uuid, Operation.DELETE, Optional.empty()));
+ assertThat(thrown).hasMessageThat().isEqualTo("Delete from group index not supported");
}
@Test
@@ -141,6 +143,6 @@
}
private Optional<GroupIndexEvent> groupIndexEvent(String uuid) {
- return Optional.of(new GroupIndexEvent(uuid, null));
+ return Optional.of(new GroupIndexEvent(uuid, null, "instance-id"));
}
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandlerTest.java
index 3ce5e14..72b9427 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandlerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandlerTest.java
@@ -73,9 +73,11 @@
@Test
public void deleteIsNotSupported() throws Exception {
- exception.expect(UnsupportedOperationException.class);
- exception.expectMessage("Delete from project index not supported");
- handler.index(nameKey, Operation.DELETE, Optional.empty());
+ UnsupportedOperationException thrown =
+ assertThrows(
+ UnsupportedOperationException.class,
+ () -> handler.index(nameKey, Operation.DELETE, Optional.empty()));
+ assertThat(thrown).hasMessageThat().isEqualTo("Delete from project index not supported");
}
@Test
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedProjectListUpdateHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedProjectListUpdateHandlerTest.java
index 9893ce7..2412c79 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedProjectListUpdateHandlerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedProjectListUpdateHandlerTest.java
@@ -34,6 +34,7 @@
@RunWith(MockitoJUnitRunner.class)
public class ForwardedProjectListUpdateHandlerTest {
+ private static final String INSTANCE_ID = "instance-id";
private static final String PROJECT_NAME = "someProject";
private static final String SOME_MESSAGE = "someMessage";
private static final Project.NameKey PROJECT_KEY = Project.nameKey(PROJECT_NAME);
@@ -48,13 +49,13 @@
@Test
public void testSuccessfulAdd() throws Exception {
- handler.update(new ProjectListUpdateEvent(PROJECT_NAME, false));
+ handler.update(new ProjectListUpdateEvent(PROJECT_NAME, false, INSTANCE_ID));
verify(projectCacheMock).onCreateProject(PROJECT_KEY);
}
@Test
public void testSuccessfulRemove() throws Exception {
- handler.update(new ProjectListUpdateEvent(PROJECT_NAME, true));
+ handler.update(new ProjectListUpdateEvent(PROJECT_NAME, true, INSTANCE_ID));
verify(projectCacheMock).remove(PROJECT_KEY);
}
@@ -72,7 +73,7 @@
.onCreateProject(PROJECT_KEY);
assertThat(Context.isForwardedEvent()).isFalse();
- handler.update(new ProjectListUpdateEvent(PROJECT_NAME, false));
+ handler.update(new ProjectListUpdateEvent(PROJECT_NAME, false, INSTANCE_ID));
assertThat(Context.isForwardedEvent()).isFalse();
verify(projectCacheMock).onCreateProject(PROJECT_KEY);
@@ -92,7 +93,7 @@
.remove(PROJECT_KEY);
assertThat(Context.isForwardedEvent()).isFalse();
- handler.update(new ProjectListUpdateEvent(PROJECT_NAME, true));
+ handler.update(new ProjectListUpdateEvent(PROJECT_NAME, true, INSTANCE_ID));
assertThat(Context.isForwardedEvent()).isFalse();
verify(projectCacheMock).remove(PROJECT_KEY);
@@ -113,7 +114,7 @@
RuntimeException thrown =
assertThrows(
RuntimeException.class,
- () -> handler.update(new ProjectListUpdateEvent(PROJECT_NAME, false)));
+ () -> handler.update(new ProjectListUpdateEvent(PROJECT_NAME, false, INSTANCE_ID)));
assertThat(thrown).hasMessageThat().isEqualTo(SOME_MESSAGE);
assertThat(Context.isForwardedEvent()).isFalse();
@@ -135,7 +136,7 @@
RuntimeException thrown =
assertThrows(
RuntimeException.class,
- () -> handler.update(new ProjectListUpdateEvent(PROJECT_NAME, true)));
+ () -> handler.update(new ProjectListUpdateEvent(PROJECT_NAME, true, INSTANCE_ID)));
assertThat(thrown).hasMessageThat().isEqualTo(SOME_MESSAGE);
assertThat(Context.isForwardedEvent()).isFalse();
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/index/GroupCheckerImplTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/index/GroupCheckerImplTest.java
index 6403cce..09f8f59 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/index/GroupCheckerImplTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/index/GroupCheckerImplTest.java
@@ -101,7 +101,7 @@
}
private Optional<GroupIndexEvent> groupIndexEvent(String uuid, @Nullable ObjectId sha1) {
- return Optional.of(new GroupIndexEvent(uuid, sha1));
+ return Optional.of(new GroupIndexEvent(uuid, sha1, "instance-id"));
}
private void setCommitExistsInRepo(boolean commitExists) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/index/GroupEventIndexTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/index/GroupEventIndexTest.java
index 93cec05..099f1dd 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/index/GroupEventIndexTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/index/GroupEventIndexTest.java
@@ -16,7 +16,7 @@
import static com.google.common.truth.Truth.assertThat;
-import com.gerritforge.gerrit.eventbroker.EventGsonProvider;
+import com.google.gerrit.server.events.EventGsonProvider;
import com.google.gson.Gson;
import com.googlesource.gerrit.plugins.multisite.forwarder.events.GroupIndexEvent;
import java.util.UUID;
@@ -24,13 +24,14 @@
import org.junit.Test;
public class GroupEventIndexTest {
+ private static final String INSTANCE_ID = "instance-id";
private static final Gson gson = new EventGsonProvider().get();
@Test
public void groupEventIndexRoundTripWithSha1() {
String aGroupUUID = UUID.randomUUID().toString();
ObjectId anObjectId = ObjectId.fromString("deadbeefdeadbeefdeadbeefdeadbeefdeadbeef");
- GroupIndexEvent original = new GroupIndexEvent(aGroupUUID, anObjectId);
+ GroupIndexEvent original = new GroupIndexEvent(aGroupUUID, anObjectId, INSTANCE_ID);
assertThat(gson.fromJson(gson.toJson(original), GroupIndexEvent.class)).isEqualTo(original);
}
@@ -38,7 +39,7 @@
@Test
public void groupEventIndexRoundTripWithoutSha1() {
String aGroupUUID = UUID.randomUUID().toString();
- GroupIndexEvent original = new GroupIndexEvent(aGroupUUID, null);
+ GroupIndexEvent original = new GroupIndexEvent(aGroupUUID, null, INSTANCE_ID);
assertThat(gson.fromJson(gson.toJson(original), GroupIndexEvent.class)).isEqualTo(original);
}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/index/IndexEventHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/index/IndexEventHandlerTest.java
index 660a302..3fd13c6 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/index/IndexEventHandlerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/index/IndexEventHandlerTest.java
@@ -36,6 +36,8 @@
@RunWith(MockitoJUnitRunner.class)
public class IndexEventHandlerTest {
+ private static final String INSTANCE_ID = "instance-id";
+
private IndexEventHandler eventHandler;
@Mock private ProjectsFilter projectsFilter;
@@ -50,7 +52,8 @@
asDynamicSet(forwarder),
changeChecker,
projectsFilter,
- new TestGroupChecker(true));
+ new TestGroupChecker(true),
+ INSTANCE_ID);
}
private DynamicSet<IndexEventForwarder> asDynamicSet(IndexEventForwarder forwarder) {
@@ -65,7 +68,7 @@
eventHandler.onProjectIndexed("test_project");
verify(forwarder, never())
- .index(any(IndexProjectTask.class), eq(new ProjectIndexEvent("test_project")));
+ .index(any(IndexProjectTask.class), eq(new ProjectIndexEvent("test_project", INSTANCE_ID)));
}
@Test