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