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();
}