From 388a233e8ec78c5d7279f9cef85245ea3c85534e Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Fri, 28 Feb 2014 14:04:37 -0500
Subject: [PATCH] Move GarbageCollector repository methods to the RepositoryManager

---
 src/main/java/com/gitblit/service/GarbageCollectorService.java |   23 -----------
 src/main/java/com/gitblit/manager/IRepositoryManager.java      |   19 +++++++++
 src/main/java/com/gitblit/manager/GitblitManager.java          |   15 +++++++
 src/main/java/com/gitblit/manager/RepositoryManager.java       |   46 +++++++++++++++++++++--
 4 files changed, 77 insertions(+), 26 deletions(-)

diff --git a/src/main/java/com/gitblit/manager/GitblitManager.java b/src/main/java/com/gitblit/manager/GitblitManager.java
index 08d6408..6eb6023 100644
--- a/src/main/java/com/gitblit/manager/GitblitManager.java
+++ b/src/main/java/com/gitblit/manager/GitblitManager.java
@@ -1099,4 +1099,19 @@
 	public boolean deletePendingFederationProposal(FederationProposal proposal) {
 		return federationManager.deletePendingFederationProposal(proposal);
 	}
+
+	@Override
+	public void closeAll() {
+		repositoryManager.closeAll();
+	}
+
+	@Override
+	public void close(String repository) {
+		repositoryManager.close(repository);
+	}
+
+	@Override
+	public boolean isIdle(Repository repository) {
+		return repositoryManager.isIdle(repository);
+	}
 }
diff --git a/src/main/java/com/gitblit/manager/IRepositoryManager.java b/src/main/java/com/gitblit/manager/IRepositoryManager.java
index a400191..23c61cb 100644
--- a/src/main/java/com/gitblit/manager/IRepositoryManager.java
+++ b/src/main/java/com/gitblit/manager/IRepositoryManager.java
@@ -393,4 +393,23 @@
 	 */
 	boolean isCollectingGarbage(String repositoryName);
 
+	/**
+	 * Ensures that all cached repositories are completely closed and their resources
+	 * are properly released.
+	 */
+	void closeAll();
+
+	/**
+	 * Ensures that a cached repository is completely closed and it's resources
+	 * are properly released.
+	 */
+	void close(String repository);
+
+	/**
+	 * Returns true if the repository is idle (not being accessed).
+	 *
+	 * @param repository
+	 * @return true if the repository is idle
+	 */
+	boolean isIdle(Repository repository);
 }
\ No newline at end of file
diff --git a/src/main/java/com/gitblit/manager/RepositoryManager.java b/src/main/java/com/gitblit/manager/RepositoryManager.java
index 6b4fe97..e412deb 100644
--- a/src/main/java/com/gitblit/manager/RepositoryManager.java
+++ b/src/main/java/com/gitblit/manager/RepositoryManager.java
@@ -169,6 +169,7 @@
 		gcExecutor.close();
 		mirrorExecutor.close();
 
+		closeAll();
 		return this;
 	}
 
@@ -1084,12 +1085,49 @@
 	}
 
 	/**
+	 * Returns true if the repository is idle (not being accessed).
+	 *
+	 * @param repository
+	 * @return true if the repository is idle
+	 */
+	@Override
+	public boolean isIdle(Repository repository) {
+		try {
+			// Read the use count.
+			// An idle use count is 2:
+			// +1 for being in the cache
+			// +1 for the repository parameter in this method
+			Field useCnt = Repository.class.getDeclaredField("useCnt");
+			useCnt.setAccessible(true);
+			int useCount = ((AtomicInteger) useCnt.get(repository)).get();
+			return useCount == 2;
+		} catch (Exception e) {
+			logger.warn(MessageFormat
+					.format("Failed to reflectively determine use count for repository {0}",
+							repository.getDirectory().getPath()), e);
+		}
+		return false;
+	}
+
+	/**
+	 * Ensures that all cached repository are completely closed and their resources
+	 * are properly released.
+	 */
+	@Override
+	public void closeAll() {
+		for (String repository : getRepositoryList()) {
+			close(repository);
+		}
+	}
+
+	/**
 	 * Ensure that a cached repository is completely closed and its resources
 	 * are properly released.
 	 *
 	 * @param repositoryName
 	 */
-	private void closeRepository(String repositoryName) {
+	@Override
+	public void close(String repositoryName) {
 		Repository repository = getRepository(repositoryName);
 		if (repository == null) {
 			return;
@@ -1114,7 +1152,7 @@
 							repositoryName), e);
 		}
 		if (uses > 0) {
-			logger.info(MessageFormat
+			logger.debug(MessageFormat
 					.format("{0}.useCnt={1}, calling close() {2} time(s) to close object and ref databases",
 							repositoryName, uses, uses));
 			for (int i = 0; i < uses; i++) {
@@ -1252,7 +1290,7 @@
 							"Failed to rename ''{0}'' because ''{1}'' already exists.",
 							repositoryName, repository.name));
 				}
-				closeRepository(repositoryName);
+				close(repositoryName);
 				File folder = new File(repositoriesFolder, repositoryName);
 				File destFolder = new File(repositoriesFolder, repository.name);
 				if (destFolder.exists()) {
@@ -1477,7 +1515,7 @@
 	@Override
 	public boolean deleteRepository(String repositoryName) {
 		try {
-			closeRepository(repositoryName);
+			close(repositoryName);
 			// clear the repository cache
 			clearRepositoryMetadataCache(repositoryName);
 
diff --git a/src/main/java/com/gitblit/service/GarbageCollectorService.java b/src/main/java/com/gitblit/service/GarbageCollectorService.java
index 8dbd8d8..b98560f 100644
--- a/src/main/java/com/gitblit/service/GarbageCollectorService.java
+++ b/src/main/java/com/gitblit/service/GarbageCollectorService.java
@@ -15,7 +15,6 @@
  */
 package com.gitblit.service;
 
-import java.lang.reflect.Field;
 import java.text.MessageFormat;
 import java.util.Calendar;
 import java.util.Date;
@@ -23,7 +22,6 @@
 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;
@@ -33,7 +31,6 @@
 
 import com.gitblit.IStoredSettings;
 import com.gitblit.Keys;
-import com.gitblit.Keys.git;
 import com.gitblit.manager.IRepositoryManager;
 import com.gitblit.models.RepositoryModel;
 import com.gitblit.utils.FileUtils;
@@ -160,7 +157,7 @@
 					continue;
 				}
 
-				if (!isRepositoryIdle(repository)) {
+				if (!repositoryManager.isIdle(repository)) {
 					logger.debug(MessageFormat.format("GCExecutor is skipping {0} because it is not idle", repositoryName));
 					continue;
 				}
@@ -227,23 +224,5 @@
 		}
 
 		running.set(false);
-	}
-
-	private boolean isRepositoryIdle(Repository repository) {
-		try {
-			// Read the use count.
-			// An idle use count is 2:
-			// +1 for being in the cache
-			// +1 for the repository parameter in this method
-			Field useCnt = Repository.class.getDeclaredField("useCnt");
-			useCnt.setAccessible(true);
-			int useCount = ((AtomicInteger) useCnt.get(repository)).get();
-			return useCount == 2;
-		} catch (Exception e) {
-			logger.warn(MessageFormat
-					.format("Failed to reflectively determine use count for repository {0}",
-							repository.getDirectory().getPath()), e);
-		}
-		return false;
 	}
 }

--
Gitblit v1.9.1