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 md...@apache.org on 2016/10/25 15:53:12 UTC

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

Author: mduerig
Date: Tue Oct 25 15:53:11 2016
New Revision: 1766548

URL: http://svn.apache.org/viewvc?rev=1766548&view=rev
Log:
OAK-5002: NPE when creating read only store
Introduce a segment writer that throws an exception when written to

Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java
    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/ReadOnlyFileStore.java
    jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ReadOnlyStoreTest.java

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java?rev=1766548&r1=1766547&r2=1766548&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterBuilder.java Tue Oct 25 15:53:11 2016
@@ -21,12 +21,15 @@ package org.apache.jackrabbit.oak.segmen
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import java.io.IOException;
+
 import javax.annotation.Nonnull;
 
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
 import org.apache.jackrabbit.oak.segment.WriterCacheManager.Empty;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
+import org.apache.jackrabbit.oak.segment.file.ReadOnlyFileStore;
 import org.apache.jackrabbit.oak.segment.http.HttpStore;
 import org.apache.jackrabbit.oak.segment.memory.MemoryStore;
 
@@ -153,6 +156,32 @@ public final class SegmentWriterBuilder
     }
 
     /**
+     * Build a {@code SegmentWriter} for a {@code ReadOnlyFileStore}.
+     * Attempting to write to the returned writer will cause a
+     * {@code UnsupportedOperationException} to be thrown.
+     */
+    @Nonnull
+    public SegmentWriter build(@Nonnull ReadOnlyFileStore store) {
+        return new SegmentWriter(
+                checkNotNull(store),
+                store.getReader(),
+                store.getBlobStore(),
+                cacheManager,
+                new WriteOperationHandler() {
+                    @Nonnull
+                    @Override
+                    public RecordId execute(@Nonnull WriteOperation writeOperation) throws IOException {
+                        throw new UnsupportedOperationException("Cannot write to read-only store");
+                    }
+
+                    @Override
+                    public void flush() throws IOException {
+                        throw new UnsupportedOperationException("Cannot write to read-only store");
+                    }
+                });
+    }
+
+    /**
      * Build a {@code SegmentWriter} for a {@code MemoryStore}.
      */
     @Nonnull

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=1766548&r1=1766547&r2=1766548&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 Tue Oct 25 15:53:11 2016
@@ -265,6 +265,7 @@ public abstract class AbstractFileStore
         return tracker;
     }
 
+    @Nonnull
     public abstract SegmentWriter getWriter();
 
     @Nonnull

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=1766548&r1=1766547&r2=1766548&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 Tue Oct 25 15:53:11 2016
@@ -24,6 +24,7 @@ import static com.google.common.collect.
 import static com.google.common.collect.Maps.newHashMap;
 import static com.google.common.collect.Sets.newHashSet;
 import static java.util.Collections.emptyMap;
+import static org.apache.jackrabbit.oak.segment.SegmentWriterBuilder.segmentWriterBuilder;
 
 import java.io.File;
 import java.io.IOException;
@@ -61,6 +62,9 @@ public class ReadOnlyFileStore extends A
 
     private final List<TarReader> readers;
 
+    @Nonnull
+    private final SegmentWriter writer;
+
     private ReadOnlyRevisions revisions;
 
     private RecordId currentHead;
@@ -84,6 +88,8 @@ public class ReadOnlyFileStore extends A
             boolean recover = i == indices.length - 1;
             readers.add(TarReader.openRO(map.get(indices[i]), memoryMapping, recover, recovery));
         }
+
+        writer = segmentWriterBuilder("read-only").withoutCache().build(this);
         log.info("TarMK ReadOnly opened: {} (mmap={})", directory,
                 memoryMapping);
     }
@@ -209,9 +215,10 @@ public class ReadOnlyFileStore extends A
         log.info("TarMK closed: {}", directory);
     }
 
+    @Nonnull
     @Override
     public SegmentWriter getWriter() {
-        return null;
+        return writer;
     }
 
     public Map<String, Set<UUID>> getTarReaderIndex() {

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ReadOnlyStoreTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ReadOnlyStoreTest.java?rev=1766548&r1=1766547&r2=1766548&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ReadOnlyStoreTest.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ReadOnlyStoreTest.java Tue Oct 25 15:53:11 2016
@@ -19,16 +19,21 @@
 package org.apache.jackrabbit.oak.segment;
 
 import static org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
+import static org.junit.Assert.assertEquals;
 
 import java.io.File;
 import java.io.IOException;
 
+import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
 import org.apache.jackrabbit.oak.segment.file.ReadOnlyFileStore;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
@@ -38,12 +43,14 @@ public class ReadOnlyStoreTest {
     public TemporaryFolder folder = new TemporaryFolder(new File("target"));
 
     private ReadOnlyFileStore fileStore;
+    private SegmentNodeStore store;
 
     @Before
     public void setup() throws IOException, InvalidFileStoreVersionException {
         File path = folder.getRoot();
         initStoreAt(path);
         fileStore = fileStoreBuilder(path).buildReadOnly();
+        store = SegmentNodeStoreBuilders.builder(fileStore).build();
     }
 
     private static void initStoreAt(File path) throws InvalidFileStoreVersionException, IOException {
@@ -57,8 +64,16 @@ public class ReadOnlyStoreTest {
     }
 
     @Test
-    @Ignore("OAK-5002")  // FIXME OAK-5002
-    public void createStore() {
-        SegmentNodeStoreBuilders.builder(fileStore).build();
+    public void getRoot() {
+        NodeState root = store.getRoot();
+        assertEquals(0, root.getChildNodeCount(1));
     }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void setRoot() throws CommitFailedException {
+        NodeBuilder root = store.getRoot().builder();
+        root.setChildNode("foo");
+        store.merge(root, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+    }
+
 }