Author: mduerig
Date: Fri Jun 10 16:45:10 2016
New Revision: 1747742

URL: http://svn.apache.org/viewvc?rev=1747742&view=rev
Log:
OAK-4465: Remove the read-only concern from TarRevisions
Remove the read-only flag from TarRevisions and handle setting the current head 
revision through the regular setHead method (ReadOnlyStore)

Modified:
    
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/TarRevisions.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java

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=1747742&r1=1747741&r2=1747742&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
 Fri Jun 10 16:45:10 2016
@@ -95,6 +95,7 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.segment.WriterCacheManager.Empty;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -370,6 +371,32 @@ public class FileStore implements Segmen
         log.debug("TarMK readers {}", this.readers);
     }
 
+    FileStore bind(TarRevisions revisions) throws IOException {
+        revisions.bind(this, initialNode());
+        return this;
+    }
+
+    @Nonnull
+    private Supplier<RecordId> initialNode() {
+        return new Supplier<RecordId>() {
+            @Override
+            public RecordId get() {
+                try {
+                    SegmentWriter writer = 
segmentWriterBuilder("init").build(FileStore.this);
+                    NodeBuilder builder = EMPTY_NODE.builder();
+                    builder.setChildNode("root", EMPTY_NODE);
+                    SegmentNodeState node = 
writer.writeNode(builder.getNodeState());
+                    writer.flush();
+                    return node.getRecordId();
+                } catch (IOException e) {
+                    String msg = "Failed to write initial node";
+                    log.error(msg, e);
+                    throw new IllegalStateException(msg, e);
+                }
+            }
+        };
+    }
+
     private int getGcGeneration() {
         return revisions.getHead().getSegment().getGcGeneration();
     }
@@ -1304,15 +1331,6 @@ public class FileStore implements Segmen
         return emptyMap();
     }
 
-    private void setRevision(String rootRevision) {
-        fileStoreLock.writeLock().lock();
-        try {
-            revisions.setHeadId(RecordId.fromString(this, rootRevision));
-        } finally {
-            fileStoreLock.writeLock().unlock();
-        }
-    }
-
     private void checkDiskSpace() {
         long repositoryDiskSpace = approximateSize.get();
         long availableDiskSpace = directory.getFreeSpace();
@@ -1339,18 +1357,34 @@ public class FileStore implements Segmen
      * All write methods are no-ops.
      */
     public static class ReadOnlyStore extends FileStore {
+        private RecordId currentHead;
 
         ReadOnlyStore(FileStoreBuilder builder) throws IOException {
             super(builder, true);
         }
 
+        @Override
+        ReadOnlyStore bind(@Nonnull TarRevisions revisions) throws IOException 
{
+            revisions.bind(this, new Supplier<RecordId>() {
+                @Override
+                public RecordId get() {
+                    throw new IllegalStateException("Cannot start readonly 
store from empty journal");
+                }
+            });
+            currentHead = revisions.getHead();
+            return this;
+        }
+
         /**
          * Go to the specified {@code revision}
          *
          * @param revision
          */
         public void setRevision(String revision) {
-            super.setRevision(revision);
+            RecordId newHead = RecordId.fromString(this, revision);
+            if (super.revisions.setHead(currentHead, newHead)) {
+                currentHead = newHead;
+            }
         }
 
         /**

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=1747742&r1=1747741&r2=1747742&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
 Fri Jun 10 16:45:10 2016
@@ -22,8 +22,6 @@ package org.apache.jackrabbit.oak.segmen
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.Collections.singleton;
-import static 
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
-import static 
org.apache.jackrabbit.oak.segment.SegmentWriterBuilder.segmentWriterBuilder;
 import static 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.defaultGCOptions;
 
 import java.io.File;
@@ -33,10 +31,6 @@ import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
 import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import org.apache.jackrabbit.oak.segment.RecordId;
-import org.apache.jackrabbit.oak.segment.SegmentNodeState;
-import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.segment.WriterCacheManager;
 import org.apache.jackrabbit.oak.segment.compaction.LoggingGCMonitor;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
@@ -44,7 +38,6 @@ import org.apache.jackrabbit.oak.segment
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.gc.DelegatingGCMonitor;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -279,9 +272,7 @@ public class FileStoreBuilder {
     public FileStore build() throws IOException {
         directory.mkdir();
         revisions = new TarRevisions(false, directory);
-        FileStore store = new FileStore(this, false);
-        revisions.bind(store, initialNode(store));
-        return store;
+        return new FileStore(this, false).bind(revisions);
     }
 
     /**
@@ -305,30 +296,7 @@ public class FileStoreBuilder {
     public ReadOnlyStore buildReadOnly() throws IOException {
         checkState(directory.exists() && directory.isDirectory());
         revisions = new TarRevisions(true, directory);
-        ReadOnlyStore store = new ReadOnlyStore(this);
-        revisions.bind(store, initialNode(store));
-        return store;
-    }
-
-    @Nonnull
-    private static Supplier<RecordId> initialNode(final FileStore store) {
-        return new Supplier<RecordId>() {
-            @Override
-            public RecordId get() {
-                try {
-                    SegmentWriter writer = 
segmentWriterBuilder("init").build(store);
-                    NodeBuilder builder = EMPTY_NODE.builder();
-                    builder.setChildNode("root", EMPTY_NODE);
-                    SegmentNodeState node = 
writer.writeNode(builder.getNodeState());
-                    writer.flush();
-                    return node.getRecordId();
-                } catch (IOException e) {
-                    String msg = "Failed to write initial node";
-                    LOG.error(msg, e);
-                    throw new IllegalStateException(msg, e);
-                }
-            }
-        };
+        return new ReadOnlyStore(this).bind(revisions);
     }
 
     @Nonnull

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java?rev=1747742&r1=1747741&r2=1747742&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TarRevisions.java
 Fri Jun 10 16:45:10 2016
@@ -55,8 +55,6 @@ public class TarRevisions implements Rev
 
     public static final String JOURNAL_FILE_NAME = "journal.log";
 
-    private final boolean readOnly;
-
     /**
      * The latest head state.
      */
@@ -110,7 +108,6 @@ public class TarRevisions implements Rev
 
     public TarRevisions(boolean readOnly, @Nonnull File directory)
     throws IOException {
-        this.readOnly = readOnly;
         this.directory = checkNotNull(directory);
         this.journalFile = new RandomAccessFile(new File(directory, 
JOURNAL_FILE_NAME),
                 readOnly ? "r" : "rw");
@@ -240,10 +237,4 @@ public class TarRevisions implements Rev
     public void close() throws IOException {
         journalFile.close();
     }
-
-    void setHeadId(@Nonnull RecordId headId) {
-        checkState(readOnly, "Cannot set revision on a writable store");
-        head.set(headId);
-        persistedHead.set(headId);
-    }
 }

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java?rev=1747742&r1=1747741&r2=1747742&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
 Fri Jun 10 16:45:10 2016
@@ -225,4 +225,27 @@ public class FileStoreIT {
         }
     }
 
+    @Test
+    public void setRevisionTest() throws IOException {
+        try (FileStore store = fileStoreBuilder(getFileStoreFolder()).build()) 
{
+            RecordId id1 = store.getRevisions().getHead();
+            SegmentNodeState base = store.getReader().readHeadState();
+            SegmentNodeBuilder builder = base.builder();
+            builder.setProperty("step", "a");
+            store.getRevisions().setHead(base.getRecordId(), 
builder.getNodeState().getRecordId());
+            RecordId id2 = store.getRevisions().getHead();
+            store.flush();
+
+            try (ReadOnlyStore roStore = 
fileStoreBuilder(getFileStoreFolder()).buildReadOnly()) {
+                assertEquals(id2, roStore.getRevisions().getHead());
+
+                roStore.setRevision(id1.toString());
+                assertEquals(id1, roStore.getRevisions().getHead());
+
+                roStore.setRevision(id2.toString());
+                assertEquals(id2, roStore.getRevisions().getHead());
+            }
+        }
+    }
+
 }


Reply via email to