From 5a1e147eaa729ba0ba75bdeebcc745a55bff6232 Mon Sep 17 00:00:00 2001 From: Hugo Arès Date: Wed, 12 Oct 2016 06:54:52 -0400 Subject: Fix eviction of repositories with negative usage count MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the repository close method was called twice (or more) for one open, the usage count became negative and the repository was never be evicted from the cache because the method checking if repository is expired was not considering negative usage count. Change-Id: I18a80c415c54c37d1b9def2b311ff2d0afa455ca Signed-off-by: Hugo Arès --- org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'org.eclipse.jgit') diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java index 2e0ed16a55..98ac601130 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java @@ -298,7 +298,7 @@ public class RepositoryCache { } private boolean isExpired(Repository db) { - return db != null && db.useCnt.get() == 0 + return db != null && db.useCnt.get() <= 0 && (System.currentTimeMillis() - db.closedAt.get() > expireAfter); } -- cgit v1.2.3 From 535f0afd13b3df42be5cfc9e93fddcbb223aa2f6 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Tue, 11 Oct 2016 15:28:41 +0200 Subject: Unconditionally close repositories in RepositoryCache.clear() Earlier we tried to close the repository before removing it from the cache, so close only reduced refcount but didn't close it. Now that we no longer leak usage count on purpose and the usage count is now ignored anyway, there is no longer a need to run the removal twice. Change-Id: I8b62cec6d8a3e88c096d1f37a1f7f5a5066c90a0 Signed-off-by: Matthias Sohn --- .../src/org/eclipse/jgit/lib/RepositoryCache.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) (limited to 'org.eclipse.jgit') diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java index 98ac601130..7a8d246df2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RepositoryCache.java @@ -326,15 +326,9 @@ public class RepositoryCache { } private void clearAll() { - for (int stage = 0; stage < 2; stage++) { - for (Iterator>> i = cacheMap - .entrySet().iterator(); i.hasNext();) { - final Map.Entry> e = i.next(); - final Repository db = e.getValue().get(); - if (db != null) - db.close(); - i.remove(); - } + for (Iterator>> i = cacheMap + .entrySet().iterator(); i.hasNext();) { + unregisterAndCloseRepository(i.next().getKey(), null); } } -- cgit v1.2.3