]> source.dussan.org Git - jgit.git/commitdiff
Ignore bitmap indexes that do not match the pack checksum 18/16618/4
authorColby Ranger <cranger@google.com>
Thu, 19 Sep 2013 21:33:13 +0000 (14:33 -0700)
committerColby Ranger <cranger@google.com>
Thu, 19 Sep 2013 21:53:01 +0000 (14:53 -0700)
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

org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackFile.java

index b52d3f70a4b464c3cb6382538c4324af04125bba..5e1e2b1a38108095f58091e330a685e96bef84a1 100644 (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;
        }