You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by fr...@apache.org on 2017/06/29 09:40:23 UTC

svn commit: r1800258 - in /jackrabbit/oak/trunk/oak-segment-tar/src: main/java/org/apache/jackrabbit/oak/segment/file/ main/java/org/apache/jackrabbit/oak/segment/file/tar/ main/java/org/apache/jackrabbit/oak/segment/file/tooling/ test/java/org/apache/...

Author: frm
Date: Thu Jun 29 09:40:22 2017
New Revision: 1800258

URL: http://svn.apache.org/viewvc?rev=1800258&view=rev
Log:
OAK-6404 - Move TAR handling logic in its own package

Added:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/EntryRecovery.java   (with props)
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileAccess.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileAccess.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitor.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreMonitor.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitorAdapter.java   (with props)
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitor.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitorAdapter.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarConstants.java   (with props)
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarEntry.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntry.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarEntryVisitor.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntryVisitor.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarFiles.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarRecovery.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRecovery.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriter.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java
      - copied, changed from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarWriterTest.java
Removed:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileAccess.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreMonitor.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntry.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntryVisitor.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarFiles.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRecovery.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarWriterTest.java
Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.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/FileStoreBuilder.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreStats.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreUtil.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/MetricsIOMonitor.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/ConsistencyChecker.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreStatsTest.java

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java?rev=1800258&r1=1800257&r2=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java Thu Jun 29 09:40:22 2017
@@ -51,6 +51,10 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.SegmentStore;
 import org.apache.jackrabbit.oak.segment.SegmentTracker;
 import org.apache.jackrabbit.oak.segment.SegmentWriter;
+import org.apache.jackrabbit.oak.segment.file.tar.EntryRecovery;
+import org.apache.jackrabbit.oak.segment.file.tar.IOMonitor;
+import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
+import org.apache.jackrabbit.oak.segment.file.tar.TarRecovery;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -77,8 +81,6 @@ public abstract class AbstractFileStore
      */
     static final int CURRENT_STORE_VERSION = 1;
 
