Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (revision 62de029fbeb1700886799e4eb417fcc6a55c698a) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (revision ) @@ -204,7 +204,7 @@ } this.writeFile = new File( directory, - String.format(FILE_NAME_FORMAT, writeNumber, "a")); + String.format(FILE_NAME_FORMAT, writeNumber, "-0")); this.writer = new TarWriter(writeFile); LinkedList heads = newLinkedList(); @@ -694,7 +694,7 @@ writeNumber++; writeFile = new File( directory, - String.format(FILE_NAME_FORMAT, writeNumber, "a")); + String.format(FILE_NAME_FORMAT, writeNumber, "-0")); writer = new TarWriter(writeFile); } } catch (IOException e) { Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java (revision 62de029fbeb1700886799e4eb417fcc6a55c698a) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarReader.java (revision ) @@ -23,6 +23,7 @@ import static com.google.common.collect.Maps.newLinkedHashMap; import static com.google.common.collect.Maps.newTreeMap; import static com.google.common.collect.Sets.newHashSetWithExpectedSize; +import static java.lang.Character.isDigit; import static java.util.Collections.singletonList; import static org.apache.jackrabbit.oak.plugins.segment.Segment.REF_COUNT_OFFSET; import static org.apache.jackrabbit.oak.plugins.segment.SegmentId.isDataSegmentId; @@ -685,17 +686,10 @@ return this; } - String name = file.getName(); - int pos = name.length() - "a.tar".length(); - char generation = name.charAt(pos); - if (generation == 'z') { - // no garbage collection after reaching generation z + File newFile = nextGeneration(); + if (newFile == null) { return this; } - - File newFile = new File( - file.getParentFile(), - name.substring(0, pos) + (char) (generation + 1) + ".tar"); TarWriter writer = new TarWriter(newFile); for (int i = 0; i < sorted.length; i++) { TarEntry entry = sorted[i]; @@ -716,6 +710,27 @@ log.warn("Failed to open cleaned up tar file {}", file); return this; } + } + + private File nextGeneration() { + String name = file.getName(); + int pos = name.lastIndexOf('-'); + if (pos == -1) { + log.warn("Skipping garbage collection for tar file without generation suffix: {}", name); + return null; + } + String base = name.substring(0, pos + 1); + + int generation = 0; + char c; + while (++pos < name.length() && (c = name.charAt(pos)) != '.') { + if (isDigit(c)) { + generation = generation * 10 + (c - '0'); + } else { + log.warn("Skipping garbage collection for tar file with invalid generation suffix: {}", name); + } + } + return new File(file.getParentFile(), base + ++generation + ".tar"); } File close() throws IOException {