### Eclipse Workspace Patch 1.0 #P jackrabbit-core Index: src/main/java/org/apache/jackrabbit/core/state/NodeState.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/state/NodeState.java (revision 1685932) +++ src/main/java/org/apache/jackrabbit/core/state/NodeState.java (working copy) @@ -110,13 +110,48 @@ this.nodeTypeName = nodeTypeName; } +static HashSet traces = new HashSet(); +void printTrace() { + StringBuilder buff = new StringBuilder(); + for(StackTraceElement e : Thread.currentThread().getStackTrace()) { + String x = e.toString(); + buff.append(x).append('\n'); + if (x.indexOf("RandomChange") >= 0) { + if (x.indexOf("RandomChange.setUp") >= 0) { + return; + } + if (x.indexOf("RandomChange.init") >= 0) { + return; + } + break; + } + } + String s = buff.toString(); + if(!traces.contains(s)) { + traces.add(s); + System.out.println(s); + } +} + +private static void waitABit() { + try { + Thread.yield(); + Thread.sleep(1); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } +} + //-------------------------------------------------------< public methods > /** * {@inheritDoc} */ @Override public synchronized void copy(ItemState state, boolean syncModCount) { +waitABit(); synchronized (state) { +//printTrace(); NodeState nodeState = (NodeState) state; id = nodeState.id; parentId = nodeState.parentId; Index: src/test/java/org/apache/jackrabbit/core/deadlock/repository.xml =================================================================== --- src/test/java/org/apache/jackrabbit/core/deadlock/repository.xml (revision 0) +++ src/test/java/org/apache/jackrabbit/core/deadlock/repository.xml (working copy) @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Index: src/test/java/org/apache/jackrabbit/core/deadlock/RandomChange.java =================================================================== --- src/test/java/org/apache/jackrabbit/core/deadlock/RandomChange.java (revision 0) +++ src/test/java/org/apache/jackrabbit/core/deadlock/RandomChange.java (working copy) @@ -0,0 +1,142 @@ +package org.apache.jackrabbit.core.deadlock; + +import java.util.Random; + +import javax.jcr.InvalidItemStateException; +import javax.jcr.ItemNotFoundException; +import javax.jcr.Node; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.apache.jackrabbit.test.AbstractJCRTest; + +public class RandomChange extends AbstractJCRTest { + + static final String TEST_ROOT = "test" + System.currentTimeMillis() + "_"; + + private Session session; + + public void setUp() throws Exception { + super.setUp(); + session = testRootNode.getSession(); + } + +// public void testRandomized() throws Exception { +// for(int test = 0; test < 100; test++) { +// System.out.println("test " + test); +// init(s1); +// Random r = new Random(test); +// for(int i=0; i<100; i++) { +// Session s = r.nextBoolean() ? s1 : s2; +// randomOp(r, s); +// } +// } +// } + + public void testRandomizedConcurrent() throws Exception { + for(int i=0;; i++) { + System.out.println("i: " + i); + oneRandomizedConcurrent(i); + } + } + + private void oneRandomizedConcurrent(final int index) throws Exception { + int threadCount = 4; +// int threadCount = 10; + final boolean[] stop = new boolean[1]; + final Exception[] ex = new Exception[1]; + final Random r = new Random(); + init(session, index); + Thread[] threads = new Thread[threadCount]; + for(int i=0; i