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