private void runNativeGC()

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


  private void runNativeGC() {
    final long startNanos = System.nanoTime();
    final long gcTimeQuotaNanos = TimeUnit.MINUTES.toNanos(myConfig.getNativeGCQuotaMinutes());

    List<File> brokenGcCopyDirs = getRepositoryDirCopiesCreatedByGc();
    if (!brokenGcCopyDirs.isEmpty()) {
      CLEANUP.info("Found several copies of repositories directories left after the failed GC attempts: " + brokenGcCopyDirs + ", will remove all of them");
    }
    for (File brokenDir: brokenGcCopyDirs) {
      FileUtil.delete(brokenDir);
    }

    List<File> allDirs = getAllRepositoryDirs();
    myGcErrors.retainErrors(allDirs);
    if (allDirs.isEmpty()) {
      CLEANUP.debug("No repositories found");
      //reset error, no reason to show it if there is no repositories
      myNativeGitError.set(null);
      return;
    }

    if (!isNativeGitInstalled()) {
      CLEANUP.info("Cannot find native git, skip running git gc");
      return;
    }
    Long freeDiskSpace = FileUtil.getFreeSpace(myRepositoryManager.getBaseMirrorsDir());
    CLEANUP.info("Use git at path '" + myConfig.getPathToGit() + "'");
    Collections.shuffle(allDirs);
    int runGCCounter = 0;
    CLEANUP.info("Git garbage collection started");
    boolean runInPlace = myConfig.runInPlaceGc();
    for (File gitDir : allDirs) {
      String url = myRepositoryManager.getUrl(gitDir.getName());
      if (url != null) {
        CLEANUP.debug("[" + gitDir.getName() + "] repository url: '" + url + "'");
      }
      if (enoughDiskSpaceForGC(gitDir, freeDiskSpace)) {
        if (runInPlace) {
          ReentrantLock lock = myRepositoryManager.getWriteLock(gitDir);
          lock.lock();
          try {
            runNativeGC(gitDir);
          } finally {
            lock.unlock();
          }
        } else {
          runGcInCopy(gitDir);
        }
      } else {
        myGcErrors.registerError(gitDir, "Not enough disk space to run git gc");
        CLEANUP.warn("[" + gitDir.getName() + "] not enough disk space to run git gc (" + String.valueOf(freeDiskSpace) + " " + pluralize("byte", freeDiskSpace) + ")");
      }
      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();
    final long deltaMillis = TimeUnit.NANOSECONDS.toMillis(finishNanos - startNanos);
    CLEANUP.info("Git garbage collection finished, it took " + TimePrinter.createMillisecondsFormatter().formatTime(deltaMillis));
  }