Merge "Reindex accounts upon pull-replication" into stable-3.4
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 2cf83cd..a647bce 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
@@ -21,6 +21,10 @@
import com.google.gerrit.entities.Account;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.server.config.AllUsersName;
+import com.google.gerrit.server.config.GerritInstanceId;
+import com.google.gerrit.server.events.Event;
+import com.google.gerrit.server.events.EventListener;
+import com.google.gerrit.server.events.RefEvent;
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexAccountHandler;
import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexChangeHandler;
@@ -32,12 +36,12 @@
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.events.RefReplicationDoneEvent;
import java.io.IOException;
import java.util.Optional;
import java.util.Set;
-public class IndexEventRouter implements ForwardedEventRouter<IndexEvent>, LifecycleListener {
+public class IndexEventRouter
+ implements ForwardedEventRouter<IndexEvent>, EventListener, LifecycleListener {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private final ForwardedIndexAccountHandler indexAccountHandler;
@@ -45,6 +49,7 @@
private final ForwardedIndexGroupHandler indexGroupHandler;
private final ForwardedIndexProjectHandler indexProjectHandler;
private final AllUsersName allUsersName;
+ private final String gerritInstanceId;
@Inject
public IndexEventRouter(
@@ -52,12 +57,14 @@
ForwardedIndexChangeHandler indexChangeHandler,
ForwardedIndexGroupHandler indexGroupHandler,
ForwardedIndexProjectHandler indexProjectHandler,
- AllUsersName allUsersName) {
+ AllUsersName allUsersName,
+ @GerritInstanceId String gerritInstanceId) {
this.indexAccountHandler = indexAccountHandler;
this.indexChangeHandler = indexChangeHandler;
this.indexGroupHandler = indexGroupHandler;
this.indexProjectHandler = indexProjectHandler;
this.allUsersName = allUsersName;
+ this.gerritInstanceId = gerritInstanceId;
}
@Override
@@ -85,7 +92,7 @@
}
}
- public void onRefReplicated(RefReplicationDoneEvent replicationEvent) throws IOException {
+ public void onRefReplicated(RefEvent replicationEvent) throws IOException {
if (replicationEvent.getProjectNameKey().equals(allUsersName)) {
Account.Id accountId = Account.Id.fromRef(replicationEvent.getRefName());
if (accountId != null) {
@@ -97,6 +104,20 @@
}
@Override
+ public void onEvent(Event event) {
+ if (event instanceof RefEvent
+ && (event.getType().contains("fetch-ref-replicated")
+ || event.getType().contains("fetch-ref-replication-done"))
+ && gerritInstanceId.equals(event.instanceId)) {
+ try {
+ onRefReplicated((RefEvent) event);
+ } catch (IOException e) {
+ logger.atSevere().withCause(e).log("Error while processing event %s", event);
+ }
+ }
+ }
+
+ @Override
public void start() {}
@Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java
index bac907e..2193034 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java
@@ -14,7 +14,9 @@
package com.googlesource.gerrit.plugins.multisite.forwarder.router;
+import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.lifecycle.LifecycleModule;
+import com.google.gerrit.server.events.EventListener;
import com.google.inject.Scopes;
public class RouterModule extends LifecycleModule {
@@ -22,6 +24,8 @@
protected void configure() {
bind(IndexEventRouter.class).in(Scopes.SINGLETON);
listener().to(IndexEventRouter.class).in(Scopes.SINGLETON);
+ DynamicSet.bind(binder(), EventListener.class).to(IndexEventRouter.class);
+
bind(CacheEvictionEventRouter.class).in(Scopes.SINGLETON);
bind(ProjectListUpdateRouter.class).in(Scopes.SINGLETON);
bind(StreamEventRouter.class).in(Scopes.SINGLETON);
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 8efa2ed..413b6c1 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
@@ -61,7 +61,8 @@
indexChangeHandler,
indexGroupHandler,
indexProjectHandler,
- allUsersName);
+ allUsersName,
+ INSTANCE_ID);
}
@Test
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java
index 4d3cb6f..f940fc4 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java
@@ -24,6 +24,7 @@
import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
import com.google.gerrit.acceptance.RestResponse;
import com.google.gerrit.acceptance.TestPlugin;
+import com.google.gerrit.acceptance.config.GerritConfig;
import com.google.gerrit.entities.Project;
import com.google.gerrit.httpd.restapi.RestApiServlet;
import com.google.gerrit.server.git.WorkQueue;
@@ -85,6 +86,7 @@
}
@Test
+ @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
public void shouldSucceedForAdminUsers() throws Exception {
RestResponse result = adminRestSession.get(LAG_ENDPOINT);
@@ -93,6 +95,7 @@
}
@Test
+ @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
public void shouldFailWhenUserHasNoAdminServerCapability() throws Exception {
RestResponse result = userRestSession.get(LAG_ENDPOINT);
result.assertForbidden();
@@ -100,6 +103,7 @@
}
@Test
+ @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
public void shouldReturnCurrentProjectLag() throws Exception {
replicationStatus.doUpdateLag(Project.nameKey("foo"), 123L);
@@ -110,6 +114,7 @@
}
@Test
+ @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
public void shouldReturnProjectsOrderedDescendinglyByLag() throws Exception {
replicationStatus.doUpdateLag(Project.nameKey("bar"), 123L);
replicationStatus.doUpdateLag(Project.nameKey("foo"), 3L);
@@ -122,6 +127,7 @@
}
@Test
+ @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
public void shouldHonourTheLimitParameter() throws Exception {
replicationStatus.doUpdateLag(Project.nameKey("bar"), 1L);
replicationStatus.doUpdateLag(Project.nameKey("foo"), 2L);