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