From 79cad53bba094cffa1d25581edbf4972a5158cd4 Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 29 Nov 2013 11:03:01 -0500
Subject: [PATCH] Update to Moxie 0.9.1
---
src/main/java/com/gitblit/GCExecutor.java | 87 +++++++++++++++++++++++--------------------
1 files changed, 46 insertions(+), 41 deletions(-)
diff --git a/src/main/java/com/gitblit/GCExecutor.java b/src/main/java/com/gitblit/GCExecutor.java
index 312baf5..837741f 100644
--- a/src/main/java/com/gitblit/GCExecutor.java
+++ b/src/main/java/com/gitblit/GCExecutor.java
@@ -20,31 +20,32 @@
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
+import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import org.eclipse.jgit.api.GarbageCollectCommand;
+import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.storage.file.FileRepository;
-import org.eclipse.jgit.storage.file.GC;
-import org.eclipse.jgit.storage.file.GC.RepoStatistics;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.gitblit.manager.IRepositoryManager;
import com.gitblit.models.RepositoryModel;
import com.gitblit.utils.FileUtils;
/**
* The GC executor handles periodic garbage collection in repositories.
- *
+ *
* @author James Moger
- *
+ *
*/
public class GCExecutor implements Runnable {
public static enum GCStatus {
READY, COLLECTING;
-
+
public boolean exceeds(GCStatus s) {
return ordinal() > s.ordinal();
}
@@ -52,11 +53,11 @@
private final Logger logger = LoggerFactory.getLogger(GCExecutor.class);
private final IStoredSettings settings;
-
+
private AtomicBoolean running = new AtomicBoolean(false);
-
+
private AtomicBoolean forceClose = new AtomicBoolean(false);
-
+
private final Map<String, GCStatus> gcCache = new ConcurrentHashMap<String, GCStatus>();
public GCExecutor(IStoredSettings settings) {
@@ -65,24 +66,24 @@
/**
* Indicates if the GC executor is ready to process repositories.
- *
+ *
* @return true if the GC executor is ready to process repositories
*/
public boolean isReady() {
return settings.getBoolean(Keys.git.enableGarbageCollection, false);
}
-
+
public boolean isRunning() {
return running.get();
}
-
+
public boolean lock(String repositoryName) {
return setGCStatus(repositoryName, GCStatus.COLLECTING);
}
/**
* Tries to set a GCStatus for the specified repository.
- *
+ *
* @param repositoryName
* @return true if the status has been set
*/
@@ -100,7 +101,7 @@
/**
* Returns true if Gitblit is actively collecting garbage in this repository.
- *
+ *
* @param repositoryName
* @return true if actively collecting garbage
*/
@@ -111,13 +112,13 @@
/**
* Resets the GC status to ready.
- *
+ *
* @param repositoryName
*/
public void releaseLock(String repositoryName) {
gcCache.put(repositoryName.toLowerCase(), GCStatus.READY);
}
-
+
public void close() {
forceClose.set(true);
}
@@ -127,11 +128,13 @@
if (!isReady()) {
return;
}
-
- running.set(true);
+
+ running.set(true);
Date now = new Date();
- for (String repositoryName : GitBlit.self().getRepositoryList()) {
+ IRepositoryManager repositoryManager = GitBlit.getManager(IRepositoryManager.class);
+
+ for (String repositoryName : repositoryManager.getRepositoryList()) {
if (forceClose.get()) {
break;
}
@@ -141,15 +144,15 @@
}
boolean garbageCollected = false;
RepositoryModel model = null;
- FileRepository repository = null;
+ Repository repository = null;
try {
- model = GitBlit.self().getRepositoryModel(repositoryName);
- repository = (FileRepository) GitBlit.self().getRepository(repositoryName);
+ model = repositoryManager.getRepositoryModel(repositoryName);
+ repository = repositoryManager.getRepository(repositoryName);
if (repository == null) {
logger.warn(MessageFormat.format("GCExecutor is missing repository {0}?!?", repositoryName));
continue;
}
-
+
if (!isRepositoryIdle(repository)) {
logger.debug(MessageFormat.format("GCExecutor is skipping {0} because it is not idle", repositoryName));
continue;
@@ -162,12 +165,13 @@
logger.warn(MessageFormat.format("Can not acquire GC lock for {0}, skipping", repositoryName));
continue;
}
-
+
logger.debug(MessageFormat.format("GCExecutor locked idle repository {0}", repositoryName));
-
- GC gc = new GC(repository);
- RepoStatistics stats = gc.getStatistics();
-
+
+ Git git = new Git(repository);
+ GarbageCollectCommand gc = git.gc();
+ Properties stats = gc.getStatistics();
+
// determine if this is a scheduled GC
Calendar cal = Calendar.getInstance();
cal.setTime(model.lastGC);
@@ -181,17 +185,18 @@
// determine if filesize triggered GC
long gcThreshold = FileUtils.convertSizeToLong(model.gcThreshold, 500*1024L);
- boolean hasEnoughGarbage = stats.sizeOfLooseObjects >= gcThreshold;
+ long sizeOfLooseObjects = (Long) stats.get("sizeOfLooseObjects");
+ boolean hasEnoughGarbage = sizeOfLooseObjects >= gcThreshold;
// if we satisfy one of the requirements, GC
- boolean hasGarbage = stats.sizeOfLooseObjects > 0;
+ boolean hasGarbage = sizeOfLooseObjects > 0;
if (hasGarbage && (hasEnoughGarbage || shouldCollectGarbage)) {
- long looseKB = stats.sizeOfLooseObjects/1024L;
+ long looseKB = sizeOfLooseObjects/1024L;
logger.info(MessageFormat.format("Collecting {1} KB of loose objects from {0}", repositoryName, looseKB));
-
+
// do the deed
- gc.gc();
-
+ gc.call();
+
garbageCollected = true;
}
} catch (Exception e) {
@@ -202,22 +207,22 @@
if (garbageCollected) {
// update the last GC date
model.lastGC = new Date();
- GitBlit.self().updateConfiguration(repository, model);
+ repositoryManager.updateConfiguration(repository, model);
}
-
+
repository.close();
}
-
- // reset the GC lock
+
+ // reset the GC lock
releaseLock(repositoryName);
logger.debug(MessageFormat.format("GCExecutor released GC lock for {0}", repositoryName));
}
}
-
+
running.set(false);
}
-
- private boolean isRepositoryIdle(FileRepository repository) {
+
+ private boolean isRepositoryIdle(Repository repository) {
try {
// Read the use count.
// An idle use count is 2:
--
Gitblit v1.9.1