Author: tomekr Date: Wed Jun 20 10:42:09 2018 New Revision: 1833904 URL: http://svn.apache.org/viewvc?rev=1833904&view=rev Log: OAK-7561: Don't migrate the checkpoints in oak-store-composite seed initialization
Modified: jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/InitialContentMigrator.java jackrabbit/oak/trunk/oak-store-composite/src/test/java/org/apache/jackrabbit/oak/composite/InitialContentMigratorTest.java Modified: jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/InitialContentMigrator.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/InitialContentMigrator.java?rev=1833904&r1=1833903&r2=1833904&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/InitialContentMigrator.java (original) +++ jackrabbit/oak/trunk/oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/InitialContentMigrator.java Wed Jun 20 10:42:09 2018 @@ -17,10 +17,8 @@ package org.apache.jackrabbit.oak.composite; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Lists; import org.apache.jackrabbit.oak.api.CommitFailedException; -import org.apache.jackrabbit.oak.api.PropertyState; -import org.apache.jackrabbit.oak.api.Type; +import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState; import org.apache.jackrabbit.oak.plugins.migration.FilteringNodeState; import org.apache.jackrabbit.oak.plugins.migration.report.LoggingReporter; import org.apache.jackrabbit.oak.plugins.migration.report.ReportingNodeState; @@ -37,10 +35,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; +import java.util.Collections; import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; import java.util.Set; public class InitialContentMigrator { @@ -125,60 +121,20 @@ public class InitialContentMigrator { LOG.info("Exclude: {}", excludePaths); LOG.info("Exclude fragments: {} @ {}", excludeFragments, fragmentPaths); - Map<String, String> nameToRevision = new LinkedHashMap<>(); - Map<String, String> checkpointSegmentToDoc = new LinkedHashMap<>(); - - NodeState initialRoot = targetNodeStore.getRoot(); - NodeState targetRoot = initialRoot; - NodeState previousRoot = initialRoot; - for (String checkpointName : seedNodeStore.checkpoints()) { - NodeState checkpointRoot = seedNodeStore.retrieve(checkpointName); - Map<String, String> checkpointInfo = seedNodeStore.checkpointInfo(checkpointName); - - if (previousRoot == initialRoot) { - LOG.info("Migrating first checkpoint: {}", checkpointName); - } else { - LOG.info("Applying diff to {}", checkpointName); - } - LOG.info("Checkpoint metadata: {}", checkpointInfo); - - targetRoot = copyDiffToTarget(previousRoot, checkpointRoot, targetRoot); - previousRoot = checkpointRoot; - - String newCheckpointName = targetNodeStore.checkpoint(Long.MAX_VALUE, checkpointInfo); - if (checkpointInfo.containsKey("name")) { - nameToRevision.put(checkpointInfo.get("name"), newCheckpointName); - } - checkpointSegmentToDoc.put(checkpointName, newCheckpointName); - } - - NodeState sourceRoot = seedNodeStore.getRoot(); - if (previousRoot == initialRoot) { - LOG.info("No checkpoints found; migrating head"); - } else { - LOG.info("Applying diff to head"); - } + NodeState targetRoot = targetNodeStore.getRoot(); + NodeBuilder targetBuilder = targetRoot.builder(); + NodeState seedRoot = wrapNodeState(seedNodeStore.getRoot(), true); + seedRoot.compareAgainstBaseState(EmptyNodeState.EMPTY_NODE, new ApplyDiff(targetBuilder)); + targetNodeStore.merge(targetBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY); - targetRoot = copyDiffToTarget(previousRoot, sourceRoot, targetRoot); + String fullTextAsyncId = targetNodeStore.checkpoint(Long.MAX_VALUE, Collections.singletonMap("name", "fulltext-async")); + String asyncId = targetNodeStore.checkpoint(Long.MAX_VALUE, Collections.singletonMap("name", "async")); - LOG.info("Rewriting checkpoint names in /:async {}", nameToRevision); - NodeBuilder targetBuilder = targetRoot.builder(); - NodeBuilder async = targetBuilder.getChildNode(":async"); - for (Map.Entry<String, String> e : nameToRevision.entrySet()) { - async.setProperty(e.getKey(), e.getValue(), Type.STRING); - - PropertyState temp = async.getProperty(e.getKey() + "-temp"); - if (temp == null) { - continue; - } - List<String> tempValues = Lists.newArrayList(temp.getValue(Type.STRINGS)); - for (Map.Entry<String, String> sToD : checkpointSegmentToDoc.entrySet()) { - if (tempValues.contains(sToD.getKey())) { - tempValues.set(tempValues.indexOf(sToD.getKey()), sToD.getValue()); - } - } - async.setProperty(e.getKey() + "-temp", tempValues, Type.STRINGS); - } + targetBuilder = targetRoot.builder(); + targetBuilder.getChildNode(":async").remove(); + NodeBuilder asyncNode = targetBuilder.child(":async"); + asyncNode.setProperty("fulltext-async", fullTextAsyncId); + asyncNode.setProperty("async", asyncId); targetNodeStore.merge(targetBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY); @@ -192,15 +148,6 @@ public class InitialContentMigrator { targetNodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); } - private NodeState copyDiffToTarget(NodeState before, NodeState after, NodeState targetRoot) throws CommitFailedException { - NodeBuilder targetBuilder = targetRoot.builder(); - NodeState currentRoot = wrapNodeState(after, true); - NodeState baseRoot = wrapNodeState(before, false); - currentRoot.compareAgainstBaseState(baseRoot, new ApplyDiff(targetBuilder)); - return targetNodeStore.merge(targetBuilder, EmptyHook.INSTANCE, CommitInfo.EMPTY); - } - - private NodeState wrapNodeState(NodeState nodeState, boolean logPaths) { NodeState wrapped = nodeState; wrapped = FilteringNodeState.wrap("/", wrapped, includePaths, excludePaths, fragmentPaths, excludeFragments); Modified: jackrabbit/oak/trunk/oak-store-composite/src/test/java/org/apache/jackrabbit/oak/composite/InitialContentMigratorTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-store-composite/src/test/java/org/apache/jackrabbit/oak/composite/InitialContentMigratorTest.java?rev=1833904&r1=1833903&r2=1833904&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-store-composite/src/test/java/org/apache/jackrabbit/oak/composite/InitialContentMigratorTest.java (original) +++ jackrabbit/oak/trunk/oak-store-composite/src/test/java/org/apache/jackrabbit/oak/composite/InitialContentMigratorTest.java Wed Jun 20 10:42:09 2018 @@ -16,7 +16,9 @@ */ package org.apache.jackrabbit.oak.composite; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -24,8 +26,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.UUID; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -48,27 +48,20 @@ import org.junit.Test; public class InitialContentMigratorTest { @Test - public void migrateContentWithCheckpoints() throws IOException, CommitFailedException { - + public void migrateContent() throws IOException, CommitFailedException { // 1. populate the seed store with // . // \- first // \- second // \- third // - // 2. checkpoint before adding the third node - // - // 3. the mount only includes the '/first' path, so only the + // 2. the mount only includes the '/first' path, so only the // 'second' and 'third' nodes should be available MemoryNodeStore seed = new MemoryNodeStore(); NodeBuilder root = seed.getRoot().builder(); root.child("first"); root.child("second"); - seed.merge(root, EmptyHook.INSTANCE, CommitInfo.EMPTY); - String checkpoint1 = seed.checkpoint(TimeUnit.MINUTES.toMillis(10)); - - root = seed.getRoot().builder(); root.child("third"); seed.merge(root, EmptyHook.INSTANCE, CommitInfo.EMPTY); @@ -85,13 +78,15 @@ public class InitialContentMigratorTest assertFalse("Node /first should not have been migrated", targetRoot.hasChildNode("first")); assertTrue("Node /second should have been migrated", targetRoot.hasChildNode("second")); assertTrue("Node /third should have been migrated", targetRoot.hasChildNode("third")); - - // verify that the 'second' node is visible in the migrated store when retrieving the checkpoint - NodeState checkpointTargetRoot = target.retrieve(checkpoint1); - assertFalse("Node /first should not have been migrated", checkpointTargetRoot.hasChildNode("first")); - assertTrue("Node /second should have been migrated", checkpointTargetRoot.hasChildNode("second")); - assertFalse("Node /third should not be visible from the migrated checkpoint", checkpointTargetRoot.hasChildNode("third")); + // verify that the async and fulltext-async checkpoints are available + NodeState mountAsync = target.getRoot().getChildNode(":async"); + assertNotNull(target.retrieve(mountAsync.getString("async"))); + assertNotNull(target.retrieve(mountAsync.getString("fulltext-async"))); + + // verify the info objects for the checkpoints + assertEquals("async", target.checkpointInfo(mountAsync.getString("async")).get("name")); + assertEquals("fulltext-async", target.checkpointInfo(mountAsync.getString("fulltext-async")).get("name")); } @Test