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 to...@apache.org on 2016/06/07 15:11:54 UTC
svn commit: r1747251 - in /jackrabbit/oak/trunk/oak-upgrade/src:
main/java/org/apache/jackrabbit/oak/upgrade/
main/java/org/apache/jackrabbit/oak/upgrade/cli/node/
test/java/org/apache/jackrabbit/oak/upgrade/
test/java/org/apache/jackrabbit/oak/upgrade...
Author: tomekr
Date: Tue Jun 7 15:11:54 2016
New Revision: 1747251
URL: http://svn.apache.org/viewvc?rev=1747251&view=rev
Log:
OAK-4420: segment to segment-tar should migrate checkpoint info
Added:
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/TarNodeStore.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentTarToSegmentTest.java
- copied, changed from r1747246, jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarTest.java
Modified:
jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.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/test/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegradeTest.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarTest.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTest.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/CopyReferencesTest.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToFbsTest.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToFdsTest.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FdsToFbsTest.java
jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java
Modified: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.java Tue Jun 7 15:11:54 2016
@@ -18,23 +18,29 @@ package org.apache.jackrabbit.oak.upgrad
import java.util.ArrayList;
import java.util.Calendar;
+import java.util.Comparator;
import java.util.List;
import java.util.Set;
import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import javax.jcr.RepositoryException;
+import com.google.common.base.Function;
import org.apache.jackrabbit.oak.Oak;
import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent;
import org.apache.jackrabbit.oak.spi.commit.CommitHook;
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
import org.apache.jackrabbit.oak.spi.commit.EditorHook;
import org.apache.jackrabbit.oak.spi.lifecycle.RepositoryInitializer;
+import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
import org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.LoggingCompositeHook;
+import org.apache.jackrabbit.oak.upgrade.cli.node.TarNodeStore;
import org.apache.jackrabbit.oak.upgrade.nodestate.NameFilteringNodeState;
import org.apache.jackrabbit.oak.upgrade.nodestate.report.LoggingReporter;
import org.apache.jackrabbit.oak.upgrade.nodestate.report.ReportingNodeState;
@@ -47,7 +53,10 @@ import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.ImmutableSet.copyOf;
import static com.google.common.collect.ImmutableSet.of;
+import static com.google.common.collect.Lists.newArrayList;
+import static com.google.common.collect.Lists.transform;
import static com.google.common.collect.Sets.union;
+import static java.util.Collections.sort;
import static org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.DEFAULT_EXCLUDE_PATHS;
import static org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.DEFAULT_INCLUDE_PATHS;
import static org.apache.jackrabbit.oak.upgrade.RepositoryUpgrade.DEFAULT_MERGE_PATHS;
@@ -256,14 +265,19 @@ public class RepositorySidegrade {
}
private void removeCheckpointReferences(NodeBuilder builder) throws CommitFailedException {
- // removing references to the checkpoints,
+ // removing references to the checkpoints,
// which don't exist in the new repository
builder.setChildNode(":async");
}
private void copyState(NodeState sourceRoot, NodeBuilder targetRoot) throws CommitFailedException {
copyWorkspace(sourceRoot, targetRoot);
- removeCheckpointReferences(targetRoot);
+
+ if (!copyCheckpoints(targetRoot)) {
+ LOG.info("Copying checkpoints is not supported for this combination of node stores");
+ removeCheckpointReferences(targetRoot);
+ }
+
if (!versionCopyConfiguration.skipOrphanedVersionsCopy()) {
copyVersionStorage(sourceRoot, targetRoot, versionCopyConfiguration);
}
@@ -296,4 +310,77 @@ public class RepositorySidegrade {
copyProperties(sourceRoot, targetRoot);
}
}
-}
\ No newline at end of file
+
+ private boolean copyCheckpoints(NodeBuilder targetRoot) {
+ if (!(source instanceof TarNodeStore && target instanceof TarNodeStore)) {
+ return false;
+ }
+
+ TarNodeStore sourceTarNS = (TarNodeStore) source;
+ TarNodeStore targetTarNS = (TarNodeStore) target;
+
+ NodeState srcSuperRoot = sourceTarNS.getSuperRoot();
+ NodeBuilder builder = targetTarNS.getSuperRoot().builder();
+
+ String previousRoot = null;
+ for (String checkpoint : getCheckpointPaths(srcSuperRoot)) {
+ // copy the checkpoint without the root
+ NodeStateCopier.builder()
+ .include(checkpoint)
+ .exclude(checkpoint + "/root")
+ .copy(srcSuperRoot, builder);
+
+ // reference the previousRoot or targetRoot as a new checkpoint root
+ NodeState baseRoot;
+ if (previousRoot == null) {
+ baseRoot = targetRoot.getNodeState();
+ } else {
+ baseRoot = getBuilder(builder, previousRoot).getNodeState();
+ }
+ NodeBuilder targetParent = getBuilder(builder, checkpoint);
+ targetParent.setChildNode("root", baseRoot);
+ previousRoot = checkpoint + "/root";
+
+ // apply diff changes
+ NodeStateCopier.builder()
+ .include(checkpoint + "/root")
+ .copy(srcSuperRoot, builder);
+ }
+
+ targetTarNS.setSuperRoot(builder);
+ return true;
+ }
+
+ /**
+ * Return all checkpoint paths, sorted by their "created" property, descending.
+ *
+ * @param superRoot
+ * @return
+ */
+ private static List<String> getCheckpointPaths(NodeState superRoot) {
+ List<ChildNodeEntry> checkpoints = newArrayList(superRoot.getChildNode("checkpoints").getChildNodeEntries().iterator());
+ sort(checkpoints, new Comparator<ChildNodeEntry>() {
+ @Override
+ public int compare(ChildNodeEntry o1, ChildNodeEntry o2) {
+ long c1 = o1.getNodeState().getLong("created");
+ long c2 = o1.getNodeState().getLong("created");
+ return -Long.compare(c1, c2);
+ }
+ });
+ return transform(checkpoints, new Function<ChildNodeEntry, String>() {
+ @Nullable
+ @Override
+ public String apply(@Nullable ChildNodeEntry input) {
+ return "/checkpoints/" + input.getName();
+ }
+ });
+ }
+
+ private static NodeBuilder getBuilder(NodeBuilder root, String path) {
+ NodeBuilder builder = root;
+ for (String element : PathUtils.elements(path)) {
+ builder = builder.child(element);
+ }
+ return builder;
+ }
+}
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=1747251&r1=1747250&r2=1747251&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 Tue Jun 7 15:11:54 2016
@@ -20,14 +20,20 @@ import java.io.Closeable;
import java.io.File;
import java.io.IOException;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeBuilder;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState;
import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeStore;
import org.apache.jackrabbit.oak.plugins.segment.file.FileStore;
import org.apache.jackrabbit.oak.plugins.segment.file.FileStore.Builder;
import org.apache.jackrabbit.oak.spi.blob.BlobStore;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
import com.google.common.io.Closer;
+import static com.google.common.base.Preconditions.checkArgument;
+
public class SegmentFactory implements NodeStoreFactory {
private final File dir;
@@ -49,9 +55,27 @@ public class SegmentFactory implements N
builder.withBlobStore(blobStore);
}
builder.withMaxFileSize(256).withMemoryMapping(mmap);
- FileStore fs = builder.build();
+ final FileStore fs = builder.build();
closer.register(asCloseable(fs));
- return SegmentNodeStore.builder(fs).build();
+ return new TarNodeStore(SegmentNodeStore.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.setHead(lastRoot, ((SegmentNodeBuilder) builder).getNodeState());
+ }
+
+ @Override
+ public NodeState getSuperRoot() {
+ return fs.getHead();
+ }
+ });
}
public File getRepositoryDir() {
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=1747251&r1=1747250&r2=1747251&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 Tue Jun 7 15:11:54 2016
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.oak.upgrade.cli.node;
+import static com.google.common.base.Preconditions.checkArgument;
import static org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
import java.io.Closeable;
@@ -23,10 +24,14 @@ import java.io.File;
import java.io.IOException;
import com.google.common.io.Closer;
+import org.apache.jackrabbit.oak.segment.SegmentNodeBuilder;
+import org.apache.jackrabbit.oak.segment.SegmentNodeState;
import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
import org.apache.jackrabbit.oak.segment.file.FileStore;
import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
import org.apache.jackrabbit.oak.spi.blob.BlobStore;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
public class SegmentTarFactory implements NodeStoreFactory {
@@ -45,14 +50,33 @@ public class SegmentTarFactory implement
@Override
public NodeStore create(BlobStore blobStore, Closer closer) throws IOException {
- FileStoreBuilder builder = fileStoreBuilder(new File(dir, "segmentstore"));
+ final FileStoreBuilder builder = fileStoreBuilder(new File(dir, "segmentstore"));
if (blobStore != null) {
builder.withBlobStore(blobStore);
}
builder.withMaxFileSize(256).withMemoryMapping(mmap);
- FileStore fs = builder.build();
+ final FileStore fs = builder.build();
closer.register(asCloseable(fs));
- return SegmentNodeStoreBuilders.builder(fs).build();
+
+ 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.getReader().readHeadState();
+ }
+ });
}
public File getRepositoryDir() {
Added: jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/TarNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/TarNodeStore.java?rev=1747251&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/TarNodeStore.java (added)
+++ jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/TarNodeStore.java Tue Jun 7 15:11:54 2016
@@ -0,0 +1,120 @@
+/*
+ * 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.node;
+
+import org.apache.jackrabbit.oak.api.Blob;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.spi.commit.CommitHook;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
+import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.apache.jackrabbit.oak.spi.state.NodeStore;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+
+public class TarNodeStore implements NodeStore {
+
+ private final NodeStore ns;
+
+ private final SuperRootProvider superRootProvider;
+
+ public TarNodeStore(NodeStore ns, SuperRootProvider superRootProvider) {
+ this.ns = ns;
+ this.superRootProvider = superRootProvider;
+ }
+
+ public void setSuperRoot(NodeBuilder builder) {
+ superRootProvider.setSuperRoot(builder);
+ }
+
+ public NodeState getSuperRoot() {
+ return superRootProvider.getSuperRoot();
+ }
+
+ @Nonnull
+ @Override
+ public NodeState getRoot() {
+ return ns.getRoot();
+ }
+
+ @Nonnull
+ @Override
+ public NodeState merge(@Nonnull NodeBuilder builder, @Nonnull CommitHook commitHook, @Nonnull CommitInfo info) throws CommitFailedException {
+ return ns.merge(builder, commitHook, info);
+ }
+
+ @Nonnull
+ @Override
+ public NodeState rebase(@Nonnull NodeBuilder builder) {
+ return ns.rebase(builder);
+ }
+
+ @Override
+ public NodeState reset(@Nonnull NodeBuilder builder) {
+ return ns.reset(builder);
+ }
+
+ @Nonnull
+ @Override
+ public Blob createBlob(InputStream inputStream) throws IOException {
+ return ns.createBlob(inputStream);
+ }
+
+ @Override
+ public Blob getBlob(@Nonnull String reference) {
+ return ns.getBlob(reference);
+ }
+
+ @Nonnull
+ @Override
+ public String checkpoint(long lifetime, @Nonnull Map<String, String> properties) {
+ return checkpoint(lifetime, properties);
+ }
+
+ @Nonnull
+ @Override
+ public String checkpoint(long lifetime) {
+ return checkpoint(lifetime);
+ }
+
+ @Nonnull
+ @Override
+ public Map<String, String> checkpointInfo(@Nonnull String checkpoint) {
+ return checkpointInfo(checkpoint);
+ }
+
+ @Override
+ public NodeState retrieve(@Nonnull String checkpoint) {
+ return retrieve(checkpoint);
+ }
+
+ @Override
+ public boolean release(@Nonnull String checkpoint) {
+ return release(checkpoint);
+ }
+
+ interface SuperRootProvider {
+
+ void setSuperRoot(NodeBuilder builder);
+
+ NodeState getSuperRoot();
+
+ }
+}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegradeTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegradeTest.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegradeTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegradeTest.java Tue Jun 7 15:11:54 2016
@@ -61,14 +61,9 @@ import org.apache.jackrabbit.api.Jackrab
import org.apache.jackrabbit.oak.Oak;
import org.apache.jackrabbit.oak.jcr.Jcr;
import org.apache.jackrabbit.oak.plugins.index.IndexConstants;
-import org.apache.jackrabbit.oak.segment.SegmentNodeStore;
import org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
import org.apache.jackrabbit.oak.segment.memory.MemoryStore;
-import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
-import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
import org.apache.jackrabbit.oak.spi.security.user.UserConstants;
-import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
-import org.apache.jackrabbit.oak.spi.state.NodeState;
import org.apache.jackrabbit.oak.spi.state.NodeStore;
import org.junit.Before;
import org.junit.Test;
@@ -100,26 +95,11 @@ public class RepositorySidegradeTest {
public JackrabbitSession createAdminSession() throws RepositoryException {
return (JackrabbitSession) targetRepository.login(CREDENTIALS);
}
-
- // OAK-2869
- private static void setAsync(NodeStore source) throws Exception {
- NodeBuilder builder = source.getRoot().builder();
- builder.child(":async").setProperty("test", "123");
- source.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
- }
-
- // OAK-2869
- @Test
- public void verifyAsync() throws Exception {
- NodeState state = targetNodeStore.getRoot().getChildNode(":async");
- assertFalse(state.hasProperty("test"));
- }
@SuppressWarnings("unchecked")
protected NodeStore createSourceContent() throws Exception {
NodeStore source = SegmentNodeStoreBuilders.builder(new MemoryStore()).build();
- setAsync(source);
-
+
Repository repository = new Jcr(new Oak(source)).createRepository();
Session session = repository.login(CREDENTIALS);
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/AbstractOak2OakTest.java Tue Jun 7 15:11:54 2016
@@ -16,11 +16,15 @@
*/
package org.apache.jackrabbit.oak.upgrade.cli;
+import static java.util.Collections.singletonMap;
+import static junit.framework.Assert.assertFalse;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.util.Map;
import javax.jcr.Node;
import javax.jcr.Property;
@@ -29,10 +33,16 @@ import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.commons.IOUtils;
import org.apache.jackrabbit.oak.jcr.Jcr;
import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl;
import org.apache.jackrabbit.oak.plugins.index.reference.ReferenceIndexProvider;
+import org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState;
+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.apache.jackrabbit.oak.spi.state.NodeStore;
import org.apache.jackrabbit.oak.upgrade.RepositorySidegrade;
import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
@@ -58,6 +68,8 @@ public abstract class AbstractOak2OakTes
private RepositoryImpl repository;
+ private String checkpointReference;
+
protected abstract NodeStoreContainer getSourceContainer();
protected abstract NodeStoreContainer getDestinationContainer();
@@ -103,7 +115,7 @@ public abstract class AbstractOak2OakTes
}
}
- private void initContent(NodeStore target) throws IOException, RepositoryException {
+ private void initContent(NodeStore target) throws IOException, RepositoryException, CommitFailedException {
NodeStore initialContent = testContent.open();
try {
RepositorySidegrade sidegrade = new RepositorySidegrade(initialContent, target);
@@ -111,12 +123,26 @@ public abstract class AbstractOak2OakTes
} finally {
testContent.close();
}
+
+ NodeBuilder builder = target.getRoot().builder();
+ builder.setProperty("checkpoint-state", "before");
+ target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+ checkpointReference = target.checkpoint(60000, singletonMap("key", "123"));
+
+ builder.setProperty("checkpoint-state", "after");
+ builder.child(":async").setProperty("test", "123");
+ target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
}
@Test
public void validateMigration() throws RepositoryException, IOException {
verifyContent(session);
verifyBlob(session);
+ if (supportsCheckpointMigration()) {
+ verifyCheckpoint();
+ } else {
+ verifyEmptyAsync();
+ }
}
static void verifyContent(Session session) throws RepositoryException {
@@ -147,4 +173,46 @@ public abstract class AbstractOak2OakTes
}
}
+ private void verifyCheckpoint() {
+ assertEquals("after", destination.getRoot().getString("checkpoint-state"));
+
+ Map<String, String> info = destination.checkpointInfo(checkpointReference);
+ assertEquals("123", info.get("key"));
+
+ NodeState checkpoint = destination.retrieve(checkpointReference);
+ assertEquals("before", checkpoint.getString("checkpoint-state"));
+
+ assertEquals("123", destination.getRoot().getChildNode(":async").getString("test"));
+
+ for (String name : new String[] {"var", "etc", "sling.css", "apps", "libs", "sightly"}) {
+ assertSameRecord(destination.getRoot().getChildNode(name), checkpoint.getChildNode(name));
+ }
+ }
+
+ private static void assertSameRecord(NodeState ns1, NodeState ns2) {
+ String recordId1 = getRecordId(ns1);
+ String recordId2 = getRecordId(ns2);
+ assertNotNull(recordId1);
+ assertEquals(recordId1, recordId2);
+ }
+
+ private static String getRecordId(NodeState node) {
+ if (node instanceof SegmentNodeState) {
+ return ((SegmentNodeState) node).getRecordId().toString();
+ } else if (node instanceof org.apache.jackrabbit.oak.segment.SegmentNodeState) {
+ return ((org.apache.jackrabbit.oak.segment.SegmentNodeState) node).getRecordId().toString();
+ } else {
+ return null;
+ }
+ }
+
+ // OAK-2869
+ private void verifyEmptyAsync() {
+ NodeState state = destination.getRoot().getChildNode(":async");
+ assertFalse(state.hasProperty("test"));
+ }
+
+ protected boolean supportsCheckpointMigration() {
+ return false;
+ }
}
\ No newline at end of file
Copied: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentTarToSegmentTest.java (from r1747246, jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarTest.java)
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentTarToSegmentTest.java?p2=jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentTarToSegmentTest.java&p1=jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarTest.java&r1=1747246&r2=1747251&rev=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentTarToSegmentTest.java Tue Jun 7 15:11:54 2016
@@ -17,18 +17,18 @@
package org.apache.jackrabbit.oak.upgrade.cli;
import org.apache.jackrabbit.oak.upgrade.cli.container.NodeStoreContainer;
-import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentTarNodeStoreContainer;
import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentNodeStoreContainer;
+import org.apache.jackrabbit.oak.upgrade.cli.container.SegmentTarNodeStoreContainer;
-public class SegmentToSegmentTarTest extends AbstractOak2OakTest {
+public class SegmentTarToSegmentTest extends AbstractOak2OakTest {
private final NodeStoreContainer source;
private final NodeStoreContainer destination;
- public SegmentToSegmentTarTest() {
- source = new SegmentNodeStoreContainer();
- destination = new SegmentTarNodeStoreContainer();
+ public SegmentTarToSegmentTest() {
+ source = new SegmentTarNodeStoreContainer();
+ destination = new SegmentNodeStoreContainer();
}
@Override
@@ -45,4 +45,9 @@ public class SegmentToSegmentTarTest ext
protected String[] getArgs() {
return new String[] { source.getDescription(), destination.getDescription() };
}
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarTest.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTarTest.java Tue Jun 7 15:11:54 2016
@@ -45,4 +45,9 @@ public class SegmentToSegmentTarTest ext
protected String[] getArgs() {
return new String[] { source.getDescription(), destination.getDescription() };
}
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTest.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/SegmentToSegmentTest.java Tue Jun 7 15:11:54 2016
@@ -44,4 +44,9 @@ public class SegmentToSegmentTest extend
protected String[] getArgs() {
return new String[] { source.getDescription(), destination.getDescription() };
}
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/CopyReferencesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/CopyReferencesTest.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/CopyReferencesTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/CopyReferencesTest.java Tue Jun 7 15:11:54 2016
@@ -51,4 +51,9 @@ public class CopyReferencesTest extends
return new String[] { "--src-datastore", sourceBlob.getDescription(), source.getDescription(),
destination.getDescription() };
}
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToFbsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToFbsTest.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToFbsTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToFbsTest.java Tue Jun 7 15:11:54 2016
@@ -54,4 +54,9 @@ public class FbsToFbsTest extends Abstra
return new String[] { "--copy-binaries", "--src-fileblobstore", sourceBlob.getDescription(), "--fileblobstore",
destinationBlob.getDescription(), source.getDescription(), destination.getDescription() };
}
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToFdsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToFdsTest.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToFdsTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToFdsTest.java Tue Jun 7 15:11:54 2016
@@ -55,4 +55,9 @@ public class FbsToFdsTest extends Abstra
return new String[] { "--copy-binaries", "--src-fileblobstore", sourceBlob.getDescription(), "--datastore",
destinationBlob.getDescription(), source.getDescription(), destination.getDescription() };
}
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FbsToS3Test.java Tue Jun 7 15:11:54 2016
@@ -62,4 +62,9 @@ public class FbsToS3Test extends Abstrac
destinationBlob.getDescription(), "--s3config", S3_PROPERTIES, source.getDescription(),
destination.getDescription() };
}
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FdsToFbsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FdsToFbsTest.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FdsToFbsTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/FdsToFbsTest.java Tue Jun 7 15:11:54 2016
@@ -55,4 +55,9 @@ public class FdsToFbsTest extends Abstra
return new String[] { "--copy-binaries", "--src-datastore", sourceBlob.getDescription(), "--fileblobstore",
destinationBlob.getDescription(), source.getDescription(), destination.getDescription() };
}
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
}
Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java?rev=1747251&r1=1747250&r2=1747251&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/S3ToFbsTest.java Tue Jun 7 15:11:54 2016
@@ -62,4 +62,9 @@ public class S3ToFbsTest extends Abstrac
S3_PROPERTIES, "--fileblobstore", destinationBlob.getDescription(), source.getDescription(),
destination.getDescription() };
}
+
+ @Override
+ protected boolean supportsCheckpointMigration() {
+ return true;
+ }
}