Merge branch 'stable-3.5' * stable-3.5: Demote Files.list() errors when distributor is enabled Demote rename errors when distributor is enabled Do not retry replication when local repository not found Release-Notes: skip Change-Id: Icd2d4729e7c912e723587c2efa311a4e999fd329
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java b/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java index e7b53c6..c36b42c 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java
@@ -446,8 +446,12 @@ "Replication to %s completed in %dms, %dms delay, %d retries", uri, elapsed, delay, retryCount); } catch (RepositoryNotFoundException e) { + retryDone(); stateLog.error( - "Cannot replicate " + projectName + "; Local repository error: " + e.getMessage(), + "Cannot replicate " + + projectName + + "; Local repository does not exist: " + + e.getMessage(), getStatesAsArray()); } catch (RemoteRepositoryException e) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java index 4dd6060..3f92983 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationTasksStorage.java
@@ -144,9 +144,12 @@ private final Path runningUpdates; private final Path waitingUpdates; + private boolean isMultiPrimary; + @Inject ReplicationTasksStorage(ReplicationConfig config) { this(config.getEventsDirectory().resolve("ref-updates")); + isMultiPrimary = config.getDistributionInterval() != 0; } @VisibleForTesting @@ -160,6 +163,10 @@ .create(); } + private boolean isMultiPrimary() { + return isMultiPrimary; + } + public synchronized String create(ReplicateRefUpdate r) { return new Task(r).create(); } @@ -212,13 +219,19 @@ .map(Optional::get); } - private static Stream<Path> walkNonDirs(Path path) { + private Stream<Path> walkNonDirs(Path path) { try { return Files.list(path).flatMap(sub -> walkNonDirs(sub)); } catch (NotDirectoryException e) { return Stream.of(path); } catch (Exception e) { - logger.atSevere().withCause(e).log("Error while walking directory %s", path); + String message = "Error while walking directory %s"; + if (isMultiPrimary() && e instanceof NoSuchFileException) { + logger.atFine().log( + message + " (expected regularly with multi-primaries and distributor enabled)", path); + } else { + logger.atSevere().withCause(e).log(message, path); + } return Stream.empty(); } } @@ -398,7 +411,14 @@ Files.move(from, to, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); return true; } catch (IOException e) { - logger.atSevere().withCause(e).log("Error while renaming task %s", taskKey); + String message = "Error while renaming task %s"; + if (isMultiPrimary() && e instanceof NoSuchFileException) { + logger.atFine().log( + message + " (expected regularly with multi-primaries and distributor enabled)", + taskKey); + } else { + logger.atSevere().withCause(e).log(message, taskKey); + } return false; } }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/PushOneTest.java b/src/test/java/com/googlesource/gerrit/plugins/replication/PushOneTest.java index dc29612..fd08b7b 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/PushOneTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/PushOneTest.java
@@ -14,6 +14,7 @@ package com.googlesource.gerrit.plugins.replication; +import static com.google.common.truth.Truth.assertThat; import static org.eclipse.jgit.lib.Ref.Storage.NEW; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -51,6 +52,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import org.eclipse.jgit.errors.NotSupportedException; +import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.errors.TransportException; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; @@ -313,6 +315,17 @@ verify(transportMock, times(1)).push(any(), any()); } + @Test + public void shouldNotKeepRetryingWhenRepositoryNotFound() throws Exception { + when(gitRepositoryManagerMock.openRepository(projectNameKey)) + .thenThrow(new RepositoryNotFoundException("not found")); + PushOne pushOne = createPushOne(null); + pushOne.addRef(PushOne.ALL_REFS); + pushOne.setToRetry(); + pushOne.run(); + assertThat(pushOne.isRetrying()).isFalse(); + } + private void replicateTwoRefs(PushOne pushOne) throws InterruptedException { ObjectIdRef barLocalRef = new ObjectIdRef.Unpeeled(