Leverage stream events publishing from the events-broker
Events-broker now provides a class to handle the publishing of gerrit
stream events in a centralized way.
In order to maintain backward-compatibility with the fact that
events-broker implementations were publishing stream events to the
`gerrit` topic, a new optional `broker.gerritEventsTopic` configuration
has been introduced.
The need for the additional `STREAM_EVENT_TOPIC` topic can be removed
once [1] has been completed.
[1] https://bugs.chromium.org/p/gerrit/issues/detail?id=14835
Bug: Issue 14834
Change-Id: Iafe5a8155a98746191926286d3618beabf3aa452
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 ad53449..69bd62f 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
@@ -54,7 +54,7 @@
install(new CacheModule());
}
if (config.event().synchronize()) {
- install(new EventModule());
+ install(new EventModule(config));
}
if (config.index().synchronize()) {
install(new IndexModule());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/event/EventModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/event/EventModule.java
index 1c0c644..663d8e5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/event/EventModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/event/EventModule.java
@@ -14,13 +14,25 @@
package com.googlesource.gerrit.plugins.multisite.event;
+import com.gerritforge.gerrit.eventbroker.StreamEventPublisher;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.server.events.EventListener;
+import com.google.inject.Inject;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
+import com.googlesource.gerrit.plugins.multisite.Configuration;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.EventTopic;
import com.googlesource.gerrit.plugins.multisite.validation.ProjectVersionRefUpdate;
import java.util.concurrent.Executor;
public class EventModule extends LifecycleModule {
+ private final Configuration configuration;
+
+ @Inject
+ public EventModule(Configuration configuration) {
+ this.configuration = configuration;
+ }
@Override
protected void configure() {
@@ -28,5 +40,10 @@
listener().to(EventExecutorProvider.class);
DynamicSet.bind(binder(), EventListener.class).to(EventHandler.class);
DynamicSet.bind(binder(), EventListener.class).to(ProjectVersionRefUpdate.class);
+ bind(new TypeLiteral<String>() {})
+ .annotatedWith(Names.named(StreamEventPublisher.STREAM_EVENTS_TOPIC))
+ .toInstance(EventTopic.GERRIT_TOPIC.topic(configuration));
+
+ DynamicSet.bind(binder(), EventListener.class).to(StreamEventPublisher.class);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/EventTopic.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/EventTopic.java
index 4e7a781..507f067 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/EventTopic.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/EventTopic.java
@@ -21,7 +21,36 @@
BATCH_INDEX_TOPIC("GERRIT.EVENT.BATCH.INDEX", "batchIndexEvent"),
CACHE_TOPIC("GERRIT.EVENT.CACHE", "cacheEvent"),
PROJECT_LIST_TOPIC("GERRIT.EVENT.PROJECT.LIST", "projectListEvent"),
- STREAM_EVENT_TOPIC("GERRIT.EVENT.STREAM", "streamEvent");
+ /**
+ * the STREAM_EVENT_TOPICS and the GERRIT_TOPIC are both used to publish stream events. It might
+ * not be immediately intuitive why there are _two_ streams for this, rather than one. These are
+ * some gotchas regarding this:
+ *
+ * <ul>
+ * <li>A subset of stream events is published to the STREAM_EVENT_TOPIC (i.e. only global
+ * project events). This is done by the EventHandler.
+ * <li>All, unfiltered gerrit events are published to a topic called `gerrit` (the
+ * GERRIT_TOPIC). This is done by the StreamEventPublisher provided by the events-broker
+ * library.
+ * </ul>
+ *
+ * Historically, the GERRIT_TOPIC existed to allow the streaming of all stream events. With the
+ * introduction of multi-site however, events had to be wrapped into EventMessage and streamed
+ * separately, in order to provide a header containing the instance-id that produced that message.
+ * For this purpose a *new* STREAM_EVENT_TOPIC topic was introduced.
+ *
+ * <p><a href="https://bugs.chromium.org/p/gerrit/issues/detail?id=14823">Issue 14823</a> now
+ * removed the need of EventMessage altogether,so that the `STREAM_EVENT_TOPIC` stream,
+ * conceptually would not be needed anymore.
+ *
+ * <p>However, before the `STREAM_EVENT_TOPIC` stream can be effectively removed, the filtering of
+ * the events needs to happen on the receiving side, as explained in <a
+ * href="https://bugs.chromium.org/p/gerrit/issues/detail?id=14835">Issue 14835</a>.
+ *
+ * <p>This would allow to *all* events to be streamed to the STREAM_EVENT_TOPICS.
+ */
+ STREAM_EVENT_TOPIC("GERRIT.EVENT.STREAM", "streamEvent"),
+ GERRIT_TOPIC("gerrit", "gerritEvents");
private final String topic;
private final String aliasKey;
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index a76545f..d7d2239 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -59,9 +59,15 @@
Defaults to GERRIT.EVENT.INDEX
```broker.streamEventTopic```
-: Name of the topic to use for publishing stream events
+: Name of the topic to use for publishing stream events. Note that only
+ project events are streamed and only for global projects (see
+ `projects.pattern`).
Defaults to GERRIT.EVENT.STREAM
+`broker.gerritEventsTopic`
+: Name of the topic to use for publishing all stream events.
+ Default: gerrit
+
```broker.cacheEventTopic```
: Name of the topic to use for publishing cache eviction events
Defaults to GERRIT.EVENT.CACHE