Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Compactor.java =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Compactor.java (revision 1746478) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Compactor.java (working copy) @@ -105,8 +105,9 @@ } } - private final RecordCache cache = RecordCache. factory( - cacheSize).get(); + private final RecordCache cache = + // RecordCache. factory(cacheSize).get(); + RecordCache. empty().get(); public Compactor(SegmentReader reader, SegmentWriter writer, BlobStore blobStore, Supplier cancel) { Index: oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java =================================================================== --- oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java (revision 1746478) +++ oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactionAndCleanupIT.java (working copy) @@ -256,6 +256,53 @@ } } + @Test + public void offlineCompactionCps() + throws IOException, CommitFailedException { + // lots of checkpoints, no binaries + + SegmentGCOptions gcOptions = DEFAULT.setOffline(); + FileStore fileStore = FileStore.builder(getFileStoreFolder()) + .withMaxFileSize(1) + .withGCOptions(gcOptions) + .build(); + SegmentNodeStore nodeStore = SegmentNodeStoreBuilders.builder(fileStore).build(); + + try { + // Create ~2MB of data + NodeBuilder extra = nodeStore.getRoot().builder(); + NodeBuilder content = extra.child("content"); + for (int i = 0; i < 10000; i++) { + NodeBuilder c = content.child("c" + i); + for (int j = 0; j < 1000; j++) { + c.setProperty("p" + i, "v" + i); + } + } + nodeStore.merge(extra, EmptyHook.INSTANCE, CommitInfo.EMPTY); + fileStore.flush(); + + fileStore.compact(); + fileStore.cleanup(); + + // Compacts to 548Kb + long size0 = fileStore.size(); + + for (int i = 0; i < 4; i++) { + String cp = nodeStore.checkpoint(Long.MAX_VALUE); + assertTrue(nodeStore.retrieve(cp) != null); + } + long size1 = fileStore.size(); + assertSize("with checkpoints added", size1, size0, size0 * 11 / 10); + + fileStore.compact(); + fileStore.cleanup(); + long size2 = fileStore.size(); + assertSize("with checkpoints compacted", size2, size1, size1 * 11 / 10); + } finally { + fileStore.close(); + } + } + private static void assertSize(String info, long size, long lower, long upper) { log.debug("File Store {} size {}, expected in interval [{},{}]", info, size, lower, upper);