diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/CachedObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/CachedObjectDirectory.java index bac8e7b42..ca0f06fae 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/CachedObjectDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/CachedObjectDirectory.java @@ -218,9 +218,4 @@ void selectObjectRepresentation(PackWriter packer, ObjectToPack otp, WindowCursor curs) throws IOException { wrapped.selectObjectRepresentation(packer, otp, curs); } - - @Override - int getStreamFileThreshold() { - return wrapped.getStreamFileThreshold(); - } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileObjectDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileObjectDatabase.java index cb1fdb624..da38887fc 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileObjectDatabase.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileObjectDatabase.java @@ -248,8 +248,6 @@ abstract long getObjectSize2(WindowCursor curs, String objectName, abstract FileObjectDatabase newCachedFileObjectDatabase(); - abstract int getStreamFileThreshold(); - static class AlternateHandle { final FileObjectDatabase db; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java index 145224807..66e7ebc01 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java @@ -170,7 +170,6 @@ public void onConfigChanged(ConfigChangedEvent event) { options.getObjectDirectory(), // options.getAlternateObjectDirectories(), // getFS()); - getListenerList().addConfigChangedListener(objectDatabase); if (objectDatabase.exists()) { final String repositoryFormatVersion = getConfig().getString( diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectory.java index 76fbe6e2d..2ad14c804 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectory.java @@ -63,13 +63,10 @@ import org.eclipse.jgit.JGitText; import org.eclipse.jgit.errors.PackMismatchException; -import org.eclipse.jgit.events.ConfigChangedEvent; -import org.eclipse.jgit.events.ConfigChangedListener; import org.eclipse.jgit.lib.AbbreviatedObjectId; import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.CoreConfig; import org.eclipse.jgit.lib.ObjectDatabase; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; @@ -98,8 +95,7 @@ * searched (recursively through all alternates) before the slow half is * considered. */ -public class ObjectDirectory extends FileObjectDatabase implements - ConfigChangedListener { +public class ObjectDirectory extends FileObjectDatabase { private static final PackList NO_PACKS = new PackList(-1, -1, new PackFile[0]); /** Maximum number of candidates offered as resolutions of abbreviation. */ @@ -121,8 +117,6 @@ public class ObjectDirectory extends FileObjectDatabase implements private final AtomicReference alternates; - private int streamFileThreshold; - /** * Initialize a reference to an on-disk object directory. * @@ -157,13 +151,6 @@ public ObjectDirectory(final Config cfg, final File dir, alt[i] = openAlternate(alternatePaths[i]); alternates.set(alt); } - - onConfigChanged(new ConfigChangedEvent()); - } - - public void onConfigChanged(ConfigChangedEvent event) { - CoreConfig core = config.get(CoreConfig.KEY); - streamFileThreshold = core.getStreamFileThreshold(); } /** @@ -744,9 +731,4 @@ public ObjectDatabase newCachedDatabase() { FileObjectDatabase newCachedFileObjectDatabase() { return new CachedObjectDirectory(this); } - - @Override - int getStreamFileThreshold() { - return streamFileThreshold; - } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCache.java index 39633ee5e..523e08484 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCache.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCache.java @@ -133,6 +133,8 @@ private static final int bits(int newSize) { private static volatile WindowCache cache; + private static volatile int streamFileThreshold; + static { reconfigure(new WindowCacheConfig()); } @@ -184,9 +186,14 @@ public static void reconfigure(final WindowCacheConfig cfg) { if (oc != null) oc.removeAll(); cache = nc; + streamFileThreshold = cfg.getStreamFileThreshold(); UnpackedObjectCache.reconfigure(cfg); } + static int getStreamFileThreshold() { + return streamFileThreshold; + } + static WindowCache getInstance() { return cache; } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java index 48d7018e4..90ea376b5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java @@ -44,6 +44,7 @@ package org.eclipse.jgit.storage.file; import org.eclipse.jgit.lib.Config; +import org.eclipse.jgit.lib.ObjectLoader; /** Configuration parameters for {@link WindowCache}. */ public class WindowCacheConfig { @@ -63,6 +64,8 @@ public class WindowCacheConfig { private int deltaBaseCacheLimit; + private int streamFileThreshold; + /** Create a default configuration. */ public WindowCacheConfig() { packedGitOpenFiles = 128; @@ -70,6 +73,7 @@ public WindowCacheConfig() { packedGitWindowSize = 8 * KB; packedGitMMAP = false; deltaBaseCacheLimit = 10 * MB; + streamFileThreshold = ObjectLoader.STREAM_THRESHOLD; } /** @@ -160,6 +164,22 @@ public void setDeltaBaseCacheLimit(final int newLimit) { deltaBaseCacheLimit = newLimit; } + /** @return the size threshold beyond which objects must be streamed. */ + public int getStreamFileThreshold() { + return streamFileThreshold; + } + + /** + * @param newLimit + * new byte limit for objects that must be streamed. Objects + * smaller than this size can be obtained as a contiguous byte + * array, while objects bigger than this size require using an + * {@link org.eclipse.jgit.lib.ObjectStream}. + */ + public void setStreamFileThreshold(final int newLimit) { + streamFileThreshold = newLimit; + } + /** * Update properties by setting fields from the configuration. *

@@ -174,5 +194,11 @@ public void fromConfig(final Config rc) { setPackedGitWindowSize(rc.getInt("core", null, "packedgitwindowsize", getPackedGitWindowSize())); setPackedGitMMAP(rc.getBoolean("core", null, "packedgitmmap", isPackedGitMMAP())); setDeltaBaseCacheLimit(rc.getInt("core", null, "deltabasecachelimit", getDeltaBaseCacheLimit())); + + long maxMem = Runtime.getRuntime().maxMemory(); + long sft = rc.getLong("core", null, "streamfilethreshold", getStreamFileThreshold()); + sft = Math.min(sft, maxMem / 4); // don't use more than 1/4 of the heap + sft = Math.min(sft, Integer.MAX_VALUE); // cannot exceed array length + setStreamFileThreshold((int) sft); } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCursor.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCursor.java index 09db49e8f..8679c0de1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCursor.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCursor.java @@ -267,9 +267,7 @@ void pin(final PackFile pack, final long position) } int getStreamFileThreshold() { - if (db == null) - return ObjectLoader.STREAM_THRESHOLD; - return db.getStreamFileThreshold(); + return WindowCache.getStreamFileThreshold(); } /** Release the current window cursor. */