You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by ka...@apache.org on 2011/06/17 13:23:53 UTC
svn commit: r1136844 -
/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/IndexSplitDeadlockTest.java
Author: kahatlen
Date: Fri Jun 17 11:23:53 2011
New Revision: 1136844
URL: http://svn.apache.org/viewvc?rev=1136844&view=rev
Log:
DERBY-5278: AssertionFailedError in IndexSplitDeadlockTest.testBTreeForwardScan_fetchRows_resumeAfterWait_unique_split()
Made synchronization between threads more reliable with wait/notify instead of sleep.
Modified:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/IndexSplitDeadlockTest.java
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/IndexSplitDeadlockTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/IndexSplitDeadlockTest.java?rev=1136844&r1=1136843&r2=1136844&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/IndexSplitDeadlockTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/store/IndexSplitDeadlockTest.java Fri Jun 17 11:23:53 2011
@@ -359,6 +359,13 @@ public class IndexSplitDeadlockTest exte
}
commit();
+ // Object used for synchronization between the main thread and the
+ // helper thread. The main thread should increment the value to tell
+ // the helper thread that it's ready to start the index scan. The
+ // helper thread should increment it to tell the main thread that it
+ // has locked row 40 and is ready to insert more values.
+ final int[] syncObject = new int[1];
+
// Lock a row on the first page in a different thread to stop the
// index scan. Then split the first leaf by inserting many values
// less than zero.
@@ -368,11 +375,24 @@ public class IndexSplitDeadlockTest exte
Statement s = conn.createStatement();
s.executeUpdate("update t set x = x where x = 40");
s.close();
- // Give the index scan time to start and position on
- // the row we have locked. (Give it two seconds, since the
- // main thread sleeps for one second first before it starts
- // the index scan.)
- Thread.sleep(2000);
+
+ synchronized (syncObject) {
+ // Tell the main thread that we've locked the row and that
+ // it can go ahead with the index scan.
+ syncObject[0]++;
+ syncObject.notifyAll();
+
+ // Wait here until the main thread is actually ready to
+ // start the scan.
+ while (syncObject[0] < 2) {
+ syncObject.wait();
+ }
+ }
+
+ // The main thread is ready to start the index scan. Give it a
+ // second to get to the row we have locked.
+ Thread.sleep(1000L);
+
// Split the first leaf
PreparedStatement ps = conn.prepareStatement(
"insert into t values ?");
@@ -385,13 +405,24 @@ public class IndexSplitDeadlockTest exte
}
});
- // Give the other thread time to obtain the lock
- Thread.sleep(1000);
+ // Prepare the index scan.
+ PreparedStatement scan = prepareStatement(
+ "select * from t --DERBY-PROPERTIES constraint=C");
+
+ synchronized (syncObject) {
+ // Tell the helper thread we're ready to start the scan.
+ syncObject[0]++;
+ syncObject.notifyAll();
+
+ // Wait until the helper thread has obtained the lock.
+ while (syncObject[0] < 2) {
+ syncObject.wait();
+ }
+ }
// Perform an index scan. Will be blocked for a while when fetching
- // the row where x=100, but should be able to resume the scan.
- ResultSet rs = s.executeQuery(
- "select * from t --DERBY-PROPERTIES constraint=C");
+ // the row where x=40, but should be able to resume the scan.
+ ResultSet rs = scan.executeQuery();
for (int i = 0; i < 300; i++) {
assertTrue(rs.next());
assertEquals(i, rs.getInt(1));