From 10ddb1721f6e16ca5156e31140648ab1d52582a2 Mon Sep 17 00:00:00 2001 From: aparvule Date: Tue, 28 Mar 2017 16:10:40 +0200 Subject: [PATCH] introducing TarEntryLite --- .../jackrabbit/oak/segment/file/TarEntry.java | 40 ++++++++++++++++++---- .../jackrabbit/oak/segment/file/TarReader.java | 8 ++--- .../jackrabbit/oak/segment/file/TarWriter.java | 19 +++++----- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntry.java b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntry.java index 2b7bd18..99409fe 100644 --- a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntry.java +++ b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntry.java @@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.segment.file; import java.util.Comparator; +import java.util.UUID; /** * A file entry location in a tar file. This is used for the index with a tar @@ -42,16 +43,16 @@ public int compare(TarEntry a, TarEntry b) { } }; - static final Comparator IDENTIFIER_ORDER = new Comparator() { + static final Comparator IDENTIFIER_ORDER = new Comparator() { @Override - public int compare(TarEntry a, TarEntry b) { - if (a.msb > b.msb) { + public int compare(UUID a, UUID b) { + if (a.getMostSignificantBits() > b.getMostSignificantBits()) { return 1; - } else if (a.msb < b.msb) { + } else if (a.getMostSignificantBits() < b.getMostSignificantBits()) { return -1; - } else if (a.lsb > b.lsb) { + } else if (a.getLeastSignificantBits() > b.getLeastSignificantBits()) { return 1; - } else if (a.lsb < b.lsb) { + } else if (a.getLeastSignificantBits() < b.getLeastSignificantBits()) { return -1; } else { return 0; @@ -97,4 +98,31 @@ int generation() { return generation; } + public static class TarEntryLite { + + private final int offset; + + private final int size; + + private final int generation; + + TarEntryLite(int offset, int size, int generation) { + this.offset = offset; + this.size = size; + this.generation = generation; + } + + int offset() { + return offset; + } + + int size() { + return size; + } + + int generation() { + return generation; + } + } + } diff --git a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java index b674d3f..a1291b6 100644 --- a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java +++ b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java @@ -652,7 +652,7 @@ private int findEntry(long msb, long lsb) { } @Nonnull - private static List getReferences(TarEntry entry, UUID id, Map> graph) { + private static List getReferences(UUID id, Map> graph) { List references = graph.get(id); if (references == null) { @@ -681,7 +681,7 @@ public void traverseSegmentGraph( UUID id = new UUID(entry.msb(), entry.lsb()); if (roots.remove(id) && isDataSegmentId(entry.lsb())) { // this is a referenced data segment, so follow the graph - for (UUID refId : getReferences(entry, id, graph)) { + for (UUID refId : getReferences(id, graph)) { visitor.accept(id, refId); roots.add(refId); } @@ -709,7 +709,7 @@ void calculateForwardReferences(Set referencedIds) throws IOException { UUID id = new UUID(entry.msb(), entry.lsb()); if (referencedIds.remove(id)) { if (isDataSegmentId(entry.lsb())) { - referencedIds.addAll(getReferences(entry, id, graph)); + referencedIds.addAll(getReferences(id, graph)); } } } @@ -771,7 +771,7 @@ void mark(Set bulkRefs, Set reclaim, Predicate reclaimGener reclaim.add(id); } else { if (isDataSegmentId(entry.lsb())) { - for (UUID refId : getReferences(entry, id, graph)) { + for (UUID refId : getReferences(id, graph)) { if (!isDataSegmentId(refId.getLeastSignificantBits())) { // keep the extra check for bulk segments for the case where a // pre-compiled graph is not available (graph == null) and diff --git a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java index 6aa714f..018e07c 100644 --- a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java +++ b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java @@ -47,6 +47,8 @@ import com.google.common.base.Charsets; import com.google.common.base.Stopwatch; + +import org.apache.jackrabbit.oak.segment.file.TarEntry.TarEntryLite; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -151,7 +153,7 @@ static final int getPaddingSize(int size) { *

* Should only be accessed from synchronized code. */ - private final Map index = newLinkedHashMap(); + private final Map index = newLinkedHashMap(); /** * List of binary references contained in this TAR file. @@ -210,8 +212,8 @@ synchronized boolean containsEntry(long msb, long lsb) { */ ByteBuffer readEntry(long msb, long lsb) throws IOException { checkState(!closed); - - TarEntry entry; + + TarEntryLite entry; synchronized (this) { entry = index.get(new UUID(msb, lsb)); } @@ -272,7 +274,7 @@ private synchronized long writeEntry(UUID uuid, byte[] header, byte[] data, int monitor.written(currentLength - initialLength); checkState(currentLength <= Integer.MAX_VALUE); - TarEntry entry = new TarEntry(msb, lsb, (int) (currentLength - size - padding), size, generation); + TarEntryLite entry = new TarEntryLite((int) (currentLength - size - padding), size, generation); index.put(uuid, entry); return currentLength; @@ -564,11 +566,12 @@ private void writeIndex() throws IOException { byte[] header = newEntryHeader(indexName, indexSize + padding); ByteBuffer buffer = ByteBuffer.allocate(indexSize); - TarEntry[] sorted = index.values().toArray(new TarEntry[index.size()]); + UUID[] sorted = index.keySet().toArray(new UUID[index.size()]); Arrays.sort(sorted, TarEntry.IDENTIFIER_ORDER); - for (TarEntry entry : sorted) { - buffer.putLong(entry.msb()); - buffer.putLong(entry.lsb()); + for (UUID id : sorted) { + TarEntryLite entry = index.get(id); + buffer.putLong(id.getMostSignificantBits()); + buffer.putLong(id.getLeastSignificantBits()); buffer.putInt(entry.offset()); buffer.putInt(entry.size()); buffer.putInt(entry.generation());