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 dj...@apache.org on 2007/09/06 20:09:11 UTC

svn commit: r573329 - in /db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe: client/Submitter.java load/SimpleInsert.java run/Populate.java run/ThreadPopulate.java test/OperationsTester.java util/OERandom.java

Author: djd
Date: Thu Sep  6 11:09:09 2007
New Revision: 573329

URL: http://svn.apache.org/viewvc?rev=573329&view=rev
Log:
Various improvements in the Order Entry setup, consistent random number handling to match TPC-C spec. Add a option to load the database using multiple threads for the run.Populate class

Removed:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/run/ThreadPopulate.java
Modified:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/client/Submitter.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/load/SimpleInsert.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/run/Populate.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/test/OperationsTester.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/util/OERandom.java

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/client/Submitter.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/client/Submitter.java?rev=573329&r1=573328&r2=573329&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/client/Submitter.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/client/Submitter.java Thu Sep  6 11:09:09 2007
@@ -21,6 +21,9 @@
 
 import java.io.PrintStream;
 import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 
 import org.apache.derbyTesting.system.oe.util.OERandom;
 
@@ -104,6 +107,40 @@
      * Record of how many transactions are implemented.
      */
     private final int[] transactionCount;
+    
+    /**
+     * Generate a new random number generator
+     * that follows the rules according to 2.1.6.1
+     * @param conn
+     * @return
+     * @throws SQLException
+     */
+    public static OERandom getRuntimeRandom(Connection conn)
+        throws SQLException
+    {
+        OERandom rand = new OERandom(-1);
+        
+        ResultSet rs = conn.createStatement().executeQuery(
+                "SELECT CLOAD FROM C");
+        rs.next();
+        int cload = rs.getInt(1);
+        rs.close();
+        
+        for (;;)
+        {
+            int c = rand.randomInt(0, 255);
+            int delta = Math.abs(cload - c);
+            if (delta == 96 || delta == 112)
+                continue;
+            if (delta < 65 || delta > 119)
+                continue;
+            
+            rand = new OERandom(c);
+            break;
+        }
+        
+        return rand;
+    }
 
     public Submitter(Display display, Operations ops, OERandom rand,
             short maxW)
@@ -118,12 +155,31 @@
     }
     
     /**
+     * Run a fixed number of transactions returning the
+     * time in milli-seconds required to execute all of them.
+     * @param displayData Passed onto Display calls
+     * @param count Number of transactions to run
+     * @return Elapsed time in ms to run count transactions
+     * @throws Exception
+     */
+    public long runTransactions(final Object displayData, final int count)
+    throws Exception
+    {
+        long startms = System.currentTimeMillis();
+        for (int i = 0; i < count; i++)
+            runTransaction(displayData);
+        long endms = System.currentTimeMillis();
+        
+        return endms - startms;
+    }
+    
+    /**
      * Run an order entry transaction picking the specific
      * transaction at random with a hard-coded mix.
      * @param displayData Passed onto Display calls
      * @throws Exception Error executing the transaction
      */
