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 rh...@apache.org on 2014/05/21 18:54:56 UTC
svn commit: r1596619 - in /db/derby/code/trunk/java:
engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java
testing/org/apache/derbyTesting/functionTests/tests/lang/IdentitySequenceTest.java
Author: rhillegas
Date: Wed May 21 16:54:55 2014
New Revision: 1596619
URL: http://svn.apache.org/r1596619
Log:
DERBY-6542: Raise LockTimeout when there is too much contention on an identity column; commit derby-6542-03-aa-lockTimeoutForIdentityContention.diff.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/IdentitySequenceTest.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java?rev=1596619&r1=1596618&r2=1596619&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/catalog/SequenceUpdater.java Wed May 21 16:54:55 2014
@@ -37,6 +37,7 @@ import org.apache.derby.iapi.services.pr
import org.apache.derby.shared.common.sanity.SanityManager;
import org.apache.derby.iapi.sql.conn.LanguageConnectionContext;
import org.apache.derby.iapi.sql.dictionary.BulkInsertCounter;
+import org.apache.derby.iapi.sql.dictionary.SchemaDescriptor;
import org.apache.derby.iapi.sql.dictionary.SequenceDescriptor;
import org.apache.derby.iapi.store.access.AccessFactory;
import org.apache.derby.iapi.store.access.TransactionController;
@@ -176,10 +177,18 @@ public abstract class SequenceUpdater im
* and identities. See DERBY-5426.
* </p>
*/
- protected StandardException tooMuchContentionException()
+ private StandardException tooMuchContentionException()
{
- return StandardException.newException
- ( SQLState.LANG_TOO_MUCH_CONTENTION_ON_SEQUENCE, _sequenceGenerator.getName() );
+ // If the sequence lives in the SYS schema, then it is used to back an identity column.
+ if ( SchemaDescriptor.STD_SYSTEM_SCHEMA_NAME.equals( _sequenceGenerator.getSchemaName() ) )
+ {
+ return StandardException.newException( SQLState.LOCK_TIMEOUT );
+ }
+ else
+ {
+ return StandardException.newException
+ ( SQLState.LANG_TOO_MUCH_CONTENTION_ON_SEQUENCE, _sequenceGenerator.getName() );
+ }
}
///////////////////////////////////////////////////////////////////////////////////
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/IdentitySequenceTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/IdentitySequenceTest.java?rev=1596619&r1=1596618&r2=1596619&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/IdentitySequenceTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/IdentitySequenceTest.java Wed May 21 16:54:55 2014
@@ -338,6 +338,44 @@ public class IdentitySequenceTest extend
);
}
+ /**
+ * <p>
+ * Test that too much contention on an identity column raises a LOCK_TIMEOUT.
+ * </p>
+ */
+ public void test_003_identityTimeout()
+ throws Exception
+ {
+ Connection conn = getConnection();
+
+ goodStatement( conn, "call syscs_util.syscs_set_database_property( 'derby.locks.waitTimeout', '1' )" );
+ goodStatement( conn, "create table t_timeout( a int generated always as identity, b int )" );
+ conn.setAutoCommit( false );
+
+ try {
+ PreparedStatement ps = chattyPrepare( conn, "select count(*) from sys.syssequences with rs\n" );
+ getScalarInteger( ps );
+ expectExecutionError( conn, LOCK_TIMEOUT, "insert into t_timeout( b ) values ( 1 )" );
+ }
+ finally
+ {
+ conn.setAutoCommit( true );
+ goodStatement( conn, "call syscs_util.syscs_set_database_property( 'derby.locks.waitTimeout', '60' )" );
+ }
+ }
+ /** Get a scalar integer result from a query */
+ private int getScalarInteger( PreparedStatement ps ) throws Exception
+ {
+ ResultSet rs = ps.executeQuery();
+ rs.next();
+ int retval = rs.getInt( 1 );
+
+ rs.close();
+ ps.close();
+
+ return retval;
+ }
+
///////////////////////////////////////////////////////////////////////////////////
//
// MINIONS