Fix GC to delete empty fanout directories after repacking

The prune method did not delete empty fanout directories when loose
objects moved to a new pack file but only when loose unreferenced
objects were pruned.

Change-Id: Ia068f4914c54d9cf9f40b75e8ea50759402b5000
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
Matthias Sohn 2019-03-20 13:54:10 +01:00
parent 2b64345f53
commit 534ede2d81
2 changed files with 22 additions and 2 deletions

View File

@ -47,6 +47,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.Collections;
import java.util.Date;
@ -113,8 +114,24 @@ public void testPackCommitsAndLooseOneWithPruneNow() throws Exception {
fsTick();
gc.gc();
stats = gc.getStatistics();
assertNoEmptyFanoutDirectories();
assertEquals(0, stats.numberOfLooseObjects);
assertEquals(8, stats.numberOfPackedObjects);
assertEquals(2, stats.numberOfPackFiles);
}
private void assertNoEmptyFanoutDirectories() {
File[] fanout = repo.getObjectsDirectory().listFiles();
for (File f : fanout) {
if (f.isDirectory()) {
String[] entries = f.list();
if (entries == null || entries.length == 0) {
assertFalse(
"Found empty fanout directory "
+ f.getAbsolutePath() + " after pruning",
f.getName().length() == 2);
}
}
}
}
}

View File

@ -545,9 +545,12 @@ public void prune(Set<ObjectId> objectsToKeep) throws IOException,
pm.update(1);
if (d.length() != 2)
continue;
File[] entries = new File(objects, d).listFiles();
if (entries == null)
File dir = new File(objects, d);
File[] entries = dir.listFiles();
if (entries == null || entries.length == 0) {
FileUtils.delete(dir, FileUtils.IGNORE_ERRORS);
continue;
}
for (File f : entries) {
checkCancelled();
String fName = f.getName();