Browse Source

Use 5 MiB for RevWalk default limit

Instead of getting the limit from CoreConfig, use the larger of the
reader's limit or 5 MiB, under the assumption that any annotated tag
or commit of interest should be under 5 MiB.  But if a repository
was really insane and had bigger objects, the reader implementation
can set its streaming limit higher in order to allow RevWalk to
still process it.

Change-Id: If2c15235daa3e2d1f7167e781aa83fedb5af9a30
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
stable-0.9
Shawn O. Pearce 14 years ago
parent
commit
b505e2a558
  1. 15
      org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java
  2. 15
      org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java

15
org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java

@ -47,7 +47,6 @@
package org.eclipse.jgit.lib; package org.eclipse.jgit.lib;
import static java.util.zip.Deflater.DEFAULT_COMPRESSION; import static java.util.zip.Deflater.DEFAULT_COMPRESSION;
import static org.eclipse.jgit.lib.ObjectLoader.STREAM_THRESHOLD;
import org.eclipse.jgit.lib.Config.SectionParser; import org.eclipse.jgit.lib.Config.SectionParser;
@ -68,21 +67,12 @@ public class CoreConfig {
private final boolean logAllRefUpdates; private final boolean logAllRefUpdates;
private final int streamFileThreshold;
private final boolean autoCRLF; private final boolean autoCRLF;
private CoreConfig(final Config rc) { private CoreConfig(final Config rc) {
compression = rc.getInt("core", "compression", DEFAULT_COMPRESSION); compression = rc.getInt("core", "compression", DEFAULT_COMPRESSION);
packIndexVersion = rc.getInt("pack", "indexversion", 2); packIndexVersion = rc.getInt("pack", "indexversion", 2);
logAllRefUpdates = rc.getBoolean("core", "logallrefupdates", true); logAllRefUpdates = rc.getBoolean("core", "logallrefupdates", true);
long maxMem = Runtime.getRuntime().maxMemory();
long sft = rc.getLong("core", null, "streamfilethreshold", STREAM_THRESHOLD);
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
streamFileThreshold = (int) sft;
autoCRLF = rc.getBoolean("core", "autocrlf", false); autoCRLF = rc.getBoolean("core", "autocrlf", false);
} }
@ -108,11 +98,6 @@ public class CoreConfig {
return logAllRefUpdates; return logAllRefUpdates;
} }
/** @return the size threshold beyond which objects must be streamed. */
public int getStreamFileThreshold() {
return streamFileThreshold;
}
/** /**
* @return whether automatic CRLF conversion has been configured * @return whether automatic CRLF conversion has been configured
*/ */

15
org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalk.java

@ -61,7 +61,6 @@ import org.eclipse.jgit.errors.RevWalkException;
import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.AsyncObjectLoaderQueue; import org.eclipse.jgit.lib.AsyncObjectLoaderQueue;
import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.CoreConfig;
import org.eclipse.jgit.lib.MutableObjectId; import org.eclipse.jgit.lib.MutableObjectId;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectIdSubclassMap; import org.eclipse.jgit.lib.ObjectIdSubclassMap;
@ -96,6 +95,8 @@ import org.eclipse.jgit.treewalk.filter.TreeFilter;
* {@link #next()} does not. * {@link #next()} does not.
*/ */
public class RevWalk implements Iterable<RevCommit> { public class RevWalk implements Iterable<RevCommit> {
private static final int MB = 1 << 20;
/** /**
* Set on objects whose important header data has been loaded. * Set on objects whose important header data has been loaded.
* <p> * <p>
@ -171,9 +172,6 @@ public class RevWalk implements Iterable<RevCommit> {
private final ObjectIdSubclassMap<RevObject> objects; private final ObjectIdSubclassMap<RevObject> objects;
/** Largest commit or annotated tag we are willing to touch. */
private final int bigFileThreshold;
private int freeFlags = APP_FLAGS; private int freeFlags = APP_FLAGS;
private int delayFreeFlags; private int delayFreeFlags;
@ -230,13 +228,6 @@ public class RevWalk implements Iterable<RevCommit> {
filter = RevFilter.ALL; filter = RevFilter.ALL;
treeFilter = TreeFilter.ALL; treeFilter = TreeFilter.ALL;
retainBody = true; retainBody = true;
if (repo != null) {
CoreConfig cfg = repo.getConfig().get(CoreConfig.KEY);
bigFileThreshold = cfg.getStreamFileThreshold();
} else {
bigFileThreshold = 15 * 1024 * 1024;
}
} }
/** @return the reader this walker is using to load objects. */ /** @return the reader this walker is using to load objects. */
@ -867,7 +858,7 @@ public class RevWalk implements Iterable<RevCommit> {
byte[] getCachedBytes(RevObject obj, ObjectLoader ldr) byte[] getCachedBytes(RevObject obj, ObjectLoader ldr)
throws LargeObjectException, MissingObjectException, IOException { throws LargeObjectException, MissingObjectException, IOException {
try { try {
return ldr.getCachedBytes(bigFileThreshold); return ldr.getCachedBytes(5 * MB);
} catch (LargeObjectException tooBig) { } catch (LargeObjectException tooBig) {
tooBig.setObjectId(obj); tooBig.setObjectId(obj);
throw tooBig; throw tooBig;

Loading…
Cancel
Save