Author: mduerig
Date: Thu Sep 15 12:59:23 2016
New Revision: 1760927

URL: http://svn.apache.org/viewvc?rev=1760927&view=rev
Log:
OAK-4740: TarReader recovery skips generating the index and binary graphs
Represent non inlined binary references by the record id of the string record 
in the binary index

Modified:
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/BinaryReferences.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
    
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/BinaryReferences.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/BinaryReferences.java?rev=1760927&r1=1760926&r2=1760927&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/BinaryReferences.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/BinaryReferences.java
 Thu Sep 15 12:59:23 2016
@@ -19,6 +19,12 @@ package org.apache.jackrabbit.oak.segmen
 
 import java.util.UUID;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.google.common.base.Function;
+import org.apache.jackrabbit.oak.segment.file.FileStore;
+
 /**
  * Utility methods for working with binary references.
  */
@@ -42,4 +48,44 @@ public final class BinaryReferences {
         };
     }
 
+    /**
+     * @param blobId
+     * @return  A new id for a binary reference from an inlined {@code blobId}.
+     */
+    @Nonnull
+    public static String newReference(@Nonnull String blobId) {
+        return "I" + blobId;
+    }
+
+    /**
+     * @param blobId
+     * @return  A new id for a binary reference from a record id identifying a
+     *          string record where the {@code blobId} is stored.
+     */
+    @Nonnull
+    public static String newReference(@Nonnull RecordId blobId) {
+        return "R" + blobId.toString10();
+    }
+
+    /**
+     * @param fileStore
+     * @return  A new reader for binary references for the passed {@code 
fileStore}.
+     * @see #newReference(String)
+     * @see #newReference(RecordId)
+     */
+    @Nonnull
+    public static Function<String, String> newReferenceReader(@Nonnull final 
FileStore fileStore) {
+        return new Function<String, String>() {
+            @Nullable @Override
+            public String apply(String reference) {
+                if (reference.charAt(0) == 'I') {
+                    return reference.substring(1);
+                } else {
+                    return fileStore.getReader().readString(
+                            RecordId.fromString(fileStore, 
reference.substring(1)));
+                }
+            }
+
+        };
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java?rev=1760927&r1=1760926&r2=1760927&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriter.java
 Thu Sep 15 12:59:23 2016
@@ -44,6 +44,7 @@ import static org.apache.jackrabbit.oak.
 import static org.apache.jackrabbit.oak.api.Type.NAME;
 import static org.apache.jackrabbit.oak.api.Type.NAMES;
 import static org.apache.jackrabbit.oak.api.Type.STRING;
+import static org.apache.jackrabbit.oak.segment.BinaryReferences.newReference;
 import static org.apache.jackrabbit.oak.segment.MapRecord.BUCKETS_PER_LEVEL;
 import static 
org.apache.jackrabbit.oak.segment.RecordWriters.newNodeStateWriter;
 
@@ -798,13 +799,17 @@ public class SegmentWriter {
 
             RecordId recordId;
 
+            String binaryReference;
             if (data.length < Segment.BLOB_ID_SMALL_LIMIT) {
+                binaryReference = newReference(blobId);
                 recordId = RecordWriters.newBlobIdWriter(data).write(writer);
             } else {
-                recordId = 
RecordWriters.newBlobIdWriter(writeString(blobId)).write(writer);
+                RecordId refId = writeString(blobId);
+                binaryReference = newReference(refId);
+                recordId = RecordWriters.newBlobIdWriter(refId).write(writer);
             }
 
-            binaryReferenceConsumer.consume(writer.getGeneration(), 
recordId.asUUID(), blobId);
+            binaryReferenceConsumer.consume(writer.getGeneration(), 
recordId.asUUID(), binaryReference);
 
             return recordId;
         }

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java?rev=1760927&r1=1760926&r2=1760927&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
 Thu Sep 15 12:59:23 2016
@@ -37,6 +37,7 @@ import static java.util.concurrent.TimeU
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.jackrabbit.oak.commons.IOUtils.humanReadableByteCount;
 import static 
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
+import static 
org.apache.jackrabbit.oak.segment.BinaryReferences.newReferenceReader;
 import static org.apache.jackrabbit.oak.segment.SegmentId.isDataSegmentId;
 import static 
org.apache.jackrabbit.oak.segment.SegmentWriterBuilder.segmentWriterBuilder;
 import static org.apache.jackrabbit.oak.segment.file.GCListener.Status.FAILURE;
@@ -925,7 +926,7 @@ public class FileStore implements Segmen
 
         int minGeneration = getGcGeneration() - 
gcOptions.getRetainedGenerations() + 1;
         for (TarReader tarReader : tarReaders) {
-            tarReader.collectBlobReferences(collector, minGeneration);
+            tarReader.collectBlobReferences(collector, 
newReferenceReader(this), minGeneration);
         }
     }
 

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=1760927&r1=1760926&r2=1760927&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 Sep 15 12:59:23 2016
@@ -55,6 +55,7 @@ import java.util.zip.CRC32;
 import javax.annotation.Nonnull;
 
 import com.google.common.base.Charsets;
+import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Sets;
 import org.apache.commons.io.FileUtils;
@@ -734,9 +735,13 @@ class TarReader implements Closeable {
      * Collect the references of those blobs that are reachable from any 
segment with a
      * generation at or above {@code minGeneration}.
      * @param collector
+     * @param referenceDecoder
      * @param minGeneration
      */
-    void collectBlobReferences(ReferenceCollector collector, int 
minGeneration) {
+    void collectBlobReferences(
+            @Nonnull ReferenceCollector collector,
+            @Nonnull Function<String, String> referenceDecoder,
+            int minGeneration) {
         Map<Integer, Map<UUID, Set<String>>> generations = 
getBinaryReferences();
 
         if (generations == null) {
@@ -750,7 +755,7 @@ class TarReader implements Closeable {
 
             for (Set<String> references : entry.getValue().values()) {
                 for (String reference : references) {
-                    collector.addReference(reference, null);
+                    collector.addReference(referenceDecoder.apply(reference), 
null);
                 }
             }
         }


Reply via email to