[JGIT PATCH 10/10] BROKEN TEST: ObjectLoader stays valid across repacks
This doesn't doesn't work.
What we are trying to verify is that an ObjectLoader remains valid
if the underlying storage for the object has moved, such as when a
repository is repacked, the old pack was deleted, and the object is
now in the new pack.
---
.../org/spearce/jgit/lib/ConcurrentRepackTest.java | 46 ++++++++++++++++++++
1 files changed, 46 insertions(+), 0 deletions(-)
diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ConcurrentRepackTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ConcurrentRepackTest.java
index 6eb368c..b1b1af2 100644
--- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ConcurrentRepackTest.java
+++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ConcurrentRepackTest.java
@@ -41,6 +41,7 @@
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.util.Arrays;
import org.spearce.jgit.errors.IncorrectObjectTypeException;
import org.spearce.jgit.errors.MissingObjectException;
@@ -128,6 +129,51 @@ public void testObjectMovedWithinPack()
assertEquals(o2.name(), parse(o2).name());
}
+ public void testObjectMovedToNewPack2()
+ throws IncorrectObjectTypeException, IOException {
+ // Create an object and pack it. Then remove that pack and put the
+ // object into a different pack file, with some other object. We
+ // still should be able to access the objects.
+ //
+ final Repository eden = createNewEmptyRepo();
+ final RevObject o1 = writeBlob(eden, "o1");
+ final File[] out1 = pack(eden, o1);
+ assertEquals(o1.name(), parse(o1).name());
+
+ final ObjectLoader load1 = db.openBlob(o1);
+ assertNotNull(load1);
+
+ final RevObject o2 = writeBlob(eden, "o2");
+ pack(eden, o2, o1);
+
+ // Force close, and then delete, the old pack.
+ //
+ whackCache();
+ delete(out1);
+
+ // Now here is the interesting thing... can the loader we made
+ // earlier still resolve the object, even though its underlying
+ // pack is gone, but the object still exists.
+ //
+ final ObjectLoader load2 = db.openBlob(o1);
+ assertNotNull(load2);
+ assertNotSame(load1, load2);
+
+ // Currently load1.getCachedBytes NPEs due to the openCount == 1,
+ // but fd == null. Aside from the underlying pack being gone, the
+ // WindowCache didn't reset the openCount to 0 when it closed the
+ // file during the mass cache eviction. Thus we never tried to do
+ // an subsequent open.
+ //
+ final byte[] data2 = load2.getCachedBytes();
+ final byte[] data1 = load1.getCachedBytes();
+ assertNotNull(data2);
+ assertNotNull(data1);
+ assertNotSame(data1, data2); // cache should be per-pack, not per object
+ assertTrue(Arrays.equals(data1, data2));
+ assertEquals(load2.getType(), load1.getType());
+ }
+
private static void whackCache() {
final WindowCacheConfig config = new WindowCacheConfig();
--
1.6.3.rc1.188.ga02b