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 ma...@apache.org on 2011/10/05 20:38:43 UTC

svn commit: r1179374 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients: Runner.java SequenceGeneratorConcurrency.java

Author: mamta
Date: Wed Oct  5 18:38:43 2011
New Revision: 1179374

URL: http://svn.apache.org/viewvc?rev=1179374&view=rev
Log:
DERBY--5445 (Enhance existing concurrency test to stress sequence generators to also stress identity columns)

DERBY-4565 added a concurrency test to stress sequence generation. I am making simple modifications to that test to add	identity column stress testing. Based on a command line parameter, the test will either do sequence generation testing or identity column testing. If no parameter is specified, it will default to doing sequene generation testing.

The test already takes number of parameters. One of those parameters is load options parameter. Load option parameter is indicated by -load_opts on command line and it is followed by a comma separated list of sub-parameters. An eg of load option parameter is as follows
-load_opts debugging=1,numberOfGenerators=5,tablesPerGenerator=10,insertsPerTransaction=100
I am adding another pair to the comma separated sub-parameters,namely identityTest=aNumber. If identityTest is 1, then the test will do identity column stress testing. For any other value for identityTest, the test will do sequence generation testing. If the user doesn't specify identityTest in load options, the test will perform sequence generation testing. 

eg of asking the test to do identity column testing
java org.apache.derbyTesting.perf.clients.Runner -driver org.apache.derby.jdbc.EmbeddedDriver -init -load seq_gen -load_opts debugging=1,numberOfGenerators=5,tablesPerGenerator=10,insertsPerTransaction=100,identityTest=1 -gen b2b -threads 10

Two possible way of asking the test to do sequence generation testing(identityTest set to a value other than 1 or identityTest is not specified)
java org.apache.derbyTesting.perf.clients.Runner -driver org.apache.derby.jdbc.EmbeddedDriver -init -load seq_gen -load_opts debugging=1,numberOfGenerators=5,tablesPerGenerator=10,insertsPerTransaction=100,identityTest=2 -gen b2b -threads 10
OR
java org.apache.derbyTesting.perf.clients.Runner -driver org.apache.derby.jdbc.EmbeddedDriver -init -load seq_gen -load_opts debugging=1,numberOfGenerators=5,tablesPerGenerator=10,insertsPerTransaction=100 -gen b2b -threads 10

When I run the test for identity columns, I can consistently see it running into derby lock time out with nested sequencec contention error while trying to get current identity value and advancing(this is what we want to achieve from the test ie that it is able to stress the functionality enough to run into contention while trying to get next range for identity columns.) Additionally, there are some lock time out errors raised by store while trying to update system catalog(this is expected too because of multiple threads simulataneously trying to do inserts into a table with identity column). I also in my codeline reverted to changes before DERBY-5426 (DERBY-4526 is Improve the error raised by too much contention on a sequence/identity.) was fixed and saw sequence contention errors (without the lock time out error encapsulation).



Modified:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients/Runner.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients/SequenceGeneratorConcurrency.java

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients/Runner.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients/Runner.java?rev=1179374&r1=1179373&r2=1179374&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients/Runner.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients/Runner.java Wed Oct  5 18:38:43 2011
@@ -93,7 +93,10 @@ public class Runner {
         if (init) {
             DBFiller filler = getDBFiller();
             Connection conn = DriverManager.getConnection(url, user, password);
-            System.out.println("initializing database...");
+            System.out.print("initializing database for ");
+            System.out.println((Runner.getLoadOpt( "identityTest", 0 ) == 1)?
+            				"identity column testing...":
+            				"sequence generator testing...");
             filler.fill(conn);
             conn.close();
         }
@@ -250,6 +253,9 @@ public class Runner {
 "            - tablesPerGenerator: number of tables to create per sequence\n" +
 "            - insertsPerTransaction: number of inserts to perform per transaction\n" +
 "            - debugging: 1 means print debug chatter, 0 means do not print the chatter\n" +
+"            - identityTest: 1 means do identity column testing, any other number \n" +
+"                    means do sequence generator testing. If no identityTest is specified \n" +
+"                    then sequence generator testing will be done by default \n" +
 "  -load_opts: comma-separated list of load-specific options\n" +
 "  -gen: load generator, default: b2b, valid types:\n" +
 "      * b2b - clients perform operations back-to-back\n" +
@@ -259,7 +265,6 @@ public class Runner {
 "         load generator is \"poisson\", default: 100\n" +
 "  -wt: warmup time in seconds, default: 30\n" +
 "  -rt: time in seconds to collect results, default: 60";
-
     /**
      * Print the usage string.
      *

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients/SequenceGeneratorConcurrency.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients/SequenceGeneratorConcurrency.java?rev=1179374&r1=1179373&r2=1179374&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients/SequenceGeneratorConcurrency.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/perf/clients/SequenceGeneratorConcurrency.java Wed Oct  5 18:38:43 2011
@@ -32,7 +32,7 @@ import java.util.Random;
 
 /**
  * <p>
- * Machinery to test the concurrency of sequence generators.
+ * Machinery to test the concurrency of sequence/identity generators.
  * </p>
  */
 public class SequenceGeneratorConcurrency
@@ -53,6 +53,7 @@ public class SequenceGeneratorConcurrenc
         private int _numberOfGenerators;
         private int _tablesPerGenerator;
         private int _insertsPerTransaction;
+        private boolean _runIdentityTest;
         private boolean _debugging;
 
         public LoadOptions()
@@ -60,6 +61,8 @@ public class SequenceGeneratorConcurrenc
             _numberOfGenerators = Runner.getLoadOpt( "numberOfGenerators", 1 );
             _tablesPerGenerator = Runner.getLoadOpt( "tablesPerGenerator", 1 );
             _insertsPerTransaction = Runner.getLoadOpt( "insertsPerTransaction", 1 );
+            //If no identityTest is specified, then do sequence testing.
+            _runIdentityTest = ( Runner.getLoadOpt( "identityTest", 0 ) == 1);
             _debugging = ( Runner.getLoadOpt( "debugging", 0 ) == 1 );
         }
 
@@ -75,6 +78,9 @@ public class SequenceGeneratorConcurrenc
         /** Return whether we are in debugging mode */
         public boolean debugging() { return _debugging; }
 
+        /** Return whether we are doing identity column testing */
+        public boolean runIdentityTest() { return _runIdentityTest; }
+
         public String toString()
         {
             StringBuffer buffer = new StringBuffer();
@@ -83,6 +89,7 @@ public class SequenceGeneratorConcurrenc
             buffer.append( " generators = " + _numberOfGenerators );
             buffer.append( ", tablesPerGenerator = " + _tablesPerGenerator );
             buffer.append( ", insertsPerTransaction = " + _insertsPerTransaction );
+            buffer.append( ", identityTest = " + _runIdentityTest );
             buffer.append( ", debugging = " + _debugging );
             buffer.append( " )" );
 
@@ -115,14 +122,19 @@ public class SequenceGeneratorConcurrenc
         {
             int numberOfGenerators = _loadOptions.getNumberOfGenerators();
             int tablesPerGenerator = _loadOptions.getTablesPerGenerator();
+            boolean runIdentityTest = _loadOptions.runIdentityTest();
 
             for ( int sequence = 0; sequence < numberOfGenerators; sequence++ )
             {
-                runDDL( conn, "create sequence " + makeSequenceName( sequence ) );
+            	if (!runIdentityTest)
+                    runDDL( conn, "create sequence " + makeSequenceName( sequence ) );
 
                 for ( int table = 1; table <= tablesPerGenerator; table++ )
                 {
-                    runDDL( conn, "create table " + makeTableName( sequence, table ) + "( a int )" );
+                	if (runIdentityTest)
+                        runDDL( conn, "create table " + makeTableName( sequence, table ) + "( a int, b int generated always as identity)" );
+                	else
+                        runDDL( conn, "create table " + makeTableName( sequence, table ) + "( a int )" );
                 }
             }
         }
@@ -183,6 +195,7 @@ public class SequenceGeneratorConcurrenc
             int numberOfGenerators = _loadOptions.getNumberOfGenerators();
             int tablesPerGenerator = _loadOptions.getTablesPerGenerator();
             boolean debugging = _loadOptions.debugging();
+            boolean runIdentityTest = _loadOptions.runIdentityTest();
 
             for ( int sequence = 0; sequence < numberOfGenerators; sequence++ )
             {
@@ -195,8 +208,18 @@ public class SequenceGeneratorConcurrenc
                     PreparedStatement ps;
                     String valuesClause = "values ( next value for " + sequenceName + " )";
 
-                    if ( table == 0 ) { ps = prepareStatement( _conn, debugging, valuesClause ); }
-                    else { ps = prepareStatement( _conn, debugging, "insert into " + tableName + "( a ) " + valuesClause ); }
+                    if ( table == 0 ){
+                    	if(!runIdentityTest) 
+                        	ps = prepareStatement( _conn, debugging, valuesClause );
+                    	else
+                        	ps = prepareStatement( _conn, debugging, "values (1)" );
+                    }
+                    else { 
+                    	if(!runIdentityTest) 
+                            ps = prepareStatement( _conn, debugging, "insert into " + tableName + "( a ) " + valuesClause ); 
+                    	else
+                        	ps = prepareStatement( _conn, debugging, "insert into " + tableName + "( a ) values(1)"); 
+                	}
                     
                     _psArray[ sequence ][ table ] = ps;
                 }