-    static final String FILE_NAME_FORMAT = "data%05d%s.tar";
-
     protected static boolean notEmptyDirectory(File path) {
         Collection<File> entries = FileUtils.listFiles(path, new String[] {"tar"}, false);
         checkArgument(entries != null, "{} is not a directory, or an I/O error occurred", path);
@@ -103,8 +105,8 @@ public abstract class AbstractFileStore
     final TarRecovery recovery = new TarRecovery() {
 
         @Override
-        public void recoverEntry(UUID uuid, byte[] data, TarWriter writer) throws IOException {
-            writeSegment(uuid, data, writer);
+        public void recoverEntry(UUID uuid, byte[] data, EntryRecovery entryRecovery) throws IOException {
+            writeSegment(uuid, data, entryRecovery);
         }
 
     };
@@ -227,12 +229,12 @@ public abstract class AbstractFileStore
         return blobStore;
     }
 
-    private void writeSegment(UUID id, byte[] data, TarWriter w) throws IOException {
+    private void writeSegment(UUID id, byte[] data, EntryRecovery w) throws IOException {
         long msb = id.getMostSignificantBits();
         long lsb = id.getLeastSignificantBits();
         ByteBuffer buffer = ByteBuffer.wrap(data);
         int generation = Segment.getGcGeneration(buffer, id);
-        w.writeEntry(msb, lsb, data, 0, data.length, generation);
+        w.recoverEntry(msb, lsb, data, 0, data.length, generation);
         if (SegmentId.isDataSegmentId(lsb)) {
             Segment segment = new Segment(tracker, segmentReader, tracker.newSegmentId(msb, lsb), buffer);
             populateTarGraph(segment, w);
@@ -240,14 +242,14 @@ public abstract class AbstractFileStore
         }
     }
 
-    static void populateTarGraph(Segment segment, TarWriter w) {
+    private static void populateTarGraph(Segment segment, EntryRecovery w) {
         UUID from = segment.getSegmentId().asUUID();
         for (int i = 0; i < segment.getReferencedSegmentIdCount(); i++) {
-            w.addGraphEdge(from, segment.getReferencedSegmentId(i));
+            w.recoverGraphEdge(from, segment.getReferencedSegmentId(i));
         }
     }
 
-    static void populateTarBinaryReferences(final Segment segment, final TarWriter w) {
+    private static void populateTarBinaryReferences(final Segment segment, final EntryRecovery w) {
         final int generation = segment.getGcGeneration();
         final UUID id = segment.getSegmentId().asUUID();
         segment.forEachRecord(new RecordConsumer() {
@@ -255,7 +257,7 @@ public abstract class AbstractFileStore
             @Override
             public void consume(int number, RecordType type, int offset) {
                 if (type == RecordType.BLOB_ID) {
-                    w.addBinaryReference(generation, id, SegmentBlob.readBlobId(segment, number));
+                    w.recoverBinaryReference(generation, id, SegmentBlob.readBlobId(segment, number));
                 }
             }
 

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=1800258&r1=1800257&r2=1800258&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 Jun 29 09:40:22 2017
@@ -84,7 +84,8 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.WriterCacheManager;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.file.GCJournal.GCJournalEntry;
-import org.apache.jackrabbit.oak.segment.file.TarFiles.CleanupResult;
+import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
+import org.apache.jackrabbit.oak.segment.file.tar.TarFiles.CleanupResult;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java?rev=1800258&r1=1800257&r2=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java Thu Jun 29 09:40:22 2017
@@ -45,6 +45,8 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.WriterCacheManager;
 import org.apache.jackrabbit.oak.segment.compaction.LoggingGCMonitor;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
+import org.apache.jackrabbit.oak.segment.file.tar.IOMonitor;
+import org.apache.jackrabbit.oak.segment.file.tar.IOMonitorAdapter;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreStats.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreStats.java?rev=1800258&r1=1800257&r2=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreStats.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreStats.java Thu Jun 29 09:40:22 2017
@@ -26,6 +26,7 @@ import javax.management.openmbean.Compos
 
 import org.apache.jackrabbit.api.stats.TimeSeries;
 import org.apache.jackrabbit.oak.commons.IOUtils;
+import org.apache.jackrabbit.oak.segment.file.tar.FileStoreMonitor;
 import org.apache.jackrabbit.oak.stats.CounterStats;
 import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreUtil.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreUtil.java?rev=1800258&r1=1800257&r2=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreUtil.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreUtil.java Thu Jun 29 09:40:22 2017
@@ -19,11 +19,8 @@ package org.apache.jackrabbit.oak.segmen
 
 import java.io.File;
 import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.List;
 
 import org.apache.jackrabbit.oak.segment.RecordId;
-import org.apache.jackrabbit.oak.segment.SegmentId;
 import org.apache.jackrabbit.oak.segment.SegmentIdProvider;
 import org.apache.jackrabbit.oak.segment.SegmentStore;
 import org.slf4j.Logger;
@@ -65,60 +62,6 @@ class FileStoreUtil {
             }
         }
         return null;
-    }
-
-    static boolean containSegment(List<TarReader> readers, SegmentId id) {
-        return containSegment(readers, id.getMostSignificantBits(), id.getLeastSignificantBits());
-    }
-
-    /**
-     * Check if a segment is contained in one of the provided TAR files.
-     *
-     * @param readers A list of {@link TarReader} instances.
-     * @param msb     Most significant bits of the segment ID.
-     * @param lsb     Least significant bits of the segment ID.
-     * @return {@code true} if the segment is contained in at least one of the
-     * provided TAR files, {@code false} otherwise.
-     */
-    static boolean containSegment(List<TarReader> readers, long msb, long lsb) {
-        for (TarReader reader : readers) {
-            if (reader.containsEntry(msb, lsb)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    static ByteBuffer readEntry(List<TarReader> readers, SegmentId id) {
-        return readEntry(readers, id.getMostSignificantBits(), id.getLeastSignificantBits());
-    }
-
-    /**
-     * Read the entry corresponding to a segment from one of the provided TAR
-     * files.
-     *
-     * @param readers A list of {@link TarReader} instances.
-     * @param msb     Most significant bits of the segment ID.
-     * @param lsb     Least significant bits of the segment ID.
-     * @return An instance of {@link ByteBuffer} if the entry for the segment
-     * could be found, {@code null} otherwise.
-     */
-    static ByteBuffer readEntry(List<TarReader> readers, long msb, long lsb) {
-        for (TarReader reader : readers) {
-            if (reader.isClosed()) {
-                log.debug("Skipping closed tar file {}", reader);
-                continue;
-            }
-            try {
-                ByteBuffer buffer = reader.readEntry(msb, lsb);
-                if (buffer != null) {
-                    return buffer;
-                }
-            } catch (IOException e) {
-                log.warn("Failed to read from tar file {}", reader, e);
-            }
-        }
-        return null;
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/MetricsIOMonitor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/MetricsIOMonitor.java?rev=1800258&r1=1800257&r2=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/MetricsIOMonitor.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/MetricsIOMonitor.java Thu Jun 29 09:40:22 2017
@@ -24,6 +24,7 @@ import java.io.File;
 
 import javax.annotation.Nonnull;
 
+import org.apache.jackrabbit.oak.segment.file.tar.IOMonitorAdapter;
 import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 import org.apache.jackrabbit.oak.stats.StatsOptions;

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java?rev=1800258&r1=1800257&r2=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java Thu Jun 29 09:40:22 2017
@@ -37,6 +37,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.SegmentGraph.SegmentGraphVisitor;
 import org.apache.jackrabbit.oak.segment.SegmentId;
 import org.apache.jackrabbit.oak.segment.SegmentWriter;
+import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Added: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/EntryRecovery.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/EntryRecovery.java?rev=1800258&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/EntryRecovery.java (added)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/EntryRecovery.java Thu Jun 29 09:40:22 2017
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.oak.segment.file.tar;
+
+import java.io.IOException;
+import java.util.UUID;
+
+public interface EntryRecovery {
+
+    void recoverEntry(long msb, long lsb, byte[] data, int offset, int size, int generation) throws IOException;
+
+    void recoverGraphEdge(UUID from, UUID to);
+
+    void recoverBinaryReference(int generation, UUID segmentId, String reference);
+
+}

Propchange: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/EntryRecovery.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileAccess.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileAccess.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileAccess.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileAccess.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileAccess.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileAccess.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileAccess.java Thu Jun 29 09:40:22 2017
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.jackrabbit.oak.segment.file;
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import static com.google.common.base.Preconditions.checkState;
 import static java.nio.channels.FileChannel.MapMode.READ_ONLY;
@@ -121,4 +121,4 @@ abstract class FileAccess {
 
     }
 
-}
\ No newline at end of file
+}

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitor.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreMonitor.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitor.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitor.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreMonitor.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreMonitor.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitor.java Thu Jun 29 09:40:22 2017
@@ -17,29 +17,13 @@
  * under the License.
  */
 
-package org.apache.jackrabbit.oak.segment.file;
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 /**
  * FileStoreMonitor are notified for any writes or deletes
  * performed by FileStore
  */
-interface FileStoreMonitor {
-    FileStoreMonitor DEFAULT = new FileStoreMonitor() {
-        @Override
-        public void written(long bytes) {
-
-        }
-
-        @Override
-        public void reclaimed(long bytes) {
-
-        }
-        
-        @Override
-        public void flushed() {
-            
-        }
-    };
+public interface FileStoreMonitor {
 
     /**
      * Notifies the monitor when data is written
@@ -59,4 +43,5 @@ interface FileStoreMonitor {
      * Notifies the monitor when journal data is flushed to disk.
      */
     void flushed();
+
 }

Added: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitorAdapter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitorAdapter.java?rev=1800258&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitorAdapter.java (added)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitorAdapter.java Thu Jun 29 09:40:22 2017
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.oak.segment.file.tar;
+
+public class FileStoreMonitorAdapter implements FileStoreMonitor {
+
+    @Override
+    public void written(long bytes) {
+        // Intentionally left blank
+    }
+
+    @Override
+    public void reclaimed(long bytes) {
+        // Intentionally left blank
+    }
+
+    @Override
+    public void flushed() {
+        // Intentionally left blank
+    }
+
+}

Propchange: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/FileStoreMonitorAdapter.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitor.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitor.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitor.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitor.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitor.java Thu Jun 29 09:40:22 2017
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.jackrabbit.oak.segment.file;
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import java.io.File;
 

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitorAdapter.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitorAdapter.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitorAdapter.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/IOMonitorAdapter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/IOMonitorAdapter.java Thu Jun 29 09:40:22 2017
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.jackrabbit.oak.segment.file;
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import java.io.File;
 

Added: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarConstants.java?rev=1800258&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarConstants.java (added)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarConstants.java Thu Jun 29 09:40:22 2017
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.oak.segment.file.tar;
+
+class TarConstants {
+
+    private TarConstants() {
+        // Prevent instantiation.
+    }
+
+    static final String FILE_NAME_FORMAT = "data%05d%s.tar";
+
+}

Propchange: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarConstants.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarEntry.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntry.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarEntry.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarEntry.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntry.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntry.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarEntry.java Thu Jun 29 09:40:22 2017
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.jackrabbit.oak.segment.file;
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import java.util.Comparator;
 

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarEntryVisitor.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntryVisitor.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarEntryVisitor.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarEntryVisitor.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntryVisitor.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarEntryVisitor.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarEntryVisitor.java Thu Jun 29 09:40:22 2017
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.jackrabbit.oak.segment.file;
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import java.io.File;
 

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarFiles.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarFiles.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarFiles.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java Thu Jun 29 09:40:22 2017
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.jackrabbit.oak.segment.file;
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -52,10 +52,11 @@ import com.google.common.base.Supplier;
 import com.google.common.collect.Iterables;
 import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
 import org.apache.jackrabbit.oak.segment.SegmentGraph.SegmentGraphVisitor;
+import org.apache.jackrabbit.oak.segment.file.FileStoreStats;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-class TarFiles implements Closeable {
+public class TarFiles implements Closeable {
 
     private static class Node {
 
@@ -70,7 +71,7 @@ class TarFiles implements Closeable {
 
     }
 
-    static class CleanupResult {
+    public static class CleanupResult {
 
         private boolean interrupted;
 
@@ -84,25 +85,25 @@ class TarFiles implements Closeable {
             // Prevent external instantiation.
         }
 
-        long getReclaimedSize() {
+        public long getReclaimedSize() {
             return reclaimedSize;
         }
 
-        List<File> getRemovableFiles() {
+        public List<File> getRemovableFiles() {
             return removableFiles;
         }
 
-        Set<UUID> getReclaimedSegmentIds() {
+        public Set<UUID> getReclaimedSegmentIds() {
             return reclaimedSegmentIds;
         }
 
-        boolean isInterrupted() {
+        public boolean isInterrupted() {
             return interrupted;
         }
 
     }
 
-    static class Builder {
+    public static class Builder {
 
         private File directory;
 
@@ -122,38 +123,38 @@ class TarFiles implements Closeable {
             // Prevent external instantiation.
         }
 
-        Builder withDirectory(File directory) {
+        public Builder withDirectory(File directory) {
             this.directory = checkNotNull(directory);
             return this;
         }
 
-        Builder withMemoryMapping(boolean memoryMapping) {
+        public Builder withMemoryMapping(boolean memoryMapping) {
             this.memoryMapping = memoryMapping;
             return this;
         }
 
-        Builder withTarRecovery(TarRecovery tarRecovery) {
+        public Builder withTarRecovery(TarRecovery tarRecovery) {
             this.tarRecovery = checkNotNull(tarRecovery);
             return this;
         }
 
-        Builder withIOMonitor(IOMonitor ioMonitor) {
+        public Builder withIOMonitor(IOMonitor ioMonitor) {
             this.ioMonitor = checkNotNull(ioMonitor);
             return this;
         }
 
-        Builder withFileStoreStats(FileStoreStats fileStoreStats) {
+        public Builder withFileStoreStats(FileStoreStats fileStoreStats) {
             this.fileStoreStats = checkNotNull(fileStoreStats);
             return this;
         }
 
-        Builder withMaxFileSize(long maxFileSize) {
+        public Builder withMaxFileSize(long maxFileSize) {
             checkArgument(maxFileSize > 0);
             this.maxFileSize = maxFileSize;
             return this;
         }
 
-        Builder withReadOnly() {
+        public Builder withReadOnly() {
             this.readOnly = true;
             return this;
         }
@@ -253,7 +254,7 @@ class TarFiles implements Closeable {
         } while (referencedIds.addAll(references));
     }
 
-    static Builder builder() {
+    public static Builder builder() {
         return new Builder();
     }
 
@@ -385,7 +386,7 @@ class TarFiles implements Closeable {
         return String.format("TarFiles{readers=%s,writer=%s}", newArrayList(iterable(head)), w);
     }
 
-    long size() {
+    public long size() {
         long size = 0;
         Node head;
 
@@ -405,7 +406,7 @@ class TarFiles implements Closeable {
         return size;
     }
 
-    int readerCount() {
+    public int readerCount() {
         Node head;
 
         lock.readLock().lock();
@@ -418,7 +419,7 @@ class TarFiles implements Closeable {
         return Iterables.size(iterable(head));
     }
 
-    void flush() throws IOException {
+    public void flush() throws IOException {
         lock.readLock().lock();
         try {
             writer.flush();
@@ -427,7 +428,7 @@ class TarFiles implements Closeable {
         }
     }
 
-    boolean containsSegment(long msb, long lsb) {
+    public boolean containsSegment(long msb, long lsb) {
         Node head;
 
         lock.readLock().lock();
@@ -450,7 +451,7 @@ class TarFiles implements Closeable {
         return false;
     }
 
-    ByteBuffer readSegment(long msb, long lsb) {
+    public ByteBuffer readSegment(long msb, long lsb) {
         try {
             Node head;
 
@@ -480,7 +481,7 @@ class TarFiles implements Closeable {
         return null;
     }
 
-    void writeSegment(UUID id, byte[] buffer, int offset, int length, int generation, Set<UUID> references, Set<String> binaryReferences) throws IOException {
+    public void writeSegment(UUID id, byte[] buffer, int offset, int length, int generation, Set<UUID> references, Set<String> binaryReferences) throws IOException {
         lock.writeLock().lock();
         try {
             long size = writer.writeEntry(
@@ -528,7 +529,7 @@ class TarFiles implements Closeable {
         writer = newWriter;
     }
 
-    CleanupResult cleanup(Supplier<Set<UUID>> referencesSupplier, Predicate<Integer> reclaimPredicate) throws IOException {
+    public CleanupResult cleanup(Supplier<Set<UUID>> referencesSupplier, Predicate<Integer> reclaimPredicate) throws IOException {
         CleanupResult result = new CleanupResult();
         result.removableFiles = new ArrayList<>();
         result.reclaimedSegmentIds = new HashSet<>();
@@ -668,7 +669,7 @@ class TarFiles implements Closeable {
         return result;
     }
 
-    void collectBlobReferences(ReferenceCollector collector, Predicate<Integer> reclaim) throws IOException {
+    public void collectBlobReferences(ReferenceCollector collector, Predicate<Integer> reclaim) throws IOException {
         Node head;
         lock.writeLock().lock();
         try {
@@ -685,7 +686,7 @@ class TarFiles implements Closeable {
         }
     }
 
-    Iterable<UUID> getSegmentIds() {
+    public Iterable<UUID> getSegmentIds() {
         Node head;
 
         lock.readLock().lock();
@@ -702,7 +703,7 @@ class TarFiles implements Closeable {
         return ids;
     }
 
-    Map<UUID, List<UUID>> getGraph(String fileName) throws IOException {
+    public Map<UUID, List<UUID>> getGraph(String fileName) throws IOException {
         Node head;
 
         lock.readLock().lock();
@@ -735,7 +736,7 @@ class TarFiles implements Closeable {
         return result;
     }
 
-    Map<String, Set<UUID>> getIndices() {
+    public Map<String, Set<UUID>> getIndices() {
         Node head;
 
         lock.readLock().lock();
@@ -752,7 +753,7 @@ class TarFiles implements Closeable {
         return index;
     }
 
-    void traverseSegmentGraph(Set<UUID> roots, SegmentGraphVisitor visitor) throws IOException {
+    public void traverseSegmentGraph(Set<UUID> roots, SegmentGraphVisitor visitor) throws IOException {
         Node head;
 
         lock.readLock().lock();

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java (from r1800257, 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/tar/TarReader.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarReader.java&r1=1800257&r2=1800258&rev=1800258&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/tar/TarReader.java Thu Jun 29 09:40:22 2017
@@ -16,7 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.jackrabbit.oak.segment.file;
+
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import static com.google.common.base.Charsets.UTF_8;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -30,8 +31,6 @@ import static com.google.common.collect.
 import static java.nio.ByteBuffer.wrap;
 import static java.util.Collections.singletonList;
 import static org.apache.jackrabbit.oak.segment.SegmentId.isDataSegmentId;
-import static org.apache.jackrabbit.oak.segment.file.TarWriter.BINARY_REFERENCES_MAGIC;
-import static org.apache.jackrabbit.oak.segment.file.TarWriter.GRAPH_MAGIC;
 
 import java.io.Closeable;
 import java.io.File;
@@ -213,7 +212,24 @@ class TarReader implements Closeable {
         try (TarWriter writer = new TarWriter(file, ioMonitor)) {
             for (Entry<UUID, byte[]> entry : entries.entrySet()) {
                 try {
-                    recovery.recoverEntry(entry.getKey(), entry.getValue(), writer);
+                    recovery.recoverEntry(entry.getKey(), entry.getValue(), new EntryRecovery() {
+
+                        @Override
+                        public void recoverEntry(long msb, long lsb, byte[] data, int offset, int size, int generation) throws IOException {
+                            writer.writeEntry(msb, lsb, data, offset, size, generation);
+                        }
+
+                        @Override
+                        public void recoverGraphEdge(UUID from, UUID to) {
+                            writer.addGraphEdge(from, to);
+                        }
+
+                        @Override
+                        public void recoverBinaryReference(int generation, UUID segmentId, String reference) {
+                            writer.addBinaryReference(generation, segmentId, reference);
+                        }
+
+                    });
                 } catch (IOException e) {
                     throw new IOException(String.format("Unable to recover entry %s for file %s", entry.getKey(), file), e);
                 }
@@ -996,7 +1012,7 @@ class TarReader implements Closeable {
         int size = meta.getInt();
         int magic = meta.getInt();
 
-        if (magic != BINARY_REFERENCES_MAGIC) {
+        if (magic != TarWriter.BINARY_REFERENCES_MAGIC) {
             log.warn("Invalid binary references magic number");
             return null;
         }
@@ -1076,7 +1092,7 @@ class TarReader implements Closeable {
         int bytes = meta.getInt();
         int magic = meta.getInt();
 
-        if (magic != GRAPH_MAGIC) {
+        if (magic != TarWriter.GRAPH_MAGIC) {
             log.warn("Invalid graph magic number in {}", file);
             return null;
         }

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarRecovery.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRecovery.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarRecovery.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarRecovery.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRecovery.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRecovery.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarRecovery.java Thu Jun 29 09:40:22 2017
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.jackrabbit.oak.segment.file;
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import java.io.IOException;
 import java.util.UUID;
@@ -23,7 +23,7 @@ import java.util.UUID;
 /**
  * A strategy for the recovery of segments.
  */
-interface TarRecovery {
+public interface TarRecovery {
 
     /**
      * Recover the data and meta-data of the given segment. The implementor of
@@ -33,10 +33,10 @@ interface TarRecovery {
      *
      * @param uuid   the identifier of the segment.
      * @param data   the raw data of the segment.
-     * @param writer the destination of the recovered data.
+     * @param entryRecovery the destination of the recovered data.
      * @throws IOException if an I/O error occurs while recovering the data of
      *                     the segment.
      */
-    void recoverEntry(UUID uuid, byte[] data, TarWriter writer) throws IOException;
+    void recoverEntry(UUID uuid, byte[] data, EntryRecovery entryRecovery) throws IOException;
 
 }

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriter.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriter.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriter.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarWriter.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriter.java Thu Jun 29 09:40:22 2017
@@ -16,7 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.jackrabbit.oak.segment.file;
+
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import static com.google.common.base.Charsets.UTF_8;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -26,7 +27,7 @@ import static com.google.common.collect.
 import static com.google.common.collect.Maps.newLinkedHashMap;
 import static com.google.common.collect.Sets.newHashSet;
 import static java.lang.String.format;
-import static org.apache.jackrabbit.oak.segment.file.FileStore.FILE_NAME_FORMAT;
+import static org.apache.jackrabbit.oak.segment.file.tar.TarConstants.FILE_NAME_FORMAT;
 
 import java.io.Closeable;
 import java.io.File;
@@ -168,7 +169,7 @@ class TarWriter implements Closeable {
      */
     TarWriter(File file, IOMonitor ioMonitor) {
         this.file = file;
-        this.monitor = FileStoreMonitor.DEFAULT;
+        this.monitor = new FileStoreMonitorAdapter();
         this.writeIndex = -1;
         this.ioMonitor = ioMonitor;
     }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/ConsistencyChecker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/ConsistencyChecker.java?rev=1800258&r1=1800257&r2=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/ConsistencyChecker.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tooling/ConsistencyChecker.java Thu Jun 29 09:40:22 2017
@@ -50,7 +50,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
-import org.apache.jackrabbit.oak.segment.file.IOMonitorAdapter;
+import org.apache.jackrabbit.oak.segment.file.tar.IOMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
 import org.apache.jackrabbit.oak.segment.file.JournalEntry;
 import org.apache.jackrabbit.oak.segment.file.JournalReader;

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreStatsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreStatsTest.java?rev=1800258&r1=1800257&r2=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreStatsTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreStatsTest.java Thu Jun 29 09:40:22 2017
@@ -19,13 +19,11 @@
 
 package org.apache.jackrabbit.oak.segment.file;
 
-import static com.google.common.base.Charsets.UTF_8;
 import static org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.Mockito.mock;
 
 import java.io.File;
-import java.util.UUID;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -71,31 +69,6 @@ public class FileStoreStatsTest {
     }
 
     @Test
-    public void tarWriterIntegration() throws Exception{
-        StatisticsProvider statsProvider = new DefaultStatisticsProvider(executor);
-        File directory = segmentFolder.newFolder();
-        FileStore store = fileStoreBuilder(directory)
-                .withStatisticsProvider(statsProvider)
-                .build();
-        FileStoreStats stats = new FileStoreStats(statsProvider, store, 0);
-        try {
-            long initialSize = stats.getApproximateSize();
-            UUID id = UUID.randomUUID();
-            long msb = id.getMostSignificantBits();
-            long lsb = id.getLeastSignificantBits() & (-1 >>> 4); // OAK-1672
-            byte[] data = "Hello, World!".getBytes(UTF_8);
-
-            try (TarWriter writer = new TarWriter(directory, stats, 0, new IOMonitorAdapter())) {
-                writer.writeEntry(msb, lsb, data, 0, data.length, 0);
-                assertEquals(stats.getApproximateSize() - initialSize, writer.fileLength());
-            }
-        } finally {
-            store.close();
-        }
-        assertEquals(1, stats.getJournalWriteStatsAsCount());
-    }
-
-    @Test
     public void testJournalWriteStats() throws Exception {
         StatisticsProvider statsProvider = new DefaultStatisticsProvider(executor);
         FileStore fileStore = fileStoreBuilder(segmentFolder.newFolder()).withStatisticsProvider(statsProvider).build();

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarFileTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java Thu Jun 29 09:40:22 2017
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.jackrabbit.oak.segment.file;
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import static com.google.common.base.Charsets.UTF_8;
 import static com.google.common.collect.Lists.newArrayList;

Copied: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java (from r1800257, jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarWriterTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java?p2=jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java&p1=jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarWriterTest.java&r1=1800257&r2=1800258&rev=1800258&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TarWriterTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java Thu Jun 29 09:40:22 2017
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.jackrabbit.oak.segment.file;
+package org.apache.jackrabbit.oak.segment.file.tar;
 
 import static com.google.common.base.Charsets.UTF_8;
 import static org.junit.Assert.assertEquals;
@@ -40,7 +40,7 @@ public class TarWriterTest {
     @Test
     public void createNextGenerationTest() throws IOException {
         int counter = 2222;
-        TarWriter t0 = new TarWriter(folder.newFolder(), FileStoreMonitor.DEFAULT, counter, new IOMonitorAdapter());
+        TarWriter t0 = new TarWriter(folder.newFolder(), new FileStoreMonitorAdapter(), counter, new IOMonitorAdapter());
 
         // not dirty, will not create a new writer
         TarWriter t1 = t0.createNextGeneration();
@@ -60,4 +60,28 @@ public class TarWriterTest {
         assertTrue(t2.getFile().getName().contains("" + (counter + 1)));
     }
 
+    private static class TestFileStoreMonitor extends FileStoreMonitorAdapter {
+
+        long written;
+
+        @Override
+        public void written(long bytes) {
+            written += bytes;
+        }
+
+    }
+
+    @Test
+    public void testFileStoreMonitor() throws Exception {
+        TestFileStoreMonitor monitor = new TestFileStoreMonitor();
+        try (TarWriter writer = new TarWriter(folder.getRoot(), monitor, 0, new IOMonitorAdapter())) {
+            long sizeBefore = writer.fileLength();
+            long writtenBefore = monitor.written;
+            writer.writeEntry(0, 0, new byte[42], 0, 42, 0);
+            long sizeAfter = writer.fileLength();
+            long writtenAfter = monitor.written;
+            assertEquals(sizeAfter - sizeBefore, writtenAfter - writtenBefore);
+        }
+    }
+
 }