瀏覽代碼

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
tags/v3.5.0.201409071800-rc1
Shawn Pearce 9 年之前
父節點
當前提交
63eb9042a4
共有 1 個檔案被更改,包括 15 行新增1 行删除
  1. 15
    1
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java

+ 15
- 1
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java 查看文件

@@ -119,7 +119,7 @@ public class DfsInserter extends ObjectInserter {
@Override
public ObjectId insert(int type, long len, InputStream in)
throws IOException {
byte[] buf = buffer();
byte[] buf = insertBuffer(len);
if (len <= buf.length) {
IO.readFully(in, 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);
}

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
public void flush() throws IOException {
if (packDsc == null)

Loading…
取消
儲存