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));
}