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/04/01 12:07:42 UTC
svn commit: r1087636 -
/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdateStatisticsTest.java
Author: kahatlen
Date: Fri Apr 1 10:07:41 2011
New Revision: 1087636
URL: http://svn.apache.org/viewvc?rev=1087636&view=rev
Log:
DERBY-5153: Intermittent ASSERT FAILED Internal Error-- statistics not found in selectivityForConglomerate when running InterruptResilienceTest
Added regression test case that reproduces the bug. Disabled for now.
Modified:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdateStatisticsTest.java
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdateStatisticsTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdateStatisticsTest.java?rev=1087636&r1=1087635&r2=1087636&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdateStatisticsTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdateStatisticsTest.java Fri Apr 1 10:07:41 2011
@@ -21,8 +21,10 @@
package org.apache.derbyTesting.functionTests.tests.lang;
+import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
+import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import junit.framework.Test;
@@ -208,4 +210,93 @@ public class UpdateStatisticsTest extend
s.execute("drop table t");
commit();
}
+
+ /**
+ * Regression test case for DERBY-5153. Compilation in parallel with
+ * update of statistics sometimes failed on debug builds.
+ *
+ * The test case should be disabled until the bug is fixed.
+ */
+ public void disabled_testParallelCompilationAndUpdate() throws Exception {
+ setAutoCommit(false);
+
+ // Create and populate a test table with a multi-column index.
+ Statement s = createStatement();
+ s.execute("create table derby5153(a int, b int, c int, d int)");
+ s.execute("create index idx on derby5153(a,b,c,d)");
+
+ PreparedStatement ins =
+ prepareStatement("insert into derby5153 values (1,2,3,4)");
+ for (int i = 0; i < 100; i++) {
+ ins.execute();
+ }
+
+ commit();
+
+ // Start a thread that repeatedly updates the statistics for IDX.
+ Connection updateConn = openDefaultConnection();
+ IndexUpdateThread t =
+ new IndexUpdateThread(updateConn, "APP", "DERBY5153", "IDX");
+ t.start();
+
+ try {
+
+ // Compile/execute the query a number of times while the index
+ // statistics are being updated. This often failed with an assert
+ // failure in debug builds before DERBY-5153.
+ for (int i = 0; i < 100; i++) {
+ ResultSet rs = s.executeQuery(
+ "select * from derby5153 t1, derby5153 t2 " +
+ "where t1.a = t2.a");
+ rs.close();
+ }
+
+ } finally {
+
+ // Let the update thread know we're done.
+ t.done = true;
+
+ }
+
+ t.join();
+
+ // Check if the update thread failed, and report if it did.
+ if (t.exception != null) {
+ throw t.exception;
+ }
+
+ updateConn.close();
+ }
+
+ /**
+ * A thread class that repeatedly calls SYSCS_UTIL.SYSCS_UPDATE_STATISTICS
+ * until the flag {@code done} is set to true. Any exception thrown during
+ * the lifetime of the thread can be found in the field {@code exception}.
+ */
+ private static class IndexUpdateThread extends Thread {
+ private final CallableStatement updateStats;
+ private volatile boolean done;
+ private Exception exception;
+
+ private IndexUpdateThread(
+ Connection c, String schema, String table, String index)
+ throws SQLException {
+ updateStats = c.prepareCall(
+ "call syscs_util.syscs_update_statistics(?,?,?)");
+ updateStats.setString(1, schema);
+ updateStats.setString(2, table);
+ updateStats.setString(3, index);
+ }
+
+ public void run() {
+ try {
+ while (!done) {
+ updateStats.execute();
+ }
+ updateStats.close();
+ } catch (Exception e) {
+ this.exception = e;
+ }
+ }
+ }
}