]> source.dussan.org Git - jgit.git/commit
Improve performance when writing trees and small blobs 78/3778/1
authorShawn O. Pearce <spearce@spearce.org>
Fri, 24 Jun 2011 19:55:19 +0000 (12:55 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Fri, 24 Jun 2011 19:55:19 +0000 (12:55 -0700)
commit1eecc82cec2409ed3b69cf96f3206a2fb6c7b9f1
treedf733b01405e138992f2347b617c0346e2df57c5
parent826fb260a3515c86eba9e65e54695c78a085425c
Improve performance when writing trees and small blobs

ObjectDirectoryInserter was always creating a temporary file,
writing the complete compressed contents of a tree, fsync()'ing
that to stable storage, and only then checking to see if there
was already an object with the same SHA-1 in the repository.

For commits this strategy makes some sense, the commit is very
unlikely to exist in the repository, as there are embedded times
and these change with each commit.

However for trees coming out of DirCache, it is more common for the
tree to already exist in the repository. Most subdirectories are
not modified in any given commit.  Doing all of this local file IO
for things that already exist is very slow.

Try to detect cases where the object is "small enough" that it can
be processed entirely in memory, and avoid doing disk IO entirely
if the object already exists.

Also increase the size of the output buffer for the deflation.
This should boost the average write(2) syscall size from 512 bytes
to 8192 bytes, making streaming of large compressed contents to
disk slightly more efficient.

Change-Id: I1d40364e8725468522435814631916d73174c92b
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ObjectDirectoryInserter.java