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 | 63 ++++++++++++++++---------------
1 files changed, 33 insertions(+), 30 deletions(-)
diff --git a/src/main/java/com/gitblit/GCExecutor.java b/src/main/java/com/gitblit/GCExecutor.java
index 0a0c8ad..837741f 100644
--- a/src/main/java/com/gitblit/GCExecutor.java
+++ b/src/main/java/com/gitblit/GCExecutor.java
@@ -31,20 +31,21 @@
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;
}
@@ -143,13 +146,13 @@
RepositoryModel model = null;
Repository repository = null;
try {
- model = GitBlit.self().getRepositoryModel(repositoryName);
- repository = 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,13 +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));
-
+
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);
@@ -190,10 +193,10 @@
if (hasGarbage && (hasEnoughGarbage || shouldCollectGarbage)) {
long looseKB = sizeOfLooseObjects/1024L;
logger.info(MessageFormat.format("Collecting {1} KB of loose objects from {0}", repositoryName, looseKB));
-
+
// do the deed
gc.call();
-
+
garbageCollected = true;
}
} catch (Exception e) {
@@ -204,21 +207,21 @@
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(Repository repository) {
try {
// Read the use count.
--
Gitblit v1.9.1