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 2017/03/12 17:23:06 UTC

svn commit: r1786602 - in /jackrabbit/oak/trunk/oak-upgrade/src: main/java/org/apache/jackrabbit/oak/upgrade/ test/java/org/apache/jackrabbit/oak/upgrade/cli/ test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/

Author: tomekr
Date: Sun Mar 12 17:23:06 2017
New Revision: 1786602

URL: http://svn.apache.org/viewvc?rev=1786602&view=rev
Log:
OAK-5920 Checkpoint migration will fail if the MissingBlobStore is used

Modified:
    jackrabbit/oak/trunk/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/RepositorySidegrade.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/blob/CopyBinariesTest.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=1786602&r1=1786601&r2=1786602&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 Sun Mar 12 17:23:06 2017
@@ -305,7 +305,14 @@ public class RepositorySidegrade {
             LOG.info("Custom paths have been specified, checkpoints won't be migrated");
             isRemoveCheckpointReferences = true;
         } else {
-            boolean checkpointsCopied = copyCheckpoints(targetRoot);
+            boolean checkpointsCopied;
+            try {
+                checkpointsCopied = copyCheckpoints(targetRoot);
+            } catch(UnsupportedOperationException e) {
+                removeCheckpoints();
+                checkpointsCopied = false;
+                LOG.warn("Can't copy checkpoints without the access to the external blob store; migration will proceed");
+            }
             if (!checkpointsCopied) {
                 LOG.info("Copying checkpoints is not supported for this combination of node stores");
                 isRemoveCheckpointReferences = true;
@@ -409,6 +416,16 @@ public class RepositorySidegrade {
         return true;
    }
 
+    private void removeCheckpoints() {
+        if (!(target instanceof TarNodeStore)) {
+            return;
+        }
+        TarNodeStore targetTarNS = (TarNodeStore) target;
+        NodeBuilder targetSuperRoot = ((TarNodeStore) target).getSuperRoot().builder();
+        targetSuperRoot.setChildNode("checkpoints");
+        targetTarNS.setSuperRoot(targetSuperRoot);
+    }
+
     /**
      * Return all checkpoint paths, sorted by their "created" property, descending.
      *

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=1786602&r1=1786601&r2=1786602&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 Sun Mar 12 17:23:06 2017
@@ -22,12 +22,14 @@ import static org.junit.Assert.assertEqu
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Random;
 
 import javax.annotation.Nullable;
 import javax.jcr.Node;
@@ -41,7 +43,9 @@ import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
+import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.IOUtils;
 import org.apache.jackrabbit.oak.jcr.Jcr;
 import org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl;
@@ -142,15 +146,24 @@ public abstract class AbstractOak2OakTes
         }
 
         NodeBuilder builder = target.getRoot().builder();
+        builder.setProperty("binary-prop", getRandomBlob(target));
         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.setProperty("binary-prop", getRandomBlob(target));
         builder.child(":async").setProperty("test", "123");
         target.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
     }
 
+    private Blob getRandomBlob(NodeStore target) throws IOException {
+        Random r = new Random();
+        byte[] buff = new byte[512 * 1024];
+        r.nextBytes(buff);
+        return target.createBlob(new ByteArrayInputStream(buff));
+    }
+
     @Test
     public void validateMigration() throws RepositoryException, IOException, CliArgumentException {
         verifyContent(session);

Modified: jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/CopyBinariesTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/CopyBinariesTest.java?rev=1786602&r1=1786601&r2=1786602&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/CopyBinariesTest.java (original)
+++ jackrabbit/oak/trunk/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/blob/CopyBinariesTest.java Sun Mar 12 17:23:06 2017
@@ -65,70 +65,88 @@ public class CopyBinariesTest extends Ab
                 new SegmentNodeStoreContainer(blob),
                 new SegmentNodeStoreContainer(blob),
                 asList(),
-                DatastoreArguments.BlobMigrationCase.COPY_REFERENCES
+                DatastoreArguments.BlobMigrationCase.COPY_REFERENCES,
+                false
         });
         params.add(new Object[]{
                 "Copy references, no blobstores defined, segment-tar -> segment-tar",
                 new SegmentTarNodeStoreContainer(blob),
                 new SegmentTarNodeStoreContainer(blob),
                 asList(),
-                DatastoreArguments.BlobMigrationCase.COPY_REFERENCES
+                DatastoreArguments.BlobMigrationCase.COPY_REFERENCES,
+                false
+        });
+        params.add(new Object[]{
+                "Copy references, no blobstores defined, segment -> segment-tar",
+                new SegmentNodeStoreContainer(blob),
+                new SegmentTarNodeStoreContainer(blob),
+                asList(),
+                DatastoreArguments.BlobMigrationCase.COPY_REFERENCES,
+                false
         });
         params.add(new Object[]{
                 "Copy references, no blobstores defined, document -> segment-tar",
                 new JdbcNodeStoreContainer(blob),
                 new SegmentNodeStoreContainer(blob),
                 asList("--src-user=sa", "--src-password=sa"),
-                DatastoreArguments.BlobMigrationCase.COPY_REFERENCES
+                DatastoreArguments.BlobMigrationCase.COPY_REFERENCES,
+                false
         });
         params.add(new Object[]{
                 "Copy references, no blobstores defined, segment-tar -> document",
                 new SegmentTarNodeStoreContainer(blob),
                 new JdbcNodeStoreContainer(blob),
                 asList("--user=sa", "--password=sa"),
-                DatastoreArguments.BlobMigrationCase.UNSUPPORTED
+                DatastoreArguments.BlobMigrationCase.UNSUPPORTED,
+                false
         });
         params.add(new Object[]{
                 "Missing source, external destination",
                 new SegmentTarNodeStoreContainer(blob),
                 new SegmentTarNodeStoreContainer(blob),
                 asList("--datastore=" + blob.getDescription()),
-                DatastoreArguments.BlobMigrationCase.UNSUPPORTED
+                DatastoreArguments.BlobMigrationCase.UNSUPPORTED,
+                false
         });
         params.add(new Object[]{
                 "Copy embedded to embedded, no blobstores defined",
                 new SegmentTarNodeStoreContainer(),
                 new SegmentTarNodeStoreContainer(),
                 asList(),
-                DatastoreArguments.BlobMigrationCase.EMBEDDED_TO_EMBEDDED
+                DatastoreArguments.BlobMigrationCase.EMBEDDED_TO_EMBEDDED,
+                true
         });
         params.add(new Object[]{
                 "Copy embedded to external, no blobstores defined",
                 new SegmentTarNodeStoreContainer(),
                 new SegmentTarNodeStoreContainer(blob),
                 asList("--datastore=" + blob.getDescription()),
-                DatastoreArguments.BlobMigrationCase.EMBEDDED_TO_EXTERNAL
+                DatastoreArguments.BlobMigrationCase.EMBEDDED_TO_EXTERNAL,
+                true
         });
         params.add(new Object[]{
                 "Copy references, src blobstore defined",
                 new SegmentTarNodeStoreContainer(blob),
                 new SegmentTarNodeStoreContainer(blob),
                 asList("--src-datastore=" + blob.getDescription()),
-                DatastoreArguments.BlobMigrationCase.COPY_REFERENCES
+                DatastoreArguments.BlobMigrationCase.COPY_REFERENCES,
+                true
         });
         params.add(new Object[]{
                 "Copy external to embedded, src blobstore defined",
                 new SegmentTarNodeStoreContainer(blob),
                 new SegmentTarNodeStoreContainer(),
                 asList("--copy-binaries", "--src-datastore=" + blob.getDescription()),
-                DatastoreArguments.BlobMigrationCase.EXTERNAL_TO_EMBEDDED
+                DatastoreArguments.BlobMigrationCase.EXTERNAL_TO_EMBEDDED,
+                true
         });
         params.add(new Object[]{
                 "Copy external to external, src blobstore defined",
                 new SegmentTarNodeStoreContainer(blob),
                 new SegmentTarNodeStoreContainer(blob2),
                 asList("--copy-binaries", "--src-datastore=" + blob.getDescription(), "--datastore=" + blob2.getDescription()),
-                DatastoreArguments.BlobMigrationCase.EXTERNAL_TO_EXTERNAL
+                DatastoreArguments.BlobMigrationCase.EXTERNAL_TO_EXTERNAL,
+                true
         });
         return params;
     }
@@ -141,11 +159,14 @@ public class CopyBinariesTest extends Ab
 
     private final DatastoreArguments.BlobMigrationCase blobMigrationCase;
 
-    public CopyBinariesTest(String name, NodeStoreContainer source, NodeStoreContainer destination, List<String> args, DatastoreArguments.BlobMigrationCase blobMigrationCase) throws IOException, CliArgumentException {
+    private final boolean supportsCheckpointMigration;
+
+    public CopyBinariesTest(String name, NodeStoreContainer source, NodeStoreContainer destination, List<String> args, DatastoreArguments.BlobMigrationCase blobMigrationCase, boolean supportsCheckpointMigration) throws IOException, CliArgumentException {
         this.source = source;
         this.destination = destination;
         this.args = args;
         this.blobMigrationCase = blobMigrationCase;
+        this.supportsCheckpointMigration = supportsCheckpointMigration;
 
         this.source.clean();
         this.destination.clean();
@@ -203,7 +224,11 @@ public class CopyBinariesTest extends Ab
         if (blobMigrationCase == DatastoreArguments.BlobMigrationCase.UNSUPPORTED) {
             return;
         }
-        verifyContent(session);
-        verifyBlob(session);
+        super.validateMigration();
+    }
+
+    @Override
+    protected boolean supportsCheckpointMigration() {
+        return supportsCheckpointMigration;
     }
 }
\ No newline at end of file