Browse Source

Merge branch 'stable-5.3'

* stable-5.3:
  Fix GC to delete empty fanout directories after repacking

Change-Id: I080ddb03c6143f0bfa24707a10a4d926676d32b1
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-5.4
Matthias Sohn 6 years ago
parent
commit
5efcbaf7c3
  1. 17
      org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java
  2. 7
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java

17
org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/GcPruneNonReferencedTest.java

@ -47,6 +47,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import java.io.File;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
@ -113,8 +114,24 @@ public class GcPruneNonReferencedTest extends GcTestCase {
fsTick(); fsTick();
gc.gc(); gc.gc();
stats = gc.getStatistics(); stats = gc.getStatistics();
assertNoEmptyFanoutDirectories();
assertEquals(0, stats.numberOfLooseObjects); assertEquals(0, stats.numberOfLooseObjects);
assertEquals(8, stats.numberOfPackedObjects); assertEquals(8, stats.numberOfPackedObjects);
assertEquals(2, stats.numberOfPackFiles); 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);
}
}
}
}
} }

7
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/GC.java

@ -548,9 +548,12 @@ public class GC {
pm.update(1); pm.update(1);
if (d.length() != 2) if (d.length() != 2)
continue; continue;
File[] entries = new File(objects, d).listFiles(); File dir = new File(objects, d);
if (entries == null) File[] entries = dir.listFiles();
if (entries == null || entries.length == 0) {
FileUtils.delete(dir, FileUtils.IGNORE_ERRORS);
continue; continue;
}
for (File f : entries) { for (File f : entries) {
checkCancelled(); checkCancelled();
String fName = f.getName(); String fName = f.getName();

Loading…
Cancel
Save