Since
2badedcbe0f87c0a 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
@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);
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)