From dff9d56b946552b4a6b802908a22793f95d3738c Mon Sep 17 00:00:00 2001 From: Dave Borowitz Date: Thu, 3 Nov 2011 12:52:19 -0700 Subject: [PATCH] Expose the list of pack files in the DfsBlockCache Callers may want to inspect the contents of the cache, which this allows them to do in a read-only fashion without any locking. Change-Id: Ifd78e8ce34e26e5cc33e9dd61d70c593ce479ee0 --- .../jgit/storage/dfs/DfsBlockCache.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsBlockCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsBlockCache.java index 3ae9690d7..871a2c503 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsBlockCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/dfs/DfsBlockCache.java @@ -46,9 +46,11 @@ package org.eclipse.jgit.storage.dfs; import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReferenceArray; @@ -156,6 +158,9 @@ public final class DfsBlockCache { /** Cache of pack files, indexed by description. */ private final Map packCache; + /** View of pack files in the pack cache. */ + private final Collection packFiles; + /** Number of times a block was found in the cache. */ private final AtomicLong statHit; @@ -203,7 +208,9 @@ public final class DfsBlockCache { readAheadLimit = cfg.getReadAheadLimit(); readAheadService = cfg.getReadAheadService(); - packCache = new HashMap(); + packCache = new ConcurrentHashMap( + 16, 0.75f, 1); + packFiles = Collections.unmodifiableCollection(packCache.values()); statHit = new AtomicLong(); statMiss = new AtomicLong(); @@ -234,6 +241,16 @@ public final class DfsBlockCache { return statEvict; } + /** + * Get the pack files stored in this cache. + * + * @return a collection of pack files, some of which may not actually be + * present; the caller should check the pack's cached size. + */ + public Collection getPackFiles() { + return packFiles; + } + DfsPackFile getOrCreate(DfsPackDescription dsc, DfsPackKey key) { // TODO This table grows without bound. It needs to clean up // entries that aren't in cache anymore, and aren't being used