Index: src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java (revision 1668577) +++ src/main/java/org/apache/jackrabbit/core/data/FileDataStore.java (working copy) @@ -23,6 +23,7 @@ import java.io.OutputStream; import java.io.RandomAccessFile; import java.lang.ref.WeakReference; +import java.nio.file.Files; import java.security.DigestOutputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -280,13 +281,39 @@ File file = getFile(identifier); synchronized (this) { if (file.exists()) { - if (!file.delete()) { + if (file.delete()) { + deleteEmptyParentDirs(file); + } else { log.warn("Failed to delete file " + file.getAbsolutePath()); } } } - } + } + private void deleteEmptyParentDirs(File file) { + File parent = file.getParentFile(); + try { + // Only iterate & delete if parent directory of the blob file is child + // of the base directory and if it is empty + while (FileUtils.directoryContains(directory, parent)) { + String[] entries = parent.list(); + if (entries == null) { + log.warn("Failed to list directory {}", parent.getAbsolutePath()); + break; + } + if (entries.length > 0) { + break; + } + boolean deleted = parent.delete(); + log.debug("Deleted [{}] of file [{}]: {}", + new Object[]{parent, file.getAbsolutePath(), deleted}); + parent = parent.getParentFile(); + } + } catch (IOException e) { + log.warn("Error in parents deletion for " + file.getAbsoluteFile(), e); + } + } + public int deleteAllOlderThan(long min) { int count = 0; for (File file : directory.listFiles()) {