You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2010/06/04 18:39:46 UTC

svn commit: r951483 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/ main/java/org/apache/jackrabbit/core/state/ test/java/org/apache/jackrabbit/core/

Author: stefan
Date: Fri Jun  4 16:39:45 2010
New Revision: 951483

URL: http://svn.apache.org/viewvc?rev=951483&view=rev
Log:
JCR-2632: Concurrent Session.move() operations failure

Added:
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentRenameTest.java
Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeStateMerger.java
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java?rev=951483&r1=951482&r2=951483&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/SessionImpl.java Fri Jun  4 16:39:45 2010
@@ -1096,6 +1096,8 @@ public class SessionImpl extends Abstrac
         }
 
         if (srcParentNode.isSame(destParentNode)) {
+            // change definition of target
+            targetNode.onRedefine(newTargetDef.unwrap());
             // do rename
             destParentNode.renameChildNode(srcName.getName(), index, targetId, destName.getName());
         } else {
@@ -1105,6 +1107,8 @@ public class SessionImpl extends Abstrac
                 log.debug(msg);
                 throw new UnsupportedRepositoryOperationException(msg);
             }
+              // change definition of target
+            targetNode.onRedefine(newTargetDef.unwrap());
 
             // do move:
             // 1. remove child node entry from old parent
@@ -1120,9 +1124,6 @@ public class SessionImpl extends Abstrac
                     (NodeState) destParentNode.getOrCreateTransientItemState();
             destParentState.addChildNodeEntry(destName.getName(), targetId);
         }
-
-        // change definition of target
-        targetNode.onRedefine(newTargetDef.unwrap());
     }
 
     /**

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeStateMerger.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeStateMerger.java?rev=951483&r1=951482&r2=951483&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeStateMerger.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/NodeStateMerger.java Fri Jun  4 16:39:45 2010
@@ -131,15 +131,15 @@ class NodeStateMerger {
                         }
                     }
 
-                    // copy child node antries from other state and
+                    // copy child node entries from other state and
                     // re-apply changes made on this state
                     state.setChildNodeEntries(overlayedState.getChildNodeEntries());
-                    for (ChildNodeEntry cne : added) {
-                        state.addChildNodeEntry(cne.getName(), cne.getId());
-                    }
                     for (ChildNodeEntry cne : removed) {
                         state.removeChildNodeEntry(cne.getId());
                     }
+                    for (ChildNodeEntry cne : added) {
+                        state.addChildNodeEntry(cne.getName(), cne.getId());
+                    }
                 }
 
                 // property names

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java?rev=951483&r1=951482&r2=951483&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/state/SessionItemStateManager.java Fri Jun  4 16:39:45 2010
@@ -965,7 +965,7 @@ public class SessionItemStateManager
                                                 parent.getNodeTypeName(),
                                                 parent.getMixinTypeNames());
                                         QNodeDefinition def = ent.getApplicableChildNodeDef(name, ns.getNodeTypeName(), ntReg);
-                                        return def != null ? def.allowsSameNameSiblings() : false;
+                                        return def != null && def.allowsSameNameSiblings();
                                     } catch (Exception e) {
                                         log.warn("Unable to get node definition", e);
                                         return false;

Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentRenameTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentRenameTest.java?rev=951483&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentRenameTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ConcurrentRenameTest.java Fri Jun  4 16:39:45 2010
@@ -0,0 +1,38 @@
+package org.apache.jackrabbit.core;
+
+import org.apache.jackrabbit.util.Text;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+/**
+ * <code>org.apache.jackrabbit.core.ConcurrentRenameTest</code>...
+ */
+public class ConcurrentRenameTest extends AbstractConcurrencyTest {
+
+    private static final int NUM_MOVES = 100;
+    private static final int NUM_THREADS = 2;
+
+    public void testConcurrentRename() throws Exception {
+        runTask(new Task() {
+
+            public void execute(Session session, Node test)
+                    throws RepositoryException {
+                String name = Thread.currentThread().getName();
+                // create node
+                Node n = test.addNode(name);
+                session.save();
+                // do moves
+                for (int i = 0; i < NUM_MOVES; i++) {
+                    String path = n.getPath();
+                    String newName = name + "-" + i;
+                    String newPath = Text.getRelativeParent(path, 1) + "/" + newName;
+                    session.move(path, newPath);
+                    session.save();
+                    n = session.getNode(newPath);
+                }
+            }
+        }, NUM_THREADS, testRootNode.getPath());
+    }
+}
\ No newline at end of file