private void runJGitGC()

in git-server/src/main/java/jetbrains/buildServer/buildTriggers/vcs/git/Cleanup.java [482:534]


  private void runJGitGC() {
    final long startNanos = System.nanoTime();
    final long gcTimeQuotaNanos = TimeUnit.MINUTES.toNanos(myConfig.getNativeGCQuotaMinutes());
    CLEANUP.info("Git garbage collection started");
    List<File> allDirs = getAllRepositoryDirs();
    Collections.shuffle(allDirs);
    int runGCCounter = 0;
    Boolean nativeGitInstalled = null;
    boolean enableNativeGitLogged = false;
    for (File gitDir : allDirs) {
      ReentrantLock lock = myRepositoryManager.getWriteLock(gitDir);
      lock.lock();
      try {
        try {
          CLEANUP.info("Start garbage collection in " + gitDir.getAbsolutePath());
          long repositoryStartNanos = System.nanoTime();
          runJGitGC(gitDir);
          CLEANUP.info("Garbage collection finished in " + gitDir.getAbsolutePath() + ", duration: " +
                               TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - repositoryStartNanos) + "ms");
        } catch (Exception e) {
          CLEANUP.warnAndDebugDetails("Error while running garbage collection in " + gitDir.getAbsolutePath(), e);
          if ((System.nanoTime() - startNanos) < gcTimeQuotaNanos) { //if quota is not exceeded try running a native git
            if (nativeGitInstalled == null) {
              CLEANUP.info("Check if native git is installed");
              nativeGitInstalled = isNativeGitInstalled();
            }
            if (nativeGitInstalled) {
              runNativeGC(gitDir);
            } else {
              if (!enableNativeGitLogged) {
                CLEANUP.info("Cannot find a native git, please install it and provide a path to git in the 'teamcity.server.git.executable.path' internal property.");
                enableNativeGitLogged = true;
              }
            }
          }
        }
      } finally {
        lock.unlock();
      }

      runGCCounter++;
      final long repositoryFinishNanos = System.nanoTime();
      if ((repositoryFinishNanos - startNanos) > gcTimeQuotaNanos) {
        final int restRepositories = allDirs.size() - runGCCounter;
        if (restRepositories > 0) {
          CLEANUP.info("Git garbage collection quota exceeded, skip " + restRepositories + " repositories");
          break;
        }
      }
    }
    final long finishNanos = System.nanoTime();
    CLEANUP.info("Git garbage collection finished, it took " + TimeUnit.NANOSECONDS.toMillis(finishNanos - startNanos) + "ms");
  }