Author: tomekr
Date: Thu Nov 24 10:09:05 2016
New Revision: 1771104

URL: http://svn.apache.org/viewvc?rev=1771104&view=rev
Log:
OAK-5157: Source repository should be opened in read-only mode for sidegrade

Modified:
    
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/JdbcFactory.java
    
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/MongoFactory.java
    
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentFactory.java
    
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java
    
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java
    
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/JdbcNodeStoreContainer.java
    
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/MongoNodeStoreContainer.java

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/JdbcFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/JdbcFactory.java?rev=1771104&r1=1771103&r2=1771104&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/JdbcFactory.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/JdbcFactory.java
 Thu Nov 24 10:09:05 2016
@@ -43,7 +43,9 @@ public class JdbcFactory implements Node
 
     private final String password;
 
-    public JdbcFactory(String jdbcUri, int cacheSize, String user, String 
password) {
+    private final boolean readOnly;
+
+    public JdbcFactory(String jdbcUri, int cacheSize, String user, String 
password, boolean readOnly) {
         this.jdbcUri = jdbcUri;
         this.cacheSize = cacheSize;
         if (user == null || password == null) {
@@ -51,6 +53,7 @@ public class JdbcFactory implements Node
         }
         this.user = user;
         this.password = password;
+        this.readOnly = readOnly;
     }
 
     @Override
@@ -60,6 +63,9 @@ public class JdbcFactory implements Node
             builder.setBlobStore(blobStore);
         }
         builder.setRDBConnection(getDataSource(closer));
+        if (readOnly) {
+            builder.setReadOnlyMode();
+        }
         log.info("Initialized DocumentNodeStore on RDB with Cache size : {} 
MB, Fast migration : {}", cacheSize,
                 builder.isDisableBranches());
         DocumentNodeStore documentNodeStore = builder.getNodeStore();

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/MongoFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/MongoFactory.java?rev=1771104&r1=1771103&r2=1771104&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/MongoFactory.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/MongoFactory.java
 Thu Nov 24 10:09:05 2016
@@ -39,9 +39,12 @@ public class MongoFactory implements Nod
 
     private final int cacheSize;
 
