diff options
author | Nasser Grainawi <nasser@codeaurora.org> | 2021-02-25 10:58:44 -0700 |
---|---|---|
committer | Nasser Grainawi <nasser@codeaurora.org> | 2021-02-25 10:58:44 -0700 |
commit | 16d00cdf95a0e04db345512fcd48c8ec3d867449 (patch) | |
tree | 26a5b337d78c8fb73d5a2f9b6090069ec4e75960 | |
parent | e57889deb8245c0a61a1febd7aa2b6662cc83929 (diff) | |
parent | a6c453782de3f684a40a242bad9460faff75ffc3 (diff) |
Merge branch 'stable-2.16' into stable-3.0upstream/stable-3.0
* stable-2.16:
Call retryDone() when giving up after lock failures
Fix issue with task cleanup after retry
Change-Id: Id987043c8a26bd3f69fb4bd5b84591ae20cb83ba
4 files changed, 39 insertions, 14 deletions
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 8454246..64c8fa1 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java +++ b/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java @@ -228,6 +228,10 @@ class PushOne implements ProjectRunnable, CanceledWhileRunning { return maxRetries == 0 || retryCount <= maxRetries; } + private void retryDone() { + this.retrying = false; + } + void canceledByReplication() { canceled = true; } @@ -353,6 +357,7 @@ class PushOne implements ProjectRunnable, CanceledWhileRunning { git = gitManager.openRepository(projectName); runImpl(); long elapsed = NANOSECONDS.toMillis(context.stop()); + retryDone(); repLog.info( "Replication to {} completed in {}ms, {}ms delay, {} retries", uri, @@ -398,6 +403,7 @@ class PushOne implements ProjectRunnable, CanceledWhileRunning { pool.reschedule(this, Destination.RetryReason.TRANSPORT_ERROR); } } else { + retryDone(); repLog.error( "Giving up after {} '{}' failures during replication to {}", updateRefRetryCount, 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 60600a9..d9389b2 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationDaemon.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationDaemon.java @@ -52,8 +52,13 @@ public class ReplicationDaemon extends LightweightPluginDaemonTest { protected static final int TEST_REPLICATION_DELAY_SECONDS = 1; protected static final int TEST_REPLICATION_RETRY_MINUTES = 1; protected static final int TEST_PUSH_TIME_SECONDS = 1; + protected static final int TEST_PROJECT_CREATION_SECONDS = 10; protected static final Duration TEST_PUSH_TIMEOUT = Duration.ofSeconds(TEST_REPLICATION_DELAY_SECONDS + TEST_PUSH_TIME_SECONDS); + protected static final Duration TEST_NEW_PROJECT_TIMEOUT = + Duration.ofSeconds( + (TEST_REPLICATION_DELAY_SECONDS + TEST_REPLICATION_RETRY_MINUTES * 60) + + TEST_PROJECT_CREATION_SECONDS); @Inject protected SitePaths sitePaths; @Inject private ProjectOperations projectOperations; @@ -184,4 +189,12 @@ public class ReplicationDaemon extends LightweightPluginDaemonTest { protected void reloadConfig() { plugin.getSysInjector().getInstance(AutoReloadConfigDecorator.class).forceReload(); } + + protected boolean nonEmptyProjectExists(Project.NameKey name) { + try (Repository r = repoManager.openRepository(name)) { + return !r.getAllRefsByPeeledObjectId().isEmpty(); + } catch (Exception e) { + return false; + } + } } diff --git a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationIT.java b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationIT.java index a18e8f1..b1d068e 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationIT.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationIT.java @@ -45,16 +45,10 @@ import org.junit.Test; name = "replication", sysModule = "com.googlesource.gerrit.plugins.replication.ReplicationModule") public class ReplicationIT extends ReplicationDaemon { - private static final int TEST_PROJECT_CREATION_SECONDS = 10; private static final Duration TEST_TIMEOUT = Duration.ofSeconds( (TEST_REPLICATION_DELAY_SECONDS + TEST_REPLICATION_RETRY_MINUTES * 60) + 1); - private static final Duration TEST_NEW_PROJECT_TIMEOUT = - Duration.ofSeconds( - (TEST_REPLICATION_DELAY_SECONDS + TEST_REPLICATION_RETRY_MINUTES * 60) - + TEST_PROJECT_CREATION_SECONDS); - @Inject private DynamicSet<ProjectDeletedListener> deletedListeners; @Test @@ -394,14 +388,6 @@ public class ReplicationIT extends ReplicationDaemon { return plugin.getSysInjector().getInstance(classObj); } - private boolean nonEmptyProjectExists(Project.NameKey name) { - try (Repository r = repoManager.openRepository(name)) { - return !r.getAllRefsByPeeledObjectId().isEmpty(); - } catch (Exception e) { - return false; - } - } - private ObjectId createNewBranchWithoutPush(String fromBranch, String newBranch) throws Exception { try (Repository repo = repoManager.openRepository(project); 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 f6f3bbe..a0a0e31 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationStorageIT.java +++ b/src/test/java/com/googlesource/gerrit/plugins/replication/ReplicationStorageIT.java @@ -23,6 +23,7 @@ import com.google.gerrit.acceptance.UseLocalDisk; import com.google.gerrit.extensions.api.projects.BranchInput; import com.google.gerrit.reviewdb.client.Project; import com.googlesource.gerrit.plugins.replication.ReplicationTasksStorage.ReplicateRefUpdate; +import java.time.Duration; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -42,6 +43,10 @@ import org.junit.Test; name = "replication", sysModule = "com.googlesource.gerrit.plugins.replication.ReplicationModule") public class ReplicationStorageIT extends ReplicationDaemon { + protected static final int TEST_TASK_FINISH_SECONDS = 1; + protected static final int TEST_REPLICATION_MAX_RETRIES = 1; + protected static final Duration TEST_TASK_FINISH_TIMEOUT = + Duration.ofSeconds(TEST_TASK_FINISH_SECONDS); protected ReplicationTasksStorage tasksStorage; @Override @@ -225,6 +230,21 @@ public class ReplicationStorageIT extends ReplicationDaemon { replicateBranchDeletion(false); } + @Test + public void shouldCleanupTasksAfterNewProjectReplication() throws Exception { + setReplicationDestination("task_cleanup_project", "replica", ALL_PROJECTS); + config.setInt("remote", "task_cleanup_project", "replicationRetry", 0); + config.save(); + reloadConfig(); + assertThat(tasksStorage.list()).hasSize(0); + Project.NameKey sourceProject = createTestProject("task_cleanup_project"); + + WaitUtil.waitUntil( + () -> nonEmptyProjectExists(new Project.NameKey(sourceProject + "replica.git")), + TEST_NEW_PROJECT_TIMEOUT); + WaitUtil.waitUntil(() -> tasksStorage.list().size() == 0, TEST_TASK_FINISH_TIMEOUT); + } + private void replicateBranchDeletion(boolean mirror) throws Exception { setReplicationDestination("foo", "replica", ALL_PROJECTS); reloadConfig(); |