Author: alexparvulescu Date: Thu Jun 9 14:15:27 2016 New Revision: 1747554
URL: http://svn.apache.org/viewvc?rev=1747554&view=rev Log: OAK-4447 RepositorySidegrade: oak-segment to oak-segment-tar migrate without external datastore Added: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java (with props) jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreFactory.java (with props) jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreTest.java (with props) Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java Added: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java?rev=1747554&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java (added) +++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java Thu Jun 9 14:15:27 2016 @@ -0,0 +1,68 @@ +/* + * 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.upgrade.cli.blob; + +import java.io.IOException; +import java.io.InputStream; + +import org.apache.jackrabbit.oak.spi.blob.BlobStore; + +/** + * Utility BlobStore implementation to be used in tooling that can work with a + * FileStore without the need of the DataStore being present locally + */ +public class MissingBlobStore implements BlobStore { + + @Override + public String writeBlob(InputStream in) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public int readBlob(String blobId, long pos, byte[] buff, int off, + int length) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public long getBlobLength(String blobId) throws IOException { + // best effort length extraction + int indexOfSep = blobId.lastIndexOf("#"); + if (indexOfSep != -1) { + return Long.valueOf(blobId.substring(indexOfSep + 1)); + } + return -1; + } + + @Override + public InputStream getInputStream(String blobId) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public String getBlobId(String reference) { + return reference; + } + + @Override + public String getReference(String blobId) { + return blobId; + } +} Propchange: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStore.java ------------------------------------------------------------------------------ svn:eol-style = native Added: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreFactory.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreFactory.java?rev=1747554&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreFactory.java (added) +++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreFactory.java Thu Jun 9 14:15:27 2016 @@ -0,0 +1,34 @@ +/* + * 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.upgrade.cli.blob; + +import org.apache.jackrabbit.oak.spi.blob.BlobStore; + +import com.google.common.io.Closer; + +public class MissingBlobStoreFactory implements BlobStoreFactory { + + @Override + public BlobStore create(Closer closer) { + return new MissingBlobStore(); + } + + @Override + public String toString() { + return "MissingBlobStore"; + } +} Propchange: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java?rev=1747554&r1=1747553&r2=1747554&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java (original) +++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/OptionParserFactory.java Thu Jun 9 14:15:27 2016 @@ -57,6 +57,8 @@ public class OptionParserFactory { public static final String DST_S3 = "s3datastore"; public static final String DST_S3_CONFIG = "s3config"; + + public static final String MISSING_BLOBSTORE = "missingblobstore"; public static final String COPY_VERSIONS = "copy-versions"; @@ -101,6 +103,7 @@ public class OptionParserFactory { op.accepts(DST_S3, "Datastore directory to be used for the target S3").withRequiredArg().ofType(String.class); op.accepts(DST_S3_CONFIG, "Configuration file for the target S3DataStore").withRequiredArg() .ofType(String.class); + op.accepts(MISSING_BLOBSTORE, "Try to upgrade the NodeStore without access to the external Datastore"); } private static void addRdbOptions(OptionParser op) { Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java?rev=1747554&r1=1747553&r2=1747554&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java (original) +++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/parser/StoreArguments.java Thu Jun 9 14:15:27 2016 @@ -27,6 +27,7 @@ import org.apache.jackrabbit.oak.upgrade import org.apache.jackrabbit.oak.upgrade.cli.blob.DummyBlobStoreFactory; import org.apache.jackrabbit.oak.upgrade.cli.blob.FileBlobStoreFactory; import org.apache.jackrabbit.oak.upgrade.cli.blob.FileDataStoreFactory; +import org.apache.jackrabbit.oak.upgrade.cli.blob.MissingBlobStoreFactory; import org.apache.jackrabbit.oak.upgrade.cli.blob.S3DataStoreFactory; import org.apache.jackrabbit.oak.upgrade.cli.node.StoreFactory; import org.slf4j.Logger; @@ -40,6 +41,7 @@ import static org.apache.jackrabbit.oak. import static org.apache.jackrabbit.oak.upgrade.cli.parser.OptionParserFactory.DST_FDS; import static org.apache.jackrabbit.oak.upgrade.cli.parser.OptionParserFactory.DST_S3; import static org.apache.jackrabbit.oak.upgrade.cli.parser.OptionParserFactory.DST_S3_CONFIG; +import static org.apache.jackrabbit.oak.upgrade.cli.parser.OptionParserFactory.MISSING_BLOBSTORE; import static org.apache.jackrabbit.oak.upgrade.cli.parser.StoreType.JCR2_DIR; import static org.apache.jackrabbit.oak.upgrade.cli.parser.StoreType.JCR2_DIR_XML; @@ -96,6 +98,8 @@ public class StoreArguments { factory = new S3DataStoreFactory(parser.getOption(SRC_S3_CONFIG), parser.getOption(SRC_S3)); } else if (parser.hasOption(SRC_FDS)) { factory = new FileDataStoreFactory(parser.getOption(SRC_FDS)); + } else if (parser.hasOption(MISSING_BLOBSTORE)) { + factory = new MissingBlobStoreFactory(); } else { factory = new DummyBlobStoreFactory(); } @@ -111,6 +115,8 @@ public class StoreArguments { factory = new S3DataStoreFactory(parser.getOption(DST_S3_CONFIG), parser.getOption(DST_S3)); } else if (parser.hasOption(DST_FDS)) { factory = new FileDataStoreFactory(parser.getOption(DST_FDS)); + } else if (parser.hasOption(MISSING_BLOBSTORE)) { + factory = new MissingBlobStoreFactory(); } else { factory = new DummyBlobStoreFactory(); } Added: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreTest.java?rev=1747554&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreTest.java (added) +++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreTest.java Thu Jun 9 14:15:27 2016 @@ -0,0 +1,95 @@ +/* + * 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.upgrade.cli.blob; + +import org.apache.jackrabbit.oak.upgrade.cli.AbstractOak2OakTest; +import org.apache.jackrabbit.oak.upgrade.cli.container.BlobStoreContainer; +import org.apache.jackrabbit.oak.upgrade.cli.container.FileDataStoreContainer; +import org.apache.jackrabbit.oak.upgrade.cli.container.MongoNodeStoreContainer; +import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer; +import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer; +import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentTarNodeStoreContainer; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@RunWith(Parameterized.class) +public class MissingBlobStoreTest extends AbstractOak2OakTest { + + private static final Logger log = LoggerFactory.getLogger(MissingBlobStoreTest.class); + + @Parameterized.Parameters(name = "{0}") + public static Collection<Object[]> data() { + List<Object[]> params = new ArrayList<Object[]>(); + BlobStoreContainer blob; + + blob = new FileDataStoreContainer(); + params.add(new Object[] { "Segment -> Segment (FDS)", new SegmentNodeStoreContainer(blob), new SegmentNodeStoreContainer(blob), true }); + params.add(new Object[] { "Segment -> SegmentTar (FDS)", new SegmentNodeStoreContainer(blob), new SegmentTarNodeStoreContainer(blob), true }); + params.add(new Object[] { "SegmentTar -> Segment (FDS)", new SegmentTarNodeStoreContainer(blob), new SegmentNodeStoreContainer(blob), true }); + params.add(new Object[] { "SegmentTar -> SegmentTar (FDS)", new SegmentTarNodeStoreContainer(blob), new SegmentTarNodeStoreContainer(blob), true }); + try { + params.add(new Object[] { "Mongo -> Mongo (FDS)", new MongoNodeStoreContainer(blob), new MongoNodeStoreContainer(blob), false }); + // params.add(new Object[] { "Segment -> Mongo (FDS)", new SegmentNodeStoreContainer(blob), new MongoNodeStoreContainer(blob), false }); + // params.add(new Object[] { "SegmentTar -> Mongo (FDS)", new SegmentTarNodeStoreContainer(blob), new MongoNodeStoreContainer(blob), false }); + params.add(new Object[] { "Mongo -> Segment (FDS)", new MongoNodeStoreContainer(blob), new SegmentNodeStoreContainer(blob), false }); + } catch (IOException e) { + log.error("Can't create Mongo -> Mongo case", e); + } + + // blob = new FileBlobStoreContainer(); + // params.add(new Object[] { "SegmentTar -> SegmentTar (FBS)", new SegmentTarNodeStoreContainer(blob), new SegmentTarNodeStoreContainer(blob), true }); + return params; + } + + private final NodeStoreContainer source; + + private final NodeStoreContainer destination; + + private final boolean supportsCheckpoint; + + public MissingBlobStoreTest(String name, NodeStoreContainer source, NodeStoreContainer destination, boolean supportsCheckpoint) { + this.source = source; + this.destination = destination; + this.supportsCheckpoint = supportsCheckpoint; + } + + @Override + protected NodeStoreContainer getSourceContainer() { + return source; + } + + @Override + protected NodeStoreContainer getDestinationContainer() { + return destination; + } + + @Override + protected String[] getArgs() { + return new String[] { "--missingblobstore", source.getDescription(), destination.getDescription() }; + } + + protected boolean supportsCheckpointMigration() { + return supportsCheckpoint; + } +} Propchange: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/MissingBlobStoreTest.java ------------------------------------------------------------------------------ svn:eol-style = native
