# HG changeset patch # User Dmitry Neverov # Date 1400511932 -7200 # Node ID 75aed0d7a1f9f881022a8f08ea1180fa6040769d # Parent 914a0b473c453cb91a80a0c8ee21a4d1a8e5997e TW-33522 limit the number of repository clone attempts diff -r 914a0b473c45 -r 75aed0d7a1f9 mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java --- 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 syncRepository(@NotNull HgVcsRoot root, @NotNull VcsCallable 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 syncRepositoryOnce(@NotNull HgVcsRoot root, @NotNull VcsCallable 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)