diff --git a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentFactory.java b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentFactory.java index 94aeb49..78bb638 100644 --- a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentFactory.java +++ b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentFactory.java @@ -43,11 +43,18 @@ public class SegmentFactory implements NodeStoreFactory { public SegmentFactory(String directory, boolean mmap) { this.dir = new File(directory); this.mmap = mmap; + createDirectoryIfMissing(dir); if (!dir.isDirectory()) { throw new IllegalArgumentException("Not a directory: " + dir.getPath()); } } + private void createDirectoryIfMissing(File directory) { + if (!directory.exists()) { + directory.mkdirs(); + } + } + @Override public NodeStore create(BlobStore blobStore, Closer closer) throws IOException { Builder builder = FileStore.builder(new File(dir, "segmentstore")); diff --git a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java index c96f37b..c75da87 100644 --- a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java +++ b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/SegmentTarFactory.java @@ -43,11 +43,18 @@ public class SegmentTarFactory implements NodeStoreFactory { public SegmentTarFactory(String directory, boolean mmap) { this.dir = new File(directory); this.mmap = mmap; + createDirectoryIfMissing(dir); if (!dir.isDirectory()) { throw new IllegalArgumentException("Not a directory: " + dir.getPath()); } } + private void createDirectoryIfMissing(File directory) { + if (!directory.exists()) { + directory.mkdirs(); + } + } + @Override public NodeStore create(BlobStore blobStore, Closer closer) throws IOException { final FileStoreBuilder builder = fileStoreBuilder(new File(dir, "segmentstore")); diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeOldSegmentTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeOldSegmentTest.java index 79870b0..0359337 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeOldSegmentTest.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/UpgradeOldSegmentTest.java @@ -56,7 +56,6 @@ public class UpgradeOldSegmentTest { File oldRepo = new File(testFolder, "test-repo-1.0"); File newRepo = new File(testFolder, "test-repo-new"); oldRepo.mkdirs(); - newRepo.mkdirs(); try (InputStream in = UpgradeOldSegmentTest.class.getResourceAsStream("/test-repo-1.0.zip")) { Util.unzip(in, oldRepo); } diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarWithMissingDestinationDirectoryTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarWithMissingDestinationDirectoryTest.java new file mode 100644 index 0000000..465b355 --- /dev/null +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarWithMissingDestinationDirectoryTest.java @@ -0,0 +1,59 @@ +/* + * 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; + +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; + +public class SegmentToSegmentTarWithMissingDestinationDirectoryTest extends AbstractOak2OakTest { + + private final NodeStoreContainer source; + + private final NodeStoreContainer destination; + + public SegmentToSegmentTarWithMissingDestinationDirectoryTest() { + source = new SegmentNodeStoreContainer(); + destination = getSegmentTarNodeStoreContainerWithMissingDirectory(); + } + + private SegmentTarNodeStoreContainer getSegmentTarNodeStoreContainerWithMissingDirectory() { + SegmentTarNodeStoreContainer segmentTarNodeStoreContainer = new SegmentTarNodeStoreContainer(); + segmentTarNodeStoreContainer.getDirectory().delete(); + return segmentTarNodeStoreContainer; + } + + @Override + protected NodeStoreContainer getSourceContainer() { + return source; + } + + @Override + protected NodeStoreContainer getDestinationContainer() { + return destination; + } + + @Override + protected String[] getArgs() { + return new String[] { source.getDescription(), destination.getDescription() }; + } + + @Override + protected boolean supportsCheckpointMigration() { + return true; + } +} diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentWithMissingDestinationDirectoryTest.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentWithMissingDestinationDirectoryTest.java new file mode 100644 index 0000000..567c97b --- /dev/null +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentWithMissingDestinationDirectoryTest.java @@ -0,0 +1,58 @@ +/* + * 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; + +import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer; +import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer; + +public class SegmentToSegmentWithMissingDestinationDirectoryTest extends AbstractOak2OakTest { + private final NodeStoreContainer source; + + private final NodeStoreContainer destination; + + public SegmentToSegmentWithMissingDestinationDirectoryTest() { + source = new SegmentNodeStoreContainer(); + destination = getSegmentNodeStoreContainerWithMissingDirectory(); + } + + private SegmentNodeStoreContainer getSegmentNodeStoreContainerWithMissingDirectory() { + SegmentNodeStoreContainer segmentNodeStoreContainer = new SegmentNodeStoreContainer(); + segmentNodeStoreContainer.getDirectory().delete(); + return segmentNodeStoreContainer; + } + + @Override + protected NodeStoreContainer getSourceContainer() { + return source; + } + + @Override + protected NodeStoreContainer getDestinationContainer() { + return destination; + } + + @Override + protected String[] getArgs() { + return new String[] { source.getDescription(), destination.getDescription() }; + } + + @Override + protected boolean supportsCheckpointMigration() { + return true; + } + +} diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentNodeStoreContainer.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentNodeStoreContainer.java index a2a4ee2..6731cd3 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentNodeStoreContainer.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentNodeStoreContainer.java @@ -78,4 +78,8 @@ public class SegmentNodeStoreContainer implements NodeStoreContainer { return SEGMENT_OLD_PREFIX + directory.getPath(); } + public File getDirectory() { + return directory; + } + } diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java index 4993f5a..43fc25a 100644 --- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java +++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/SegmentTarNodeStoreContainer.java @@ -78,4 +78,8 @@ public class SegmentTarNodeStoreContainer implements NodeStoreContainer { return directory.getPath(); } + public File getDirectory() { + return directory; + } + }