Browse Source

DfsInserter: buffer up to streamFileThreshold from InputStream

Since 2badedcbe0 in-core merges can write up to 10 MiB
into a TemporaryBuffer.Heap strategy, where the data is stored
as a chain of byte[] blocks.

Support the inserter reading up to the streamFileThreshold (default 50
MiB) from the supplied input stream and hash the content to determine
if the merged result blob is already present in the repository.  This
allows the inserter to avoid creating duplicate objects in more cases,
reducing repository pack file churn.

Change-Id: I38967e2a0cff14c0a856cdb46a2c8fedbeb21ed5
stable-3.5
Shawn Pearce 10 years ago
parent
commit
63eb9042a4
  1. 16
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java

16
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java

@ -119,7 +119,7 @@ public class DfsInserter extends ObjectInserter {
@Override @Override
public ObjectId insert(int type, long len, InputStream in) public ObjectId insert(int type, long len, InputStream in)
throws IOException { throws IOException {
byte[] buf = buffer(); byte[] buf = insertBuffer(len);
if (len <= buf.length) { if (len <= buf.length) {
IO.readFully(in, buf, 0, (int) len); IO.readFully(in, buf, 0, (int) len);
return insert(type, buf, 0, (int) len); return insert(type, buf, 0, (int) len);
@ -144,6 +144,20 @@ public class DfsInserter extends ObjectInserter {
return endObject(ObjectId.fromRaw(md.digest()), offset); return endObject(ObjectId.fromRaw(md.digest()), offset);
} }
private byte[] insertBuffer(long len) {
byte[] buf = buffer();
if (len <= buf.length)
return buf;
if (len < db.getReaderOptions().getStreamFileThreshold()) {
try {
return new byte[(int) len];
} catch (OutOfMemoryError noMem) {
return buf;
}
}
return buf;
}
@Override @Override
public void flush() throws IOException { public void flush() throws IOException {
if (packDsc == null) if (packDsc == null)

Loading…
Cancel
Save