changeset 792:75aed0d7a1f9 Gaya-8.1.x

TW-33522 limit the number of repository clone attempts
author Dmitry Neverov <dmitry.neverov@gmail.com>
date Mon, 19 May 2014 17:05:32 +0200
parents 914a0b473c45
children 0a1ac46bfa8c
files mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java
diffstat 1 files changed, 22 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Thu May 01 19:51:00 2014 +0200
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java	Mon May 19 17:05:32 2014 +0200
@@ -499,24 +499,36 @@
 
   public <T> T syncRepository(@NotNull HgVcsRoot root, @NotNull VcsCallable<T> cmd) throws VcsException {
     File workingDir = getWorkingDir(root);
+    int attemptsLeft = 3;
+    VcsException lastError = null;
+    while (attemptsLeft-- > 0) {
+      try {
+        return syncRepositoryOnce(root, cmd, workingDir);
+      } catch (UnrelatedRepositoryException e) {
+        Loggers.VCS.warn("Repository at " + workingDir.getAbsolutePath() + " is unrelated to " + root.getRepository() +
+                ". Clone it again, attempts left " + attemptsLeft);
+        myMirrorManager.forgetDir(workingDir);
+        lastError = e;
+      } catch (AbandonedTransactionFound e) {
+        Loggers.VCS.warn("Abandoned transaction found in repository " + root.getRepository() + " at "
+                + workingDir.getAbsolutePath() + ". Clone it again, attempts left " + attemptsLeft);
+        myMirrorManager.forgetDir(workingDir);
+        lastError = e;
+      }
+    }
+    throw lastError;
+  }
+
+
+  private <T> T syncRepositoryOnce(@NotNull HgVcsRoot root, @NotNull VcsCallable<T> cmd, @NotNull File workingDir) throws VcsException {
     lockWorkDir(workingDir);
     HgRepo repo = createRepo(root);
     try {
       if (repo.isValidRepository()) {
-        try {
           resetBookmarks(repo);
           repo.pull().fromRepository(root.getRepository())
                   .withTimeout(myConfig.getPullTimeout())
                   .call();
-        } catch (UnrelatedRepositoryException e) {
-          Loggers.VCS.warn("Repository at " + root.getRepository() + " is unrelated, clone it again");
-          myMirrorManager.forgetDir(workingDir);
-          syncRepository(root);
-        } catch (AbandonedTransactionFound e) {
-          Loggers.VCS.warn("Abandoned transaction found in repository " + root.getRepository() + ", clone it again");
-          myMirrorManager.forgetDir(workingDir);
-          syncRepository(root);
-        }
       } else {
         repo.doClone().fromRepository(root.getRepository())
                 .setUpdateWorkingDir(false)