Merge branch 'stable-4.9' into stable-4.10
* stable-4.9: Reduce contention on PackFile.idx() function. Change-Id: I277e53aa752c8ffb8560de710d27ecb58871ec02 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
commit
47d7f7aabb
|
@ -139,7 +139,7 @@ public int compare(final PackFile a, final PackFile b) {
|
|||
|
||||
private byte[] packChecksum;
|
||||
|
||||
private PackIndex loadedIdx;
|
||||
private volatile PackIndex loadedIdx;
|
||||
|
||||
private PackReverseIndex reverseIdx;
|
||||
|
||||
|
@ -174,35 +174,44 @@ public PackFile(final File packFile, int extensions) {
|
|||
length = Long.MAX_VALUE;
|
||||
}
|
||||
|
||||
private synchronized PackIndex idx() throws IOException {
|
||||
if (loadedIdx == null) {
|
||||
if (invalid)
|
||||
throw new PackInvalidException(packFile);
|
||||
private PackIndex idx() throws IOException {
|
||||
PackIndex idx = loadedIdx;
|
||||
if (idx == null) {
|
||||
synchronized (this) {
|
||||
idx = loadedIdx;
|
||||
if (idx == null) {
|
||||
if (invalid) {
|
||||
throw new PackInvalidException(packFile);
|
||||
}
|
||||
try {
|
||||
idx = PackIndex.open(extFile(INDEX));
|
||||
|
||||
try {
|
||||
final PackIndex idx = PackIndex.open(extFile(INDEX));
|
||||
|
||||
if (packChecksum == null) {
|
||||
packChecksum = idx.packChecksum;
|
||||
} else if (!Arrays.equals(packChecksum, idx.packChecksum)) {
|
||||
throw new PackMismatchException(MessageFormat.format(
|
||||
JGitText.get().packChecksumMismatch,
|
||||
packFile.getPath(),
|
||||
ObjectId.fromRaw(packChecksum).name(),
|
||||
ObjectId.fromRaw(idx.packChecksum).name()));
|
||||
if (packChecksum == null) {
|
||||
packChecksum = idx.packChecksum;
|
||||
} else if (!Arrays.equals(packChecksum,
|
||||
idx.packChecksum)) {
|
||||
throw new PackMismatchException(MessageFormat
|
||||
.format(JGitText.get().packChecksumMismatch,
|
||||
packFile.getPath(),
|
||||
ObjectId.fromRaw(packChecksum)
|
||||
.name(),
|
||||
ObjectId.fromRaw(idx.packChecksum)
|
||||
.name()));
|
||||
}
|
||||
loadedIdx = idx;
|
||||
} catch (InterruptedIOException e) {
|
||||
// don't invalidate the pack, we are interrupted from
|
||||
// another thread
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
invalid = true;
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
loadedIdx = idx;
|
||||
} catch (InterruptedIOException e) {
|
||||
// don't invalidate the pack, we are interrupted from another thread
|
||||
throw e;
|
||||
} catch (IOException e) {
|
||||
invalid = true;
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
return loadedIdx;
|
||||
return idx;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the File object which locates this pack on disk.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue