]> source.dussan.org Git - jgit.git/commitdiff
DfsInserter: buffer up to streamFileThreshold from InputStream 82/31482/3
authorShawn Pearce <spearce@spearce.org>
Tue, 12 Aug 2014 21:57:28 +0000 (14:57 -0700)
committerShawn Pearce <spearce@spearce.org>
Wed, 13 Aug 2014 01:55:12 +0000 (18:55 -0700)
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

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

index 76554c0ad8bb1e5d2c4fdc0294c9abc829405a64..6be6509b4614d69aedcd0e503f060231029d0934 100644 (file)
@@ -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)