-    public void runTransaction(Object displayData) throws Exception
+    public void runTransaction(final Object displayData) throws Exception
     {       
         int chooseType = rand.randomInt(1, 100);
         
@@ -172,7 +228,7 @@
      * @param chooseType Random number between 1 and 100 inclusive.
      * @return A transaction constant from this class.
      */
-    protected int mixType(int chooseType)
+    protected int mixType(final int chooseType)
     {
         if (chooseType <= 43)
         {

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/load/SimpleInsert.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/load/SimpleInsert.java?rev=573329&r1=573328&r2=573329&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/load/SimpleInsert.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/load/SimpleInsert.java Thu Sep  6 11:09:09 2007
@@ -71,14 +71,14 @@
             // ignore
         }
         conn.commit();
-        s.execute("CREATE TABLE C(CLOAD INT, CLAST INT, CID INT, CITEM INT)");
+        s.execute("CREATE TABLE C(CLOAD INT)");
         conn.commit();
 
-        random = new OERandom(-1, -1, -1, seed);
+        random = new OERandom(-1, seed);
 
         // Section 2.1.6.1 of TPC-C spec
         int loadRandomFactor = random.randomInt(0, 255);
-        s.execute("INSERT INTO C VALUES(" + loadRandomFactor + ", -1, -1, -1)");
+        s.execute("INSERT INTO C VALUES(" + loadRandomFactor + ")");
         s.close();
         conn.commit();  
         
@@ -108,7 +108,7 @@
         rs.next();
         int loadRandomFactor = rs.getInt(1);
         rs.close();
-        random = new OERandom(loadRandomFactor, -1, -1, seed);
+        random = new OERandom(loadRandomFactor, seed);
         s.close();
         conn.commit();
     }

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/run/Populate.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/run/Populate.java?rev=573329&r1=573328&r2=573329&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/run/Populate.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/run/Populate.java Thu Sep  6 11:09:09 2007
@@ -19,19 +19,17 @@
  */
 package org.apache.derbyTesting.system.oe.run;
 
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.security.PrivilegedActionException;
 import java.sql.SQLException;
 
+import javax.sql.DataSource;
+
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.apache.derbyTesting.junit.JDBCDataSource;
 import org.apache.derbyTesting.junit.JDBCPerfTestCase;
 import org.apache.derbyTesting.system.oe.client.Load;
-import org.apache.derbyTesting.system.oe.load.SimpleInsert;
-import org.apache.derbyTesting.system.oe.run.Checks;
-import org.apache.derbyTesting.system.oe.run.Schema;
+import org.apache.derbyTesting.system.oe.load.ThreadInsert;
 
 /**
  * Driver to do the load phase for the Order Entry benchmark.
@@ -43,6 +41,7 @@
  * <LI>-scale warehouse scaling factor. Takes a short value. If not specified defaults to 1
  * <LI>-createConstraintsBeforeLoad create constraints before initial load of data, takes a boolean value. If not specified, defaults to true
  * <LI>-doChecks check consistency of data, takes a boolean value. If not specified, defaults to true
+ * <LI>-loaderThreads Number of threads to populate tables, defaults to number of cores
  * <LI>-help prints usage
  * </OL>
  * 
@@ -66,6 +65,11 @@
      * Warehouse scale factor
      */
     static short scale = 1;
+    
+    /**
+     * Number of threads to load the data.
+     */
+    static int loaderThreads;
 
     /**
      * flag to indicate if we should create constraints before loading data
@@ -77,11 +81,6 @@
      * after the load
      */
     private static boolean doChecks = true;
-    
-    /**
-     * Load implementation used to populate the database
-     */
-    Load loader;
 
     /**
      * Create a test case with the given name.
@@ -95,20 +94,6 @@
 
 
     /**
-     * Do the initial setup required Initialize the appropriate implementation
-     * for the Load phase.
-     */
-    protected void setUp() throws Exception {
-        // Use simple insert statements to insert data.
-        // currently only this form of load is present, once we have 
-        // different implementations, the loading mechanism will need
-        // to be configurable taking an option from the command line
-        // arguments.
-       loader = new SimpleInsert();
-       loader.setupLoad(getConnection(), scale);
-    }
-
-    /**
      * Run OE load
      * @param args supply arguments for benchmark.
      * @throws Exception
@@ -135,6 +120,8 @@
                 createConstraintsBeforeLoad = (args[++i].equals("false")? false:true);
             } else if (arg.equals("-doChecks")) {
                 doChecks = (args[++i].equals("false")? false:true);
+            } else if (arg.equals("-loaderThreads")) {
+                loaderThreads = Integer.parseInt(args[++i]);
             } else if (arg.equals("-help")) {
                 printUsage();
                 System.exit(0);
@@ -153,6 +140,7 @@
         System.out.println("  -scale warehouse scaling factor. Takes a short value. If not specified defaults to 1");
         System.out.println("  -createConstraintsBeforeLoad create constraints before initial load of data, takes a boolean value. If not specified, defaults to true)");
         System.out.println("  -doChecks check consistency of data, takes a boolean value. If not specified, defaults to true)");
+        System.out.println("  -loaderThreads number of threads used to populate database, defaults to number of cpu cores)");
         System.out.println("  -help prints usage");
         System.out.println();
     }
@@ -163,11 +151,10 @@
      * @return the tests to run
      */
     public static Test suite() {
-        return loaderSuite(Populate.class);
-    }
-    
-    static Test loaderSuite(Class loader) {
+
         TestSuite suite = new TestSuite("Order Entry");
+        
+        suite.addTest(new Populate("testCreateDB"));
 
         // Create Schema
         Schema.addBaseSchema(suite);
@@ -175,7 +162,7 @@
             Schema.addConstraints(suite);
         
         // this will populate db
-        suite.addTestSuite(loader);
+        suite.addTest(new Populate("testLoad"));
 
         if (!createConstraintsBeforeLoad)
             Schema.addConstraints(suite);
@@ -192,6 +179,16 @@
         return suite;
     }
 
+    public void testCreateDB() throws SQLException
+    {
+        DataSource ds = JDBCDataSource.getDataSource();
+        
+        JDBCDataSource.setBeanProperty(ds,
+                "createDatabase", "create");
+ 
+        ds.getConnection().close();
+
+    }
 
     /**
      * test the initial database load
@@ -199,6 +196,19 @@
      * @throws Exception
      */
     public void testLoad() throws Exception {
+        
+        // Use simple insert statements to insert data.
+        // currently only this form of load is present, once we have 
+        // different implementations, the loading mechanism will need
+        // to be configurable taking an option from the command line
+        // arguments.
+        DataSource ds = JDBCDataSource.getDataSource();
+       
+        Load loader = new ThreadInsert(ds);
+        loader.setupLoad(getConnection(), scale);
+        if (loaderThreads > 0)
+            loader.setThreadCount(loaderThreads);
+        
         loader.populateAllTables();
 
         // Way to populate data is extensible. Any other implementation

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/test/OperationsTester.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/test/OperationsTester.java?rev=573329&r1=573328&r2=573329&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/test/OperationsTester.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/test/OperationsTester.java Thu Sep  6 11:09:09 2007
@@ -42,17 +42,18 @@
 public class OperationsTester extends BaseJDBCTestCase implements Display {
 
     private Operations ops;
-    private final OERandom rand;
+    private OERandom rand;
     private final short w = 1;
     
     public OperationsTester(String name) {
         super(name);
-        this.rand = new OERandom(-1, -1, -1);
+        
     }
     
     protected void setUp() throws Exception 
     {
         ops = new Standard(getConnection());
+        rand = Submitter.getRuntimeRandom(getConnection());
     }
     
     protected void tearDown() throws Exception
@@ -242,25 +243,32 @@
         
     }
     
+    /**
+     * Test submitting transactions through Submitter,
+     * as individual transactions and as a block.
+     * @throws Exception
+     */
     public void testSubmitter() throws Exception
     {
         Submitter submitter = new Submitter(this, this.ops, this.rand,
                 (short) 1);
         
         int tranCount = 37;
-        
         for (int i = 0; i < tranCount; i++)
         {
             submitter.runTransaction(null);
         }
         
+        int tranCount2 = 47;
+        submitter.runTransactions(null, tranCount2);
+        
         int[] executeCounts = submitter.getTransactionCount();
         int totalTran = 0;
         for (int i = 0; i < executeCounts.length; i++)
             totalTran += executeCounts[i];
         
         assertEquals("Mismatch on Submitter transaction count",
-                tranCount, totalTran);
+                tranCount + tranCount2, totalTran);
         
     }
 }

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/util/OERandom.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/util/OERandom.java?rev=573329&r1=573328&r2=573329&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/util/OERandom.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/system/oe/util/OERandom.java Thu Sep  6 11:09:09 2007
@@ -39,18 +39,32 @@
     protected final int Cid;
 
     protected final int Citem;
+    
+    /**
+     * Create a matching OERandom, for use in multi-threaded
+     * runs where all the submitters need to share the same
+     * Clast, Cid and Citem values.
+     * @param oer
+     */
+    public OERandom(OERandom oer) {
+        rand = new Random(System.currentTimeMillis());
+        Clast = oer.Clast;
+        Cid = oer.Cid;
+        Citem = oer.Citem;
+    }
 
-    public OERandom(int last, int id, int item, long seed) {
+    public OERandom(int last, long seed) {
 
-        Clast = last;
-        Cid = id;
-        Citem = item;
         rand = new Random(seed);
+        Clast = last;
+        Cid = this.randomInt(0, 255);
+        Citem = this.randomInt(0, 255);
+        
         initAStrings();
     }
 
-    public OERandom(int last, int id, int item) {
-        this(last, id, item, System.currentTimeMillis());
+    public OERandom(int last) {
+        this(last, System.currentTimeMillis());
     }
 
     private static int[] RESCALE = { 0, 10, 100, 1000, 10000, 100000, 1000000 };