Author: mduerig
Date: Thu Aug 18 08:16:17 2016
New Revision: 1756738
URL: http://svn.apache.org/viewvc?rev=1756738&view=rev
Log:
OAK-4669: Cleanup creates new generation of tar file without removing any
segments
Only consider the sizes of the entries to assess space savings and ignore
contributions by indexes and other metadata.
Credits to Andrei Dulceanu for the patch
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java?rev=1756738&r1=1756737&r2=1756738&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
Thu Aug 18 08:16:17 2016
@@ -815,35 +815,36 @@ class TarReader implements Closeable {
log.debug("Cleaning up {}", name);
Set<UUID> cleaned = newHashSet();
- int size = 0;
- int count = 0;
+ int afterSize = 0;
+ int beforeSize = 0;
+ int afterCount = 0;
+
TarEntry[] entries = getEntries();
for (int i = 0; i < entries.length; i++) {
TarEntry entry = entries[i];
+ beforeSize += getEntrySize(entry.size());;
UUID id = new UUID(entry.msb(), entry.lsb());
if (reclaim.contains(id)) {
cleaned.add(id);
entries[i] = null;
} else {
- size += getEntrySize(entry.size());
- count += 1;
+ afterSize += getEntrySize(entry.size());
+ afterCount += 1;
}
}
- size += getEntrySize(TarEntry.SIZE * count + 16);
- size += 2 * BLOCK_SIZE;
-
- if (count == 0) {
+
+ if (afterCount == 0) {
log.debug("None of the entries of {} are referenceable.", name);
logCleanedSegments(cleaned);
return null;
}
- if (size >= access.length() * 3 / 4 && hasGraph()) {
+ if (afterSize >= beforeSize * 3 / 4 && hasGraph()) {
// the space savings are not worth it at less than 25%,
// unless this tar file lacks a pre-compiled segment graph
// in which case we'll always generate a new tar file with
// the graph to speed up future garbage collection runs.
log.debug("Not enough space savings. ({}/{}). Skipping clean up of
{}",
- access.length() - size, access.length(), name);
+ access.length() - afterSize, access.length(), name);
return this;
}
if (!hasGraph()) {