Browse Source

DirCache: Buffer TREE extension to $GIT_DIR

Increase the in-memory buffer for the TREE extension to 5 MiB, and
overflow to $GIT_DIR instead of /tmp.  Using a larger buffer reduces
the chances a repository will overflow and need to spool the extension
to disk.  Using $GIT_DIR allows the TREE extension contents to have
the same file system protections as the final $GIT_DIR/index.

Wrap the entire thing in a try/finally to ensure the temp file is
deleted from disk after the block has finished using it. To avoid
dangling NFS files, LocalFile.destroy() does close the local file
before deleting it.

Change-Id: I8f871181a4689e3ebf0cdd4fd1769333cf7546c3
tags/v3.4.2.201412180340-r
Shawn Pearce 9 years ago
parent
commit
f31323745f

+ 1
- 1
org.eclipse.jgit.test/tst/org/eclipse/jgit/dircache/DirCacheCGitCompatabilityTest.java View File

@@ -213,7 +213,7 @@ public class DirCacheCGitCompatabilityTest extends LocalDiskRepositoryTestCase {
assertV3TreeEntry(9, "newfile.txt", false, true, dc);

final ByteArrayOutputStream bos = new ByteArrayOutputStream();
dc.writeTo(bos);
dc.writeTo(null, bos);
final byte[] indexBytes = bos.toByteArray();
final byte[] expectedBytes = IO.readFully(file);
assertArrayEquals(expectedBytes, indexBytes);

+ 15
- 10
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java View File

@@ -607,7 +607,8 @@ public class DirCache {
final LockFile tmp = myLock;
requireLocked(tmp);
try {
writeTo(new SafeBufferedOutputStream(tmp.getOutputStream()));
writeTo(liveFile.getParentFile(),
new SafeBufferedOutputStream(tmp.getOutputStream()));
} catch (IOException err) {
tmp.unlock();
throw err;
@@ -620,7 +621,7 @@ public class DirCache {
}
}

void writeTo(final OutputStream os) throws IOException {
void writeTo(File dir, final OutputStream os) throws IOException {
final MessageDigest foot = Constants.newMessageDigest();
final DigestOutputStream dos = new DigestOutputStream(os, foot);

@@ -670,14 +671,18 @@ public class DirCache {
}

if (writeTree) {
final TemporaryBuffer bb = new TemporaryBuffer.LocalFile();
tree.write(tmp, bb);
bb.close();

NB.encodeInt32(tmp, 0, EXT_TREE);
NB.encodeInt32(tmp, 4, (int) bb.length());
dos.write(tmp, 0, 8);
bb.writeTo(dos, null);
TemporaryBuffer bb = new TemporaryBuffer.LocalFile(dir, 5 << 20);
try {
tree.write(tmp, bb);
bb.close();

NB.encodeInt32(tmp, 0, EXT_TREE);
NB.encodeInt32(tmp, 4, (int) bb.length());
dos.write(tmp, 0, 8);
bb.writeTo(dos, null);
} finally {
bb.destroy();
}
}
writeIndexChecksum = foot.digest();
os.write(writeIndexChecksum);

Loading…
Cancel
Save