-    public MongoFactory(String repoDesc, int cacheSize) {
+    private final boolean readOnly;
+
+    public MongoFactory(String repoDesc, int cacheSize, boolean readOnly) {
         this.uri = new MongoClientURI(repoDesc);
         this.cacheSize = cacheSize;
+        this.readOnly = readOnly;
     }
 
     @Override
@@ -51,6 +54,9 @@ public class MongoFactory implements Nod
         if (blobStore != null) {
             builder.setBlobStore(blobStore);
         }
+        if (readOnly) {
+            builder.setReadOnlyMode();
+        }
         DocumentNodeStore documentNodeStore = builder.getNodeStore();
         closer.register(asCloseable(documentNodeStore));
         return documentNodeStore;

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentFactory.java?rev=1771104&r1=1771103&r2=1771104&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentFactory.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentFactory.java
 Thu Nov 24 10:09:05 2016
@@ -44,9 +44,12 @@ public class SegmentFactory implements N
 
     private final boolean disableMmap;
 
-    public SegmentFactory(String directory, boolean disableMmap) {
+    private final boolean readOnly;
+
+    public SegmentFactory(String directory, boolean disableMmap, boolean 
readOnly) {
         this.dir = new File(directory);
         this.disableMmap = disableMmap;
+        this.readOnly = readOnly;
         createDirectoryIfMissing(dir);
         if (!dir.isDirectory()) {
             throw new IllegalArgumentException("Not a directory: " + 
dir.getPath());
@@ -71,15 +74,19 @@ public class SegmentFactory implements N
         } else {
             builder.withDefaultMemoryMapping();
         }
-        final FileStore fs;
 
+        final FileStore fs;
         try {
-            fs = builder.build();
+            if (readOnly) {
+                fs = builder.buildReadOnly();
+            } else {
+                fs = builder.build();
+            }
         } catch (InvalidFileStoreVersionException e) {
             throw new IllegalStateException(e);
         }
-
         closer.register(asCloseable(fs));
+
         return new TarNodeStore(SegmentNodeStore.builder(fs).build(), new 
TarNodeStore.SuperRootProvider() {
             @Override
             public void setSuperRoot(NodeBuilder builder) {

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java?rev=1771104&r1=1771103&r2=1771104&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java
 Thu Nov 24 10:09:05 2016
@@ -24,7 +24,9 @@ import java.io.File;
 import java.io.IOException;
 
 import com.google.common.io.Closer;
-import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
+import org.apache.jackrabbit.oak.segment.RecordType;
+import org.apache.jackrabbit.oak.segment.Segment;
+import org.apache.jackrabbit.oak.segment.SegmentId;
 import org.apache.jackrabbit.oak.segment.SegmentNodeBuilder;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
@@ -37,17 +39,18 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
-import javax.annotation.Nullable;
-
 public class SegmentTarFactory implements NodeStoreFactory {
 
     private final File dir;
 
     private final boolean disableMmap;
 
-    public SegmentTarFactory(String directory, boolean disableMmap) {
+    private final boolean readOnly;
+
+    public SegmentTarFactory(String directory, boolean disableMmap, boolean 
readOnly) {
         this.dir = new File(directory);
         this.disableMmap = disableMmap;
+        this.readOnly = readOnly;
         createDirectoryIfMissing(dir);
         if (!dir.isDirectory()) {
             throw new IllegalArgumentException("Not a directory: " + 
dir.getPath());
@@ -72,56 +75,51 @@ public class SegmentTarFactory implement
         } else {
             builder.withDefaultMemoryMapping();
         }
-        final FileStore fs;
+
         try {
-            fs = builder.build();
+            if (readOnly) {
+                final ReadOnlyFileStore fs;
+                fs = builder.buildReadOnly();
+                closer.register(asCloseable(fs));
+                return new 
TarNodeStore(SegmentNodeStoreBuilders.builder(fs).build(), new 
SegmentTarSuperRootProvider(fs));
+            } else {
+                final FileStore fs;
+                fs = builder.build();
+                closer.register(asCloseable(fs));
+                return new 
TarNodeStore(SegmentNodeStoreBuilders.builder(fs).build(), new 
SegmentTarSuperRootProvider(fs));
+            }
         } catch (InvalidFileStoreVersionException e) {
             throw new IllegalStateException(e);
         }
-        closer.register(asCloseable(fs));
-
-        return new TarNodeStore(SegmentNodeStoreBuilders.builder(fs).build(), 
new TarNodeStore.SuperRootProvider() {
-            @Override
-            public void setSuperRoot(NodeBuilder builder) {
-                checkArgument(builder instanceof SegmentNodeBuilder);
-                SegmentNodeBuilder segmentBuilder = (SegmentNodeBuilder) 
builder;
-                SegmentNodeState lastRoot = (SegmentNodeState) getSuperRoot();
-
-                if (!lastRoot.getRecordId().equals(((SegmentNodeState) 
segmentBuilder.getBaseState()).getRecordId())) {
-                    throw new IllegalArgumentException("The new head is out of 
date");
-                }
-
-                fs.getRevisions().setHead(lastRoot.getRecordId(), 
segmentBuilder.getNodeState().getRecordId());
-            }
-
-            @Override
-            public NodeState getSuperRoot() {
-                return fs.getHead();
-            }
-        });
     }
 
-
     @Override
     public boolean hasExternalBlobReferences() throws IOException {
         final FileStoreBuilder builder = fileStoreBuilder(new File(dir, 
"segmentstore"));
         builder.withMaxFileSize(256);
         builder.withMemoryMapping(false);
-        final FileStore fs;
+        ReadOnlyFileStore fs;
         try {
-            fs = builder.build();
+            fs = builder.buildReadOnly();
         } catch (InvalidFileStoreVersionException e) {
             throw new IOException(e);
         }
         try {
-            fs.collectBlobReferences(new ReferenceCollector() {
-                @Override
-                public void addReference(String reference, @Nullable String 
nodeId) {
-                    // FIXME the collector should allow to stop processing
-                    // see java.nio.file.FileVisitor
-                    throw new ExternalBlobFound();
+            for (SegmentId id : fs.getSegmentIds()) {
+                if (!id.isDataSegmentId()) {
+                    continue;
                 }
-            });
+                id.getSegment().forEachRecord(new Segment.RecordConsumer() {
+                    @Override
+                    public void consume(int number, RecordType type, int 
offset) {
+                        // FIXME the consumer should allow to stop processing
+                        // see java.nio.file.FileVisitor
+                        if (type == RecordType.BLOB_ID) {
+                            throw new ExternalBlobFound();
+                        }
+                    }
+                });
+            }
             return false;
         } catch (ExternalBlobFound e) {
             return true;
@@ -134,6 +132,15 @@ public class SegmentTarFactory implement
         return dir;
     }
 
+    private static Closeable asCloseable(final ReadOnlyFileStore fs) {
+        return new Closeable() {
+            @Override
+            public void close() throws IOException {
+                fs.close();
+            }
+        };
+    }
+
     private static Closeable asCloseable(final FileStore fs) {
         return new Closeable() {
             @Override
@@ -150,4 +157,41 @@ public class SegmentTarFactory implement
 
     private static class ExternalBlobFound extends RuntimeException {
     }
+
+    private static class SegmentTarSuperRootProvider implements 
TarNodeStore.SuperRootProvider {
+
+        private final ReadOnlyFileStore readOnlyFileStore;
+
+        private final FileStore fileStore;
+
+        public SegmentTarSuperRootProvider(ReadOnlyFileStore 
readOnlyFileStore) {
+            this.readOnlyFileStore = readOnlyFileStore;
+            this.fileStore = null;
+        }
+
+        public SegmentTarSuperRootProvider(FileStore fileStore) {
+            this.readOnlyFileStore = null;
+            this.fileStore = fileStore;
+        }
+
+        @Override
+        public void setSuperRoot(NodeBuilder builder) {
+            if (fileStore == null) {
+                throw new IllegalStateException("setSuperRoot is not supported 
for read-only segment-tar");
+            }
+            checkArgument(builder instanceof SegmentNodeBuilder);
+            SegmentNodeBuilder segmentBuilder = (SegmentNodeBuilder) builder;
+            SegmentNodeState lastRoot = (SegmentNodeState) getSuperRoot();
+
+            if (!lastRoot.getRecordId().equals(((SegmentNodeState) 
segmentBuilder.getBaseState()).getRecordId())) {
+                throw new IllegalArgumentException("The new head is out of 
date");
+            }
+            fileStore.getRevisions().setHead(lastRoot.getRecordId(), 
segmentBuilder.getNodeState().getRecordId());
+        }
+
+        @Override
+        public NodeState getSuperRoot() {
+            return fileStore == null ? readOnlyFileStore.getHead() : 
fileStore.getHead();
+        }
+    }
 }

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java?rev=1771104&r1=1771103&r2=1771104&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreType.java
 Thu Nov 24 10:09:05 2016
@@ -95,7 +95,7 @@ public enum StoreType {
                 password = migrationOptions.getDstPassword();
             }
             return new StoreFactory(
-                    new JdbcFactory(paths[0], 
migrationOptions.getCacheSizeInMB(), username, password));
+                    new JdbcFactory(paths[0], 
migrationOptions.getCacheSizeInMB(), username, password, direction == 
MigrationDirection.SRC));
         }
 
         @Override
@@ -111,7 +111,7 @@ public enum StoreType {
 
         @Override
         public StoreFactory createFactory(String[] paths, MigrationDirection 
direction, MigrationOptions migrationOptions) {
-            return new StoreFactory(new MongoFactory(paths[0], 
migrationOptions.getCacheSizeInMB()));
+            return new StoreFactory(new MongoFactory(paths[0], 
migrationOptions.getCacheSizeInMB(), direction == MigrationDirection.SRC));
         }
 
         @Override
@@ -128,7 +128,7 @@ public enum StoreType {
         @Override
         public StoreFactory createFactory(String[] paths, MigrationDirection 
direction, MigrationOptions migrationOptions) {
             String path = removeStart(paths[0], SEGMENT_OLD_PREFIX);
-            return new StoreFactory(new SegmentFactory(path, 
migrationOptions.isDisableMmap()));
+            return new StoreFactory(new SegmentFactory(path, 
migrationOptions.isDisableMmap(), direction == MigrationDirection.SRC));
         }
 
         @Override
@@ -144,7 +144,7 @@ public enum StoreType {
 
         @Override
         public StoreFactory createFactory(String[] paths, MigrationDirection 
direction, MigrationOptions migrationOptions) {
-            return new StoreFactory(new SegmentTarFactory(paths[0], 
migrationOptions.isDisableMmap()));
+            return new StoreFactory(new SegmentTarFactory(paths[0], 
migrationOptions.isDisableMmap(), direction == MigrationDirection.SRC));
         }
 
         @Override

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/JdbcNodeStoreContainer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/JdbcNodeStoreContainer.java?rev=1771104&r1=1771103&r2=1771104&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/JdbcNodeStoreContainer.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/JdbcNodeStoreContainer.java
 Thu Nov 24 10:09:05 2016
@@ -53,7 +53,7 @@ public class JdbcNodeStoreContainer impl
         this.blob = blob;
         this.h2Dir = Files.createTempDirectory(Paths.get("target"), 
"repo-h2").toFile();
         this.jdbcUri = String.format("jdbc:h2:%s", h2Dir.getAbsolutePath() + 
"/JdbcNodeStoreContainer");
-        this.jdbcFactory = new JdbcFactory(jdbcUri, 2, "sa", "sa");
+        this.jdbcFactory = new JdbcFactory(jdbcUri, 2, "sa", "sa", false);
     }
 
     @Override

Modified: 
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/MongoNodeStoreContainer.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/MongoNodeStoreContainer.java?rev=1771104&r1=1771103&r2=1771104&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/MongoNodeStoreContainer.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/MongoNodeStoreContainer.java
 Thu Nov 24 10:09:05 2016
@@ -56,7 +56,7 @@ public class MongoNodeStoreContainer imp
     public MongoNodeStoreContainer(BlobStoreContainer blob) throws IOException 
{
         Assume.assumeTrue(isMongoAvailable());
         this.mongoUri = String.format("%s-%d", MONGO_URI, 
DATABASE_SUFFIX.getAndIncrement());
-        this.mongoFactory = new MongoFactory(mongoUri, 2);
+        this.mongoFactory = new MongoFactory(mongoUri, 2, false);
         this.blob = blob;
         clean();
     }


Reply via email to