Browse Source

Merge "Enforce max memory for DeltaWindow."

stable-2.3
Colby Ranger 12 years ago committed by Gerrit Code Review @ Eclipse.org
parent
commit
5a3d35e9e2
  1. 24
      org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/DeltaWindow.java

24
org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/DeltaWindow.java

@ -164,6 +164,14 @@ class DeltaWindow {
return DeltaIndex.estimateIndexSize(ent.getWeight()); return DeltaIndex.estimateIndexSize(ent.getWeight());
} }
private static long estimateIndexSize(DeltaWindowEntry ent) {
if (ent.buffer == null)
return estimateSize(ent.object);
int len = ent.buffer.length;
return DeltaIndex.estimateIndexSize(len) - len;
}
private void clear(DeltaWindowEntry ent) { private void clear(DeltaWindowEntry ent) {
if (ent.index != null) if (ent.index != null)
loaded -= ent.index.getIndexSize(); loaded -= ent.index.getIndexSize();
@ -420,6 +428,8 @@ class DeltaWindow {
IOException, LargeObjectException { IOException, LargeObjectException {
DeltaIndex idx = ent.index; DeltaIndex idx = ent.index;
if (idx == null) { if (idx == null) {
checkLoadable(ent, estimateIndexSize(ent));
try { try {
idx = new DeltaIndex(buffer(ent)); idx = new DeltaIndex(buffer(ent));
} catch (OutOfMemoryError noMemory) { } catch (OutOfMemoryError noMemory) {
@ -439,6 +449,8 @@ class DeltaWindow {
IncorrectObjectTypeException, IOException, LargeObjectException { IncorrectObjectTypeException, IOException, LargeObjectException {
byte[] buf = ent.buffer; byte[] buf = ent.buffer;
if (buf == null) { if (buf == null) {
checkLoadable(ent, ent.size());
buf = PackWriter.buffer(config, reader, ent.object); buf = PackWriter.buffer(config, reader, ent.object);
if (0 < maxMemory) if (0 < maxMemory)
loaded += buf.length; loaded += buf.length;
@ -447,6 +459,18 @@ class DeltaWindow {
return buf; return buf;
} }
private void checkLoadable(DeltaWindowEntry ent, long need) {
int tail = next(resSlot);
while (maxMemory < loaded + need) {
DeltaWindowEntry cur = window[tail];
clear(cur);
if (cur == ent)
throw new LargeObjectException.ExceedsLimit(
maxMemory, loaded + need);
tail = next(tail);
}
}
private Deflater deflater() { private Deflater deflater() {
if (deflater == null) if (deflater == null)
deflater = new Deflater(config.getCompressionLevel()); deflater = new Deflater(config.getCompressionLevel());

Loading…
Cancel
Save