]> source.dussan.org Git - jgit.git/commitdiff
Move ObjectDirectory streaming limit to WindowCacheConfig 94/1494/3
authorShawn O. Pearce <spearce@spearce.org>
Tue, 31 Aug 2010 20:13:28 +0000 (13:13 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Thu, 2 Sep 2010 18:38:39 +0000 (11:38 -0700)
IDEs like Eclipse offer up the settings in WindowCacheConfig to the
user as a global set of options that are configured for the entire
JVM process, not per-repository, as the cache is shared across the
entire JVM.  The limit on how much we are willing to allocate for
an object buffer is similar to the limit on how much we can use for
data caches, allocating that much space impacts the entire JVM and
not just a single repository, so it should be a global limit.

Change-Id: I22eafb3e223bf8dea57ece82cd5df8bfe5badebc
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/CachedObjectDirectory.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileObjectDatabase.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectory.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCache.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCursor.java

index bac8e7b42772dcecd36e7c7bb6f0ed6e2ed4f34d..ca0f06fae1866c79a9ee9310456e6ec18b9c7883 100644 (file)
@@ -218,9 +218,4 @@ class CachedObjectDirectory extends FileObjectDatabase {
                        WindowCursor curs) throws IOException {
                wrapped.selectObjectRepresentation(packer, otp, curs);
        }
-
-       @Override
-       int getStreamFileThreshold() {
-               return wrapped.getStreamFileThreshold();
-       }
 }
index cb1fdb62407cbde15709e0482dd0b9d8aeace26d..da38887fc66866af5752bc37aa9f8db8fc832a76 100644 (file)
@@ -248,8 +248,6 @@ abstract class FileObjectDatabase extends ObjectDatabase {
 
        abstract FileObjectDatabase newCachedFileObjectDatabase();
 
-       abstract int getStreamFileThreshold();
-
        static class AlternateHandle {
                final FileObjectDatabase db;
 
index 145224807013e717a30d8f4b0349cd374068ffe0..66e7ebc01533268edb2179686018e75a805dc4dd 100644 (file)
@@ -170,7 +170,6 @@ public class FileRepository extends Repository {
                                options.getObjectDirectory(), //
                                options.getAlternateObjectDirectories(), //
                                getFS());
-               getListenerList().addConfigChangedListener(objectDatabase);
 
                if (objectDatabase.exists()) {
                        final String repositoryFormatVersion = getConfig().getString(
index 76fbe6e2d000c96292bd78303c46d8a4c115e0e2..2ad14c804a2e8a7577786ae5cbe3225542ae578f 100644 (file)
@@ -63,13 +63,10 @@ import java.util.concurrent.atomic.AtomicReference;
 
 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 @@ import org.eclipse.jgit.util.FS;
  * 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<AlternateHandle[]> alternates;
 
-       private int streamFileThreshold;
-
        /**
         * Initialize a reference to an on-disk object directory.
         *
@@ -157,13 +151,6 @@ public class ObjectDirectory extends FileObjectDatabase implements
                                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 class ObjectDirectory extends FileObjectDatabase implements
        FileObjectDatabase newCachedFileObjectDatabase() {
                return new CachedObjectDirectory(this);
        }
-
-       @Override
-       int getStreamFileThreshold() {
-               return streamFileThreshold;
-       }
 }
index 39633ee5ef753e7380e4e50a84bc73feeaeb1633..523e084845c75a29e002bc0669f9d7871284649e 100644 (file)
@@ -133,6 +133,8 @@ public class WindowCache {
 
        private static volatile WindowCache cache;
 
+       private static volatile int streamFileThreshold;
+
        static {
                reconfigure(new WindowCacheConfig());
        }
@@ -184,9 +186,14 @@ public class WindowCache {
                if (oc != null)
                        oc.removeAll();
                cache = nc;
+               streamFileThreshold = cfg.getStreamFileThreshold();
                UnpackedObjectCache.reconfigure(cfg);
        }
 
+       static int getStreamFileThreshold() {
+               return streamFileThreshold;
+       }
+
        static WindowCache getInstance() {
                return cache;
        }
index 48d7018e42f0d4375a9ac9da383e58a4eb2244ef..90ea376b5f0a6cb1ae06030b88588abba85f9835 100644 (file)
@@ -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 class WindowCacheConfig {
                packedGitWindowSize = 8 * KB;
                packedGitMMAP = false;
                deltaBaseCacheLimit = 10 * MB;
+               streamFileThreshold = ObjectLoader.STREAM_THRESHOLD;
        }
 
        /**
@@ -160,6 +164,22 @@ public class WindowCacheConfig {
                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.
         * <p>
@@ -174,5 +194,11 @@ public class WindowCacheConfig {
                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);
        }
 }
index 09db49e8f88faa583e2eaeecb82dd62644005fd1..8679c0de10f84e81cdae804de03520a6f09f6fa3 100644 (file)
@@ -267,9 +267,7 @@ final class WindowCursor extends ObjectReader implements ObjectReuseAsIs {
        }
 
        int getStreamFileThreshold() {
-               if (db == null)
-                       return ObjectLoader.STREAM_THRESHOLD;
-               return db.getStreamFileThreshold();
+               return WindowCache.getStreamFileThreshold();
        }
 
        /** Release the current window cursor. */