Move ObjectDirectory streaming limit to WindowCacheConfig

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>
This commit is contained in:
Shawn O. Pearce 2010-08-31 13:13:28 -07:00
parent fed508d55b
commit e29cd27961
7 changed files with 35 additions and 30 deletions

View File

@ -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();
}
}

View File

@ -248,8 +248,6 @@ abstract long getObjectSize2(WindowCursor curs, String objectName,
abstract FileObjectDatabase newCachedFileObjectDatabase();
abstract int getStreamFileThreshold();
static class AlternateHandle {
final FileObjectDatabase db;

View File

@ -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(

View File

@ -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<AlternateHandle[]> 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;
}
}

View File

@ -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;
}

View 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 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.
* <p>
@ -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);
}
}

View File

@ -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. */