Browse Source

Ignore bitmap indexes that do not match the pack checksum

If `git gc` creates a new pack with the same file name, the
pack checksum may not match that in the .bitmap. Fix the PackFile
implementaion to silently ignore invalid bitmap indexes.

Fixes Issue https://code.google.com/p/gerrit/issues/detail?id=2131

Change-Id: I378673c00de32385ba90f4b639cb812f9574a216
tags/v3.1.0.201309270735-rc1
Colby Ranger 10 years ago
parent
commit
570bba5e7a

+ 8
- 8
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java View File

@@ -121,6 +121,8 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {

private volatile boolean invalid;

private boolean invalidBitmap;

private byte[] packChecksum;

private PackIndex loadedIdx;
@@ -1057,19 +1059,17 @@ public class PackFile implements Iterable<PackIndex.MutableEntry> {
}

synchronized PackBitmapIndex getBitmapIndex() throws IOException {
if (invalid)
if (invalid || invalidBitmap)
return null;
if (bitmapIdx == null && hasExt(BITMAP_INDEX)) {
final PackBitmapIndex idx = PackBitmapIndex.open(
extFile(BITMAP_INDEX), idx(), getReverseIdx());

if (packChecksum == null)
packChecksum = idx.packChecksum;
else if (!Arrays.equals(packChecksum, idx.packChecksum))
throw new PackMismatchException(
JGitText.get().packChecksumMismatch);

bitmapIdx = idx;
// At this point, idx() will have set packChecksum.
if (Arrays.equals(packChecksum, idx.packChecksum))
bitmapIdx = idx;
else
invalidBitmap = true;
}
return bitmapIdx;
}

Loading…
Cancel
Save