public void compactionAndWeakReferenceMagic() throws Exception{
final int MB = 1024 * 1024;
final int blobSize = 5 * MB;
FileStore fileStore = new FileStore(directory, 1, 1, false);
SegmentNodeStore nodeStore = new SegmentNodeStore(fileStore);
//1. Create a property with 5 MB blob
NodeBuilder builder = nodeStore.getRoot().builder();
builder.setProperty("a1", createBlob(nodeStore, blobSize));
builder.setProperty("b", "foo");
//Keep a reference to this nodeState to simulate long
//running session
NodeState ns1 = nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
System.out.printf("File store pre removal %d%n", mb(fileStore.size()));
assertEquals(mb(fileStore.size()), mb(blobSize));
//2. Now remove the property
builder = nodeStore.getRoot().builder();
builder.removeProperty("a1");
nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
//Size remains same
System.out.printf("File store pre compaction %d%n", mb(fileStore.size()));
assertEquals(mb(fileStore.size()), mb(blobSize));
//3. Compact
fileStore.compact();
//Size still remains same
System.out.printf("File store post compaction %d%n", mb(fileStore.size()));
assertEquals(mb(fileStore.size()), mb(blobSize));
//4. Add some more property to flush the current TarWriter
builder = nodeStore.getRoot().builder();
builder.setProperty("a2", createBlob(nodeStore, blobSize));
nodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
//Size is double
System.out.printf("File store pre cleanup %d%n", mb(fileStore.size()));
assertEquals(mb(fileStore.size()), 2 * mb(blobSize));