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;
+    }
 }