Author: mreutegg Date: Thu May 22 12:36:16 2014 New Revision: 1596844 URL: http://svn.apache.org/r1596844 Log: OAK-1827: ClassCastException in NodeDocument.split() when collisions detected
Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java (with props) Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Collision.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UpdateOp.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Collision.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Collision.java?rev=1596844&r1=1596843&r2=1596844&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Collision.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/Collision.java Thu May 22 12:36:16 2014 @@ -127,7 +127,7 @@ class Collision { if (commitRoot.isCommitted(revision)) { return false; } - op.setMapEntry(NodeDocument.COLLISIONS, revision, true); + NodeDocument.addCollision(op, revision); commitRoot = store.createOrUpdate(Collection.NODES, op); // check again on old document right before our update was applied if (commitRoot.isCommitted(revision)) { Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java?rev=1596844&r1=1596843&r2=1596844&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/NodeDocument.java Thu May 22 12:36:16 2014 @@ -295,7 +295,7 @@ public final class NodeDocument extends */ private static final Set<String> IGNORE_ON_SPLIT = ImmutableSet.of( ID, MOD_COUNT, MODIFIED_IN_SECS, PREVIOUS, LAST_REV, CHILDREN_FLAG, - HAS_BINARY_FLAG, PATH, DELETED_ONCE); + HAS_BINARY_FLAG, PATH, DELETED_ONCE, COLLISIONS); public static final long HAS_BINARY_VAL = 1; @@ -1229,6 +1229,12 @@ public final class NodeDocument extends checkNotNull(op).removeMapEntry(REVISIONS, checkNotNull(revision)); } + public static void addCollision(@Nonnull UpdateOp op, + @Nonnull Revision revision) { + checkNotNull(op).setMapEntry(COLLISIONS, checkNotNull(revision), + String.valueOf(true)); + } + public static void removeCollision(@Nonnull UpdateOp op, @Nonnull Revision revision) { checkNotNull(op).removeMapEntry(COLLISIONS, checkNotNull(revision)); Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UpdateOp.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UpdateOp.java?rev=1596844&r1=1596843&r2=1596844&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UpdateOp.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/UpdateOp.java Thu May 22 12:36:16 2014 @@ -130,7 +130,7 @@ public final class UpdateOp { * @param revision the revision * @param value the value */ - void setMapEntry(@Nonnull String property, @Nonnull Revision revision, Object value) { + void setMapEntry(@Nonnull String property, @Nonnull Revision revision, String value) { Operation op = new Operation(); op.type = Operation.Type.SET_MAP_ENTRY; op.value = value; Added: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java?rev=1596844&view=auto ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java (added) +++ jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java Thu May 22 12:36:16 2014 @@ -0,0 +1,71 @@ +/* + * 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.plugins.document; + +import java.util.Comparator; + +import org.apache.jackrabbit.oak.plugins.document.memory.MemoryDocumentStore; +import org.apache.jackrabbit.oak.plugins.document.util.Utils; +import org.junit.Test; + +/** + * Tests for {@link NodeDocument}. + */ +public class NodeDocumentTest { + + @Test + public void splitCollisions() throws Exception { + MemoryDocumentStore docStore = new MemoryDocumentStore(); + String id = Utils.getPathFromId("/"); + NodeDocument doc = new NodeDocument(docStore); + doc.put(Document.ID, id); + UpdateOp op = new UpdateOp(id, false); + for (int i = 0; i < NodeDocument.NUM_REVS_THRESHOLD + 1; i++) { + Revision r = Revision.newRevision(1); + NodeDocument.setRevision(op, r, "c"); + NodeDocument.addCollision(op, r); + } + UpdateUtils.applyChanges(doc, op, StableRevisionComparator.INSTANCE); + doc.split(CONTEXT); + } + + private static final RevisionContext CONTEXT = new RevisionContext() { + + private final Comparator<Revision> comparator + = StableRevisionComparator.INSTANCE; + + @Override + public UnmergedBranches getBranches() { + return new UnmergedBranches(comparator); + } + + @Override + public UnsavedModifications getPendingModifications() { + return new UnsavedModifications(); + } + + @Override + public Comparator<Revision> getRevisionComparator() { + return comparator; + } + + @Override + public int getClusterId() { + return 1; + } + }; +} Propchange: jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/NodeDocumentTest.java ------------------------------------------------------------------------------ svn:eol-style = native