Merge branch 'stable-3.0' into stable-3.1
* stable-3.0:
ReplicationStorageIT: Wait for all pushes without order
ReplicationTasksStorage: Add multi-primary unit tests
Change-Id: I3961368f7bcf7d4aa923d07f7f89beeaaeb307d3
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationDaemon.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationDaemon.java
index 7432745..420cdf8 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationDaemon.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationDaemon.java
@@ -28,7 +28,9 @@
import java.nio.file.Path;
import java.time.Duration;
import java.util.Arrays;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
@@ -160,6 +162,31 @@
}
}
+ protected boolean isPushCompleted(Map<Project.NameKey, String> refsByProject, Duration timeOut) {
+ try {
+ WaitUtil.waitUntil(
+ () -> {
+ Iterator<Map.Entry<Project.NameKey, String>> iterator =
+ refsByProject.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry<Project.NameKey, String> entry = iterator.next();
+ try (Repository repo = repoManager.openRepository(entry.getKey())) {
+ if (checkedGetRef(repo, entry.getValue()) != null) {
+ iterator.remove();
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Cannot open repo for project" + entry.getKey(), e);
+ }
+ }
+ return refsByProject.isEmpty();
+ },
+ timeOut);
+ } catch (InterruptedException e) {
+ return false;
+ }
+ return true;
+ }
+
protected Ref checkedGetRef(Repository repo, String branchName) {
try {
return repo.getRefDatabase().exactRef(branchName);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationStorageIT.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationStorageIT.java
index 9e28b24..88b8f87 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationStorageIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationStorageIT.java
@@ -26,7 +26,9 @@
import java.net.URISyntaxException;
import java.time.Duration;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.regex.Pattern;
import java.util.stream.Stream;
@@ -182,15 +184,20 @@
String changeRef1 = createChange().getPatchSet().refName();
String changeRef2 = createChange().getPatchSet().refName();
+ Map<Project.NameKey, String> refsByProject = new HashMap<>();
+ refsByProject.put(target1, changeRef1);
+ refsByProject.put(target2, changeRef1);
+ refsByProject.put(target1, changeRef2);
+ refsByProject.put(target2, changeRef2);
setReplicationDestination(remote1, suffix1, ALL_PROJECTS);
setReplicationDestination(remote2, suffix2, ALL_PROJECTS);
reloadConfig();
- assertThat(isPushCompleted(target1, changeRef1, TEST_PUSH_TIMEOUT)).isEqualTo(true);
- assertThat(isPushCompleted(target2, changeRef1, TEST_PUSH_TIMEOUT)).isEqualTo(true);
- assertThat(isPushCompleted(target1, changeRef2, TEST_PUSH_TIMEOUT)).isEqualTo(true);
- assertThat(isPushCompleted(target2, changeRef2, TEST_PUSH_TIMEOUT)).isEqualTo(true);
+ // Wait for completion within the time 2 pushes should take because each remote only has 1
+ // thread and needs to push 2 events
+ assertThat(isPushCompleted(refsByProject, TEST_PUSH_TIMEOUT.plus(TEST_PUSH_TIMEOUT)))
+ .isEqualTo(true);
}
@Test
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageMPTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageMPTest.java
index 75912fa..42c0914 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageMPTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorageMPTest.java
@@ -32,7 +32,7 @@
protected static final String REF = "myRef";
protected static final String REMOTE = "myDest";
protected static final URIish URISH =
- ReplicationTasksStorageTaskTest.getUrish("http://example.com/" + PROJECT + ".git");
+ ReplicationTasksStorageTest.getUrish("http://example.com/" + PROJECT + ".git");
protected static final ReplicationTasksStorage.ReplicateRefUpdate REF_UPDATE =
new ReplicationTasksStorage.ReplicateRefUpdate(PROJECT, REF, URISH, REMOTE);
protected static final UriUpdates URI_UPDATES = getUriUpdates(REF_UPDATE);
@@ -60,6 +60,14 @@
}
@Test
+ public void sameTaskCreatedByOtherNodeIsDeduped() {
+ nodeA.create(REF_UPDATE);
+
+ nodeB.create(REF_UPDATE);
+ assertContainsExactly(persistedView.listWaiting(), REF_UPDATE);
+ }
+
+ @Test
public void waitingTaskCanBeCompletedByOtherNode() {
nodeA.create(REF_UPDATE);