From: Martin Zaun Date: June 7 2011 7:51pm Subject: bzr commit into mysql-5.1-telco-7.1 branch (martin.zaun:4239) List-Archive: http://lists.mysql.com/commits/138815 Message-Id: <201106071951.p57JpCKb012562@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============5857718435417134379==" --===============5857718435417134379== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///Users/mz/mysql/ndb-7.1/ based on revid:martin.zaun@stripped 4239 Martin Zaun 2011-06-07 [merge] crund - merge from ndb-7.1-dbg64 modified: storage/ndb/test/crund/config_samples/crundClusterj.properties storage/ndb/test/crund/config_samples/crundDerby.properties storage/ndb/test/crund/config_samples/crundMysql.properties storage/ndb/test/crund/config_samples/crundNdbapi.properties storage/ndb/test/crund/config_samples/crundNdbj.properties storage/ndb/test/crund/config_samples/crundNdbjtie.properties storage/ndb/test/crund/config_samples/crundOpenjpaClusterj.properties storage/ndb/test/crund/config_samples/crundOpenjpaDerby.properties storage/ndb/test/crund/config_samples/crundOpenjpaMysql.properties storage/ndb/test/crund/config_samples/crundRun.properties storage/ndb/test/crund/config_samples/env.properties storage/ndb/test/crund/src/com/mysql/cluster/crund/ClusterjLoad.java storage/ndb/test/crund/src/com/mysql/cluster/crund/CrundDriver.java storage/ndb/test/crund/src/com/mysql/cluster/crund/Driver.java storage/ndb/test/crund/src/com/mysql/cluster/crund/JdbcLoad.java storage/ndb/test/crund/src/com/mysql/cluster/crund/JpaLoad.java storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbApiLoad.java storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbJTieLoad.java storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbjLoad.java storage/ndb/test/crund/src/com/mysql/cluster/crund/ResultProcessor.java storage/ndb/test/crund/src/crundndb/Driver.cpp storage/ndb/test/crund/src/crundndb/Driver.hpp === modified file 'storage/ndb/test/crund/config_samples/crundClusterj.properties' --- a/storage/ndb/test/crund/config_samples/crundClusterj.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/crundClusterj.properties 2011-06-07 14:12:24 +0000 @@ -1,4 +1,4 @@ -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -13,7 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - # XXX NPE with clusterj if field = null #exclude=setVarbinary1,setVarbinary1_batch,getVarbinary1,getVarbinary1_batch,setVarbinary10,setVarbinary10_batch,getVarbinary10,getVarbinary10_batch,setVarbinary100,setVarbinary100_batch,getVarbinary100,getVarbinary100_batch #exclude=navA->B0 === modified file 'storage/ndb/test/crund/config_samples/crundDerby.properties' --- a/storage/ndb/test/crund/config_samples/crundDerby.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/crundDerby.properties 2011-06-07 14:12:24 +0000 @@ -1,5 +1,4 @@ -# Copyright 2010 Sun Microsystems, Inc. -# All rights reserved. Use is subject to license terms. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -14,7 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - # not implemented by other backends yet #exclude=setBlob1000,getBlob1000,setBlob10000,getBlob10000,setBlob100000,getBlob100000,setText1000,getText1000,setText10000,getText10000,setText100000,getText100000 #exclude=navA->B0,navA->B0_opt === modified file 'storage/ndb/test/crund/config_samples/crundMysql.properties' --- a/storage/ndb/test/crund/config_samples/crundMysql.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/crundMysql.properties 2011-06-07 14:12:24 +0000 @@ -1,4 +1,4 @@ -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -13,7 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - # blobs seem to work but not implemented in other backends yet exclude=setBlob1000,setBlob1000_batch,getBlob1000,getBlob1000_batch,setBlob10000,setBlob10000_batch,getBlob10000,getBlob10000_batch,setBlob100000,setBlob100000_batch,getBlob100000,getBlob100000_batch,setText1000,setText1000_batch,getText1000,getText1000_batch,setText10000,setText10000_batch,getText10000,getText10000_batch,setText100000,setText100000_batch,getText100000,getText100000_batch === modified file 'storage/ndb/test/crund/config_samples/crundNdbapi.properties' --- a/storage/ndb/test/crund/config_samples/crundNdbapi.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/crundNdbapi.properties 2011-06-07 14:12:24 +0000 @@ -1,4 +1,4 @@ -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -13,7 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - #exclude=navA->B0,navA->B0_forceSend,navA->B0_alt,navA->B0_alt_forceSend #exclude=navA->B0_alt,navA->B0_alt_forceSend #exclude=navA->B0_alt_forceSend === modified file 'storage/ndb/test/crund/config_samples/crundNdbj.properties' --- a/storage/ndb/test/crund/config_samples/crundNdbj.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/crundNdbj.properties 2011-06-07 14:12:24 +0000 @@ -1,5 +1,4 @@ -# Copyright 2010 Sun Microsystems, Inc. -# All rights reserved. Use is subject to license terms. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -14,7 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - # throws exceptions, see NdbjLoad.java #exclude=navA->B0,navA->B0_forceSend,navA->B0_alt,navA->B0_alt_forceSend === modified file 'storage/ndb/test/crund/config_samples/crundNdbjtie.properties' --- a/storage/ndb/test/crund/config_samples/crundNdbjtie.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/crundNdbjtie.properties 2011-06-07 14:12:24 +0000 @@ -1,4 +1,4 @@ -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -13,7 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - # XXX not yet implemented by NdbJTie #exclude=setVarbinary1,setVarbinary1_batch,getVarbinary1,getVarbinary1_batch,setVarchar1,setVarchar1_batch,getVarchar1,getVarchar1_batch,setVarbinary10,setVarbinary10_batch,getVarbinary10,getVarbinary10_batch,setVarchar10,setVarchar10_batch,getVarchar10,getVarchar10_batch,setVarbinary100,setVarbinary100_batch,getVarbinary100,getVarbinary100_batch,setVarchar100,setVarchar100_batch,getVarchar100,getVarchar100_batch,setB0->A,setB0->A_batch,navB0->A,navB0->A_batch,navB0->A_alt,navB0->A_alt_batch,navA->B0,navA->B0_forceSend,navA->B0_alt,navA->B0_alt_forceSend,nullB0->A,nullB0->A_batch #exclude=navA->B0,navA->B0_forceSend,navA->B0_alt,navA->B0_alt_forceSend === modified file 'storage/ndb/test/crund/config_samples/crundOpenjpaClusterj.properties' --- a/storage/ndb/test/crund/config_samples/crundOpenjpaClusterj.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/crundOpenjpaClusterj.properties 2011-06-07 14:12:24 +0000 @@ -1,4 +1,4 @@ -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -13,7 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - #exclude=navA->B0,navA->B0_opt #exclude=setAByPK_bulk,setB0ByPK_bulk,setAByPK,setB0ByPK,getAByPK,getB0ByPK === modified file 'storage/ndb/test/crund/config_samples/crundOpenjpaDerby.properties' --- a/storage/ndb/test/crund/config_samples/crundOpenjpaDerby.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/crundOpenjpaDerby.properties 2011-06-07 14:12:24 +0000 @@ -1,5 +1,4 @@ -# Copyright 2010 Sun Microsystems, Inc. -# All rights reserved. Use is subject to license terms. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -14,7 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - #exclude=navA->B0,navA->B0_opt # JPA - Derby connection settings === modified file 'storage/ndb/test/crund/config_samples/crundOpenjpaMysql.properties' --- a/storage/ndb/test/crund/config_samples/crundOpenjpaMysql.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/crundOpenjpaMysql.properties 2011-06-07 14:12:24 +0000 @@ -1,5 +1,4 @@ -# Copyright 2010 Sun Microsystems, Inc. -# All rights reserved. Use is subject to license terms. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -14,7 +13,6 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - #exclude=navA->B0,navA->B0_opt # OpenJPA - MySQL JDBC connection settings === modified file 'storage/ndb/test/crund/config_samples/crundRun.properties' --- a/storage/ndb/test/crund/config_samples/crundRun.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/crundRun.properties 2011-06-07 17:37:44 +0000 @@ -13,12 +13,15 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -# the benchmark's metrics: measure time, memory use -logRealTime=true -logCpuTime=true -logMemUsage=false -includeFullGC=false -logSumOfOps=true +# the number of warmup and finally recorded runs +nRuns=1 +#nRuns=20 + +# the pattern/execution modes to be run +#xMode= +#xMode=INDY +#xMode=INDY,BULK +xMode=INDY,EACH,BULK # optional number of ops per transaction with a scale factor #nOpsStart=4 @@ -43,6 +46,13 @@ maxVarcharChars=100 maxBlobBytes=100000 maxTextChars=100000 +# the benchmark's metrics: measure time, memory use +logRealTime=true +logCpuTime=true +logMemUsage=false +includeFullGC=false +logSumOfOps=true + # whether operations or connections are to be renewed after a run renewOperations=false renewConnection=false @@ -50,27 +60,22 @@ renewConnection=false # whether data objects can be cached/reused after a transaction allowExtendedPC=false -# the number of warmup and finally recorded runs -warmupRuns=0 -hotRuns=1 -#hotRuns=20 - # CURRENT LIMITS: # # ndbd errors (increase SendBufferMemory) at: -# aEnd, bEnd >= 65536 +# nOps >= 65536 # # ndbapi@(A=16384, B=16384) fails at running out of MaxNoOfLocalOperations # increase the correlated from default MaxNoOfConcurrentOperations=32768 # MaxNoOfConcurrentOperations=65536 # # msqld errors with JDBC (increase MaxNoOfConcurrentOperations) at: -# aEnd, bEnd >= 16384 +# nOps >= 16384 # # NdbApi (driver+load) at: -# aEnd, bEnd >= 4096: +# nOps >= 4096: # -# ClusterJ breaks in navA->B0,navA->B0_opt at: aEnd, bEnd >= 4096 +# ClusterJ breaks in navA->B0,navA->B0_opt at: nOps >= 4096 # clusterj@(A=4096, B=4096) fails at MaxNoOfConcurrentTransactions=4096 # clusterj@(A=16384, B=16384) fails at MaxNoOfConcurrentTransactions=16384 #MaxNoOfConcurrentTransactions=16384 === modified file 'storage/ndb/test/crund/config_samples/env.properties' --- a/storage/ndb/test/crund/config_samples/env.properties 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/config_samples/env.properties 2011-06-07 14:12:24 +0000 @@ -1,4 +1,4 @@ -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -11,7 +11,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # Common Configuration File included by Ant, Makefile, and Shell Scripts @@ -37,8 +37,8 @@ HOME=/Users/mz # no quotes (interpreted by ant): #MYSQL_HOME=${HOME}/mysql/bin-7.1-opt32 #MYSQL_HOME=${HOME}/mysql/bin-7.1-dbg32 -MYSQL_HOME=${HOME}/mysql/bin-7.1-opt64 -#MYSQL_HOME=${HOME}/mysql/bin-7.1-dbg64 +#MYSQL_HOME=${HOME}/mysql/bin-7.1-opt64 +MYSQL_HOME=${HOME}/mysql/bin-7.1-dbg64 #MYSQL_HOME="${HOME}/bin/mysql-cluster-gpl-6.3.20" # must match architecture of MYSQL_HOME @@ -63,7 +63,8 @@ MYSQL_LIBEXEC="$MYSQL_HOME/libexec" # - Martin's Little Helpers utilities (see below) #JAVA_INCLUDEOPTS=-I"/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Headers" -JAVA_INCLUDEOPTS=-I"/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Headers" +#JAVA_INCLUDEOPTS=-I"/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Headers" +JAVA_INCLUDEOPTS=-I"/System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers" #JAVA_INCLUDEOPTS=-I"/usr/lib/jvm/java-6-sun/include" -I"/usr/lib/jvm/java-6-sun/include/linux" # Comments: @@ -163,7 +164,7 @@ CLUSTERJPA_JAR=${MYSQL_CLUSTERJ}/share/m # Must be set & valid for running # - JdbcLoad on MySQL -MYSQL_JDBC_JAR=${HOME}/mysql/lib/mysql-connector-java-5.1.11-bin.jar +MYSQL_JDBC_JAR=${HOME}/mysql/lib/mysql-connector-java-5.1.16-bin.jar # Comments: # - get from here: @@ -195,12 +196,12 @@ JPA_API_JAR=${HOME}/mysql/lib/geronimo-j # Must be set & valid for running # - JpaLoad on OpenJPA -JTA_API_JAR=${HOME}/mysql/lib/geronimo-jta_1.1_spec-1.1.jar +JTA_API_JAR=${HOME}/mysql/lib/geronimo-jta_1.1_spec-1.1.1.jar OPENJPA_JAR=${HOME}/mysql/lib/openjpa-1.2.2.jar SERP_JAR=${HOME}/mysql/lib/serp-1.13.1.jar -COMMONS_LANG_JAR=${HOME}/mysql/lib/commons-lang-2.1.jar -COMMONS_COLLECTIONS_JAR=${HOME}/mysql/lib/commons-collections-3.2.jar -COMMONS_POOL_JAR=${HOME}/mysql/lib/commons-pool-1.3.jar +COMMONS_LANG_JAR=${HOME}/mysql/lib/commons-lang-2.4.jar +COMMONS_COLLECTIONS_JAR=${HOME}/mysql/lib/commons-collections-3.2.1.jar +COMMONS_POOL_JAR=${HOME}/mysql/lib/commons-pool-1.5.3.jar # Comments: # - included in the binary release === modified file 'storage/ndb/test/crund/src/com/mysql/cluster/crund/ClusterjLoad.java' --- a/storage/ndb/test/crund/src/com/mysql/cluster/crund/ClusterjLoad.java 2011-06-02 21:43:17 +0000 +++ b/storage/ndb/test/crund/src/com/mysql/cluster/crund/ClusterjLoad.java 2011-06-07 14:12:24 +0000 @@ -92,14 +92,9 @@ public class ClusterjLoad extends CrundD } @Override - protected void init() throws Exception { - super.init(); - - // load native library (better diagnostics doing it explicitely) - out.println(); - //loadSystemLibrary("ndbj"); - - // instantiate NDB cluster singleton + protected void initLoad() throws Exception { + // XXX support generic load class + //super.init(); out.println(); out.print("creating SessionFactory ..."); @@ -109,7 +104,8 @@ public class ClusterjLoad extends CrundD } @Override - protected void close() throws Exception { + protected void closeLoad() throws Exception { + out.println(); out.print("closing SessionFactory ..."); out.flush(); if (sessionFactory != null) @@ -117,7 +113,8 @@ public class ClusterjLoad extends CrundD sessionFactory = null; out.println(" [ok]"); - super.close(); + // XXX support generic load class + //super.close(); } // ---------------------------------------------------------------------- @@ -577,19 +574,21 @@ public class ClusterjLoad extends CrundD // ---------------------------------------------------------------------- protected void initConnection() { - out.print("creating Session ..."); + out.println(); + out.print("creating ClusterJ Session ..."); out.flush(); session = sessionFactory.getSession(); - out.println(" [Session: 1]"); + out.println(" [Session: 1]"); } protected void closeConnection() { - out.print("closing Session ..."); + out.println(); + out.print("closing ClusterJ Session ..."); out.flush(); if (session != null) session.close(); session = null; - out.println(" [ok]"); + out.println(" [ok]"); } protected void clearPersistenceContext() { === modified file 'storage/ndb/test/crund/src/com/mysql/cluster/crund/CrundDriver.java' --- a/storage/ndb/test/crund/src/com/mysql/cluster/crund/CrundDriver.java 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/src/com/mysql/cluster/crund/CrundDriver.java 2011-06-07 17:37:44 +0000 @@ -22,6 +22,7 @@ package com.mysql.cluster.crund; import java.util.Properties; import java.util.List; import java.util.Set; +import java.util.EnumSet; import java.util.HashSet; import java.util.ArrayList; import java.util.Date; @@ -33,7 +34,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.io.InputStream; - /** * This class benchmarks standard database operations over a series * of transactions on an increasing data set. @@ -55,7 +55,10 @@ import java.io.InputStream; */ abstract public class CrundDriver extends Driver { + enum XMode { INDY, EACH, BULK } + // benchmark settings + protected final EnumSet< XMode > xMode = EnumSet.noneOf(XMode.class); protected boolean renewConnection; protected boolean renewOperations; protected boolean logSumOfOps; @@ -74,12 +77,61 @@ abstract public class CrundDriver extend // ---------------------------------------------------------------------- protected void init() throws Exception { + out.println(); + out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + out.println("initializing benchmark ..."); + out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); super.init(); - // do work here + +/* + // XXX support multiple load instances + // initialize load classes + if (doJdbc) { + assert (jdbcLoad == null); + jdbcLoad = new JdbcLoad(this); + jdbcLoad.init(); + } + if (doClusterj) { + assert (clusterjLoad == null); + clusterjLoad = new ClusterjLoad(this); + clusterjLoad.init(); + } + if (doNdbjtie) { + assert (ndbjtieLoad == null); + ndbjtieLoad = new NdbjtieLoad(this); + ndbjtieLoad.init(); + } +*/ + initLoad(); } protected void close() throws Exception { - // do work here + out.println(); + out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + out.println("closing benchmark ..."); + out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + +/* + // XXX support multiple load instances + // close load classes + if (doJdbc) { + assert (jdbcLoad != null); + jdbcLoad.close(); + jdbcLoad = null; + } + if (doClusterj) { + assert (clusterjLoad != null); + clusterjLoad.close(); + clusterjLoad = null; + } + if (doNdbjtie) { + assert (ndbjtieLoad != null); + ndbjtieLoad.close(); + ndbjtieLoad = null; + } +*/ + closeLoad(); + super.close(); } @@ -91,6 +143,13 @@ abstract public class CrundDriver extend final StringBuilder msg = new StringBuilder(); final String eol = System.getProperty("line.separator"); + // parse execution modes + final String[] xm = props.getProperty("xMode", "").split(","); + for (int i = 0; i < xm.length; i++) { + if (!"".equals(xm[i])) + xMode.add(XMode.valueOf(XMode.class, xm[i])); + } + renewConnection = parseBoolean("renewConnection", false); renewOperations = parseBoolean("renewOperations", false); logSumOfOps = parseBoolean("logSumOfOps", true); @@ -158,6 +217,7 @@ abstract public class CrundDriver extend out.println(); out.println("crund settings ..."); + out.println("xMode: " + xMode); out.println("renewConnection: " + renewConnection); out.println("renewOperations: " + renewOperations); out.println("logSumOfOps: " + logSumOfOps); @@ -176,6 +236,7 @@ abstract public class CrundDriver extend // benchmark operations // ---------------------------------------------------------------------- + // XXX move to generic load class // a database operation to be benchmarked protected abstract class Op { final protected String name; @@ -187,6 +248,7 @@ abstract public class CrundDriver extend public abstract void run(int nOps) throws Exception; }; + // XXX move to generic load class // the list of database operations to be benchmarked protected final List ops = new ArrayList(); @@ -195,36 +257,63 @@ abstract public class CrundDriver extend abstract protected void closeOperations() throws Exception; protected void runTests() throws Exception { - out.println(); - initConnection(); - initOperations(); - + initConnections(); + runLoads(); + closeConnections(); + } + + protected void runLoads() throws Exception { +/* + // XXX support multiple load instances + if (doJdbc) + runLoads(jdbcLoad); + if (doClusterj) + runLoads(clusterjLoad); + if (doNdbjtie) + runLoads(ndbjtieLoad); +*/ + runLoad(); + } + + protected void runLoad() throws Exception { assert (nOpsStart <= nOpsEnd && nOpsScale > 1); for (int i = nOpsStart; i <= nOpsEnd; i *= nOpsScale) { try { - runLoads(i); + out.println(); + out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + // XXX support multiple load instances + //out.print("running load nOps = " + i + " on " + // + load.getDescriptor()); + out.println("running load [" + i + " nOps] on " + descr); + out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + runSeries(i); } catch (Exception ex) { // already in rollback for database/orm exceptions throw ex; } } - - out.println(); - out.println("------------------------------------------------------------"); - out.println(); - - clearData(); - closeOperations(); - closeConnection(); } - protected void runLoads(int nOps) throws Exception { - out.println(); - out.println("------------------------------------------------------------"); + protected void runSeries(int nOps) throws Exception { + if (nRuns == 0) + return; // nothing to do - out.println("running operations ..." - + " [nOps=" + nOps + "]"); + for (int i = 1; i <= nRuns; i++) { + out.println(); + out.println("------------------------------------------------------------"); + out.println("run " + i + " of " + nRuns + " [" + nOps + " nOps]"); + out.println("------------------------------------------------------------"); + // XXX runLoad(load); + runLoad(nOps); + } + + // XXX support multiple load instances + //writeLogBuffers(load.getDescriptor()); + writeLogBuffers(descr); + clearLogBuffers(); + } + protected void runLoad(int nOps) throws Exception { // log buffers if (logRealTime) { rtimes.append(nOps); @@ -237,6 +326,7 @@ abstract public class CrundDriver extend // pre-run cleanup if (renewConnection) { + // XXX move to generic load class? closeOperations(); closeConnection(); initConnection(); @@ -247,7 +337,7 @@ abstract public class CrundDriver extend } clearData(); - runOperations(nOps); + runSequence(nOps); if (logSumOfOps) { out.println(); @@ -284,7 +374,8 @@ abstract public class CrundDriver extend } } - protected void runOperations(int nOps) throws Exception { + // XXX move to generic load class + protected void runSequence(int nOps) throws Exception { for (Op op : ops) { // pre-tx cleanup if (!allowExtendedPC) { @@ -292,11 +383,12 @@ abstract public class CrundDriver extend // any data/result caches before the next transaction clearPersistenceContext(); } - runOp(op, nOps); + runOperation(op, nOps); } } - protected void runOp(Op op, int nOps) throws Exception { + // XXX move to generic load class + protected void runOperation(Op op, int nOps) throws Exception { final String name = op.getName(); if (!exclude.contains(name)) { begin(name); @@ -305,6 +397,7 @@ abstract public class CrundDriver extend } } + // XXX move to generic load class // reports an error if a condition is not met static protected final void verify(boolean cond) { //assert (cond); @@ -312,6 +405,7 @@ abstract public class CrundDriver extend throw new RuntimeException("data verification failed."); } + // XXX move to generic load class static protected final void verify(int exp, int act) { if (exp != act) throw new RuntimeException("data verification failed:" @@ -319,6 +413,7 @@ abstract public class CrundDriver extend + ", actual = " + act); } + // XXX move to generic load class static protected final void verify(String exp, String act) { if ((exp == null && act != null) || (exp != null && !exp.equals(act))) @@ -331,6 +426,7 @@ abstract public class CrundDriver extend // helpers // ---------------------------------------------------------------------- + // XXX move to generic load class static final protected String myString(int n) { final StringBuilder s = new StringBuilder(); switch (n) { @@ -361,6 +457,7 @@ abstract public class CrundDriver extend return s.toString(); } + // XXX move to generic load class static final protected byte[] myBytes(String s) { final char[] c = s.toCharArray(); final int n = c.length; @@ -369,6 +466,7 @@ abstract public class CrundDriver extend return b; } + // XXX move to generic load class // some string and byte constants static final protected String string1 = myString(1); static final protected String string2 = myString(2); @@ -393,6 +491,63 @@ abstract public class CrundDriver extend // datastore operations // ---------------------------------------------------------------------- + protected void initConnections() throws Exception { + out.println(); + out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + out.println("initializing connections ..."); + out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + +/* + // XXX support multiple load instances + if (doJdbc) { + assert (jdbcLoad != null); + jdbcLoad.initConnection(); + } + if (doClusterj) { + assert (clusterjLoad != null); + clusterjLoad.initConnection(); + } + if (doNdbjtie) { + assert (ndbjtieLoad != null); + ndbjtieLoad.initConnection(); + } +*/ + initConnection(); + + // XXX move to generic load class + initOperations(); + } + + protected void closeConnections() throws Exception { + out.println(); + out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + out.println("closing connections ..."); + out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); + + // XXX move to generic load class + clearData(); + closeOperations(); + + closeConnection(); +/* + // XXX support multiple load instances + if (doJdbc) { + assert (jdbcLoad != null); + jdbcLoad.closeConnection(); + } + if (doClusterj) { + assert (clusterjLoad != null); + clusterjLoad.closeConnection(); + } + if (doNdbjtie) { + assert (ndbjtieLoad != null); + ndbjtieLoad.closeConnection(); + } +*/ + } + + abstract protected void initLoad() throws Exception; + abstract protected void closeLoad() throws Exception; abstract protected void initConnection() throws Exception; abstract protected void closeConnection() throws Exception; abstract protected void clearPersistenceContext() throws Exception; === modified file 'storage/ndb/test/crund/src/com/mysql/cluster/crund/Driver.java' --- a/storage/ndb/test/crund/src/com/mysql/cluster/crund/Driver.java 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/src/com/mysql/cluster/crund/Driver.java 2011-06-07 14:12:24 +0000 @@ -70,8 +70,7 @@ abstract public class Driver { protected boolean logRealTime; protected boolean logMemUsage; protected boolean includeFullGC; - protected int warmupRuns; - protected int hotRuns; + protected int nRuns; // driver resources protected PrintWriter log; @@ -144,49 +143,7 @@ abstract public class Driver { public void run() { try { init(); - - if (warmupRuns > 0) { - out.println(); - out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - out.println("warmup runs ..."); - out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - - for (int i = 0; i < warmupRuns; i++) { - runTests(); - } - - // truncate log file, reset log buffers - closeLogFile(); - openLogFile(); - header = new StringBuilder(); - rtimes = new StringBuilder(); - musage = new StringBuilder(); - logHeader = true; - } - - if (hotRuns > 0) { - out.println(); - out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - out.println("hot runs ..."); - out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); - - for (int i = 0; i < hotRuns; i++) { - runTests(); - } - - // write log buffers - if (logRealTime) { - log.println(descr + ", rtime[ms]" - + header.toString() + endl - + rtimes.toString() + endl + endl + endl); - } - if (logMemUsage) { - log.println(descr + ", net musage[KiB]" - + header.toString() + endl - + musage.toString() + endl + endl + endl); - } - } - + runTests(); close(); } catch (Exception ex) { // end the program regardless of threads @@ -251,17 +208,13 @@ abstract public class Driver { initProperties(); printProperties(); openLogFile(); - - // clear log buffers - logHeader = true; - header = new StringBuilder(); - rtimes = new StringBuilder(); - musage = new StringBuilder(); + clearLogBuffers(); } // releases the driver's resources. protected void close() throws Exception { - // clear log buffers + // release log buffers + logHeader = false; header = null; rtimes = null; musage = null; @@ -319,16 +272,10 @@ abstract public class Driver { logMemUsage = parseBoolean("logMemUsage", false); includeFullGC = parseBoolean("includeFullGC", false); - warmupRuns = parseInt("warmupRuns", 0); - if (warmupRuns < 0) { - msg.append("[ignored] warmupRuns: " + warmupRuns + eol); - warmupRuns = 0; - } - - hotRuns = parseInt("hotRuns", 1); - if (hotRuns < 1) { - msg.append("[ignored] hotRuns: " + hotRuns + eol); - hotRuns = 1; + nRuns = parseInt("nRuns", 1); + if (nRuns < 1) { + msg.append("[ignored] nRuns: " + nRuns + eol); + nRuns = 1; } if (msg.length() == 0) { @@ -346,8 +293,7 @@ abstract public class Driver { out.println("logRealTime: " + logRealTime); out.println("logMemUsage: " + logMemUsage); out.println("includeFullGC: " + includeFullGC); - out.println("warmupRuns: " + warmupRuns); - out.println("hotRuns: " + hotRuns); + out.println("nRuns: " + nRuns); } // opens the benchmark's data log file @@ -359,6 +305,7 @@ abstract public class Driver { // closes the benchmark's data log file private void closeLogFile() throws IOException { + out.println(); out.print("closing files ..."); out.flush(); if (log != null) { @@ -374,6 +321,30 @@ abstract public class Driver { abstract protected void runTests() throws Exception; + protected void clearLogBuffers() { + logHeader = true; + header = new StringBuilder(); + if (logRealTime) { + rtimes = new StringBuilder(); + } + if (logMemUsage) { + musage = new StringBuilder(); + } + } + + protected void writeLogBuffers(String descr) { + if (logRealTime) { + log.println(descr + ", rtime[ms]" + + header.toString() + endl + + rtimes.toString() + endl); + } + if (logMemUsage) { + log.println(descr + ", net musage[KiB]" + + header.toString() + endl + + musage.toString() + endl); + } + } + protected void begin(String name) { out.println(); out.println(name); === modified file 'storage/ndb/test/crund/src/com/mysql/cluster/crund/JdbcLoad.java' --- a/storage/ndb/test/crund/src/com/mysql/cluster/crund/JdbcLoad.java 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/src/com/mysql/cluster/crund/JdbcLoad.java 2011-06-07 17:37:44 +0000 @@ -39,7 +39,6 @@ public class JdbcLoad extends CrundDrive protected String url; protected String user; protected String password; - protected boolean autoCommit; // JDBC resources protected Connection conn; @@ -80,13 +79,6 @@ public class JdbcLoad extends CrundDrive user = props.getProperty("jdbc.user"); password = props.getProperty("jdbc.password"); - // single ops not supported yet - autoCommit = parseBoolean("jdbc.autoCommit", false); - if (autoCommit) { - msg.append("[ignored] autoCommit: " + autoCommit + eol); - autoCommit = false; - } - if (msg.length() == 0) { out.println(" [ok]"); } else { @@ -107,7 +99,16 @@ public class JdbcLoad extends CrundDrive out.println("jdbc.url: " + url); out.println("jdbc.user: \"" + user + "\""); out.println("jdbc.password: \"" + password + "\""); - out.println("jdbc.autoCommit: " + autoCommit); + } + + protected void initLoad() throws Exception { + // XXX support generic load class + //super.init(); + } + + protected void closeLoad() throws Exception { + // XXX support generic load class + //super.close(); } // ---------------------------------------------------------------------- @@ -159,62 +160,65 @@ public class JdbcLoad extends CrundDrive out.print("initializing statements ..."); out.flush(); - for (boolean f = false, done = false; !done; done = f, f = true) { + for (CrundDriver.XMode m : xMode) { // inner classes can only refer to a constant - final boolean batch = f; - final boolean ignore = f; - final boolean setAttrs = true; + final CrundDriver.XMode mode = m; ops.add( - new JdbcOp("insA" + (batch ? "_batch" : ""), + new JdbcOp("insA_" + mode.toString().toLowerCase(), "INSERT INTO a (id) VALUES (?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("insB0" + (batch ? "_batch" : ""), + new JdbcOp("insB0_" + mode.toString().toLowerCase(), "INSERT INTO b0 (id) VALUES (?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("setAByPK" + (batch ? "_batch" : ""), + new JdbcOp("setAByPK_" + mode.toString().toLowerCase(), "UPDATE a a SET a.cint = ?, a.clong = ?, a.cfloat = ?, a.cdouble = ? WHERE (a.id = ?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { // refactor by numbered args stmt.setInt(1, i); @@ -222,27 +226,29 @@ public class JdbcLoad extends CrundDrive stmt.setInt(3, i); stmt.setInt(4, i); stmt.setInt(5, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("setB0ByPK" + (batch ? "_batch" : ""), + new JdbcOp("setB0ByPK_" + mode.toString().toLowerCase(), "UPDATE b0 b0 SET b0.cint = ?, b0.clong = ?, b0.cfloat = ?, b0.cdouble = ? WHERE (b0.id = ?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { // refactor by numbered args stmt.setInt(1, i); @@ -250,86 +256,63 @@ public class JdbcLoad extends CrundDrive stmt.setInt(3, i); stmt.setInt(4, i); stmt.setInt(5, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp((batch ? "getAllA_asc" : "getAByPK"), - "SELECT id, cint, clong, cfloat, cdouble FROM a " - + (batch ? "ORDER BY id ASC" : "WHERE (id = ?)")) { + new JdbcOp("getAByPK_" + mode.toString().toLowerCase(), + "SELECT id, cint, clong, cfloat, cdouble FROM a WHERE (id = ?)") { public void run(int nOps) throws SQLException { - if (batch) { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); + for (int i = 1; i <= nOps; i++) { + stmt.setInt(1, i); ResultSet rs = stmt.executeQuery(); - for (int i = 1; i <= nOps; i++) { - rs.next(); - final int id = rs.getInt(1); - verify(id == i); - final int j = getCommonAttributes(rs); - verify(j == id); - } + rs.next(); + final int id = rs.getInt(1); + verify(id == i); + final int j = getCommonAttributes(rs); + verify(j == id); verify(!rs.next()); rs.close(); - } else { - for (int i = 1; i <= nOps; i++) { - stmt.setInt(1, i); - ResultSet rs = stmt.executeQuery(); - rs.next(); - final int id = rs.getInt(1); - verify(id == i); - final int j = getCommonAttributes(rs); - verify(j == id); - verify(!rs.next()); - rs.close(); - } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp((batch ? "getAllB0_asc" : "getB0ByPK"), - "SELECT id, cint, clong, cfloat, cdouble FROM b0 " - + (batch ? "ORDER BY id ASC" : "WHERE (id = ?)")) { + new JdbcOp("getB0ByPK_" + mode.toString().toLowerCase(), + "SELECT id, cint, clong, cfloat, cdouble FROM b0 WHERE (id = ?)") { public void run(int nOps) throws SQLException { - if (batch) { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); + for (int i = 1; i <= nOps; i++) { + stmt.setInt(1, i); ResultSet rs = stmt.executeQuery(); - for (int i = 1; i <= nOps; i++) { - rs.next(); - final int id = rs.getInt(1); - verify(id == i); - final int j = getCommonAttributes(rs); - verify(j == id); - } + rs.next(); + final int id = rs.getInt(1); + verify(id == i); + final int j = getCommonAttributes(rs); + verify(j == id); verify(!rs.next()); rs.close(); - } else { - for (int i = 1; i <= nOps; i++) { - stmt.setInt(1, i); - ResultSet rs = stmt.executeQuery(); - rs.next(); - final int id = rs.getInt(1); - verify(id == i); - final int j = getCommonAttributes(rs); - verify(j == id); - verify(!rs.next()); - rs.close(); - } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); @@ -338,35 +321,36 @@ public class JdbcLoad extends CrundDrive assert l == b.length; ops.add( - new JdbcOp("setVarbinary" + l + (batch ? "_batch" : ""), + new JdbcOp("setVarbinary" + l + "_" + mode.toString().toLowerCase(), "UPDATE b0 b0 SET b0.cvarbinary_def = ? WHERE (b0.id = ?)") { - public void run(int nOps) - throws SQLException { + public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setBytes(1, b); stmt.setInt(2, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("getVarbinary" + l, + new JdbcOp("getVarbinary" + l + "_" + mode.toString().toLowerCase(), "SELECT cvarbinary_def FROM b0 WHERE (id = ?)") { - public void run(int nOps) - throws SQLException { + public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); ResultSet rs = stmt.executeQuery(); @@ -376,31 +360,33 @@ public class JdbcLoad extends CrundDrive verify(!rs.next()); rs.close(); } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("clearVarbinary" + l + (batch ? "_batch" : ""), + new JdbcOp("clearVarbinary" + l + "_" + mode.toString().toLowerCase(), "UPDATE b0 b0 SET b0.cvarbinary_def = NULL WHERE (b0.id = ?)") { - public void run(int nOps) - throws SQLException { + public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); } @@ -410,35 +396,36 @@ public class JdbcLoad extends CrundDrive assert l == s.length(); ops.add( - new JdbcOp("setVarchar" + l + (batch ? "_batch" : ""), + new JdbcOp("setVarchar" + l + "_" + mode.toString().toLowerCase(), "UPDATE b0 b0 SET b0.cvarchar_def = ? WHERE (b0.id = ?)") { - public void run(int nOps) - throws SQLException { + public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setString(1, s); stmt.setInt(2, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("getVarchar" + l, + new JdbcOp("getVarchar" + l + "_" + mode.toString().toLowerCase(), "SELECT cvarchar_def FROM b0 WHERE (id = ?)") { - public void run(int nOps) - throws SQLException { + public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); ResultSet rs = stmt.executeQuery(); @@ -448,31 +435,33 @@ public class JdbcLoad extends CrundDrive verify(!rs.next()); rs.close(); } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("clearVarchar" + l + (batch ? "_batch" : ""), + new JdbcOp("clearVarchar" + l + "_" + mode.toString().toLowerCase(), "UPDATE b0 b0 SET b0.cvarchar_def = NULL WHERE (b0.id = ?)") { - public void run(int nOps) - throws SQLException { + public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); } @@ -483,35 +472,36 @@ public class JdbcLoad extends CrundDrive assert l == b.length; ops.add( - new JdbcOp("setBlob" + l + (batch ? "_batch" : ""), + new JdbcOp("setBlob" + l + "_" + mode.toString().toLowerCase(), "UPDATE b0 b0 SET b0.cblob_def = ? WHERE (b0.id = ?)") { - public void run(int nOps) - throws SQLException { + public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setBytes(1, b); stmt.setInt(2, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("getBlob" + l, + new JdbcOp("getBlob" + l + "_" + mode.toString().toLowerCase(), "SELECT cblob_def FROM b0 WHERE (id = ?)") { - public void run(int nOps) - throws SQLException { + public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); ResultSet rs = stmt.executeQuery(); @@ -521,7 +511,8 @@ public class JdbcLoad extends CrundDrive verify(!rs.next()); rs.close(); } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); } @@ -533,35 +524,36 @@ public class JdbcLoad extends CrundDrive assert l == s.length(); ops.add( - new JdbcOp("setText" + l + (batch ? "_batch" : ""), + new JdbcOp("setText" + l + "_" + mode.toString().toLowerCase(), "UPDATE b0 b0 SET b0.ctext_def = ? WHERE (b0.id = ?)") { - public void run(int nOps) - throws SQLException { + public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setString(1, s); stmt.setInt(2, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("getText" + l, + new JdbcOp("getText" + l + "_" + mode.toString().toLowerCase(), "SELECT ctext_def FROM b0 WHERE (id = ?)") { - public void run(int nOps) - throws SQLException { + public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); ResultSet rs = stmt.executeQuery(); @@ -571,41 +563,45 @@ public class JdbcLoad extends CrundDrive verify(!rs.next()); rs.close(); } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); } } ops.add( - new JdbcOp("setB0->A" + (batch ? "_batch" : ""), + new JdbcOp("setB0->A_" + mode.toString().toLowerCase(), "UPDATE b0 b0 SET b0.a_id = ? WHERE (b0.id = ?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { int aId = ((i - 1) % nOps) + 1; stmt.setInt(1, aId); stmt.setInt(2, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("navB0->A_subsel", + new JdbcOp("navB0->A_subsel_" + mode.toString().toLowerCase(), "SELECT id, cint, clong, cfloat, cdouble FROM a WHERE id = (SELECT b0.a_id FROM b0 b0 WHERE b0.id = ?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); ResultSet rs = stmt.executeQuery(); @@ -617,14 +613,16 @@ public class JdbcLoad extends CrundDrive verify(!rs.next()); rs.close(); } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("navB0->A_joinproj", + new JdbcOp("navB0->A_joinproj_" + mode.toString().toLowerCase(), "SELECT a.id, a.cint, a.clong, a.cfloat, a.cdouble FROM a a, b0 b0 WHERE (a.id = b0.a_id AND b0.id = ?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); ResultSet rs = stmt.executeQuery(); @@ -636,12 +634,13 @@ public class JdbcLoad extends CrundDrive verify(!rs.next()); rs.close(); } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("navB0->A_2stmts", + new JdbcOp("navB0->A_2stmts_" + mode.toString().toLowerCase(), "SELECT id, cint, clong, cfloat, cdouble FROM a WHERE id = ?") { protected PreparedStatement stmt0; @@ -658,6 +657,7 @@ public class JdbcLoad extends CrundDrive } public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { // fetch a.id stmt0.setInt(1, i); @@ -678,14 +678,16 @@ public class JdbcLoad extends CrundDrive verify(!rs.next()); rs.close(); } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("navA->B0", + new JdbcOp("navA->B0_" + mode.toString().toLowerCase(), "SELECT id, cint, clong, cfloat, cdouble FROM b0 WHERE (a_id = ?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); int cnt = 0; for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); @@ -700,146 +702,161 @@ public class JdbcLoad extends CrundDrive rs.close(); } verify(cnt == nOps); - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("nullB0->A" + (batch ? "_batch" : ""), + new JdbcOp("nullB0->A_" + mode.toString().toLowerCase(), "UPDATE b0 b0 SET b0.a_id = NULL WHERE (b0.id = ?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( // MySQL rejects this syntax: "DELETE FROM b0 b0 WHERE b0.id = ?" - new JdbcOp("delB0ByPK" + (batch ? "_batch" : ""), + new JdbcOp("delB0ByPK_" + mode.toString().toLowerCase(), "DELETE FROM b0 WHERE id = ?") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( // MySQL rejects this syntax: "DELETE FROM a a WHERE a.id = ?" - new JdbcOp("delAByPK" + (batch ? "_batch" : ""), + new JdbcOp("delAByPK_" + mode.toString().toLowerCase(), "DELETE FROM a WHERE id = ?") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("insA_attr" + (batch ? "_batch" : ""), + new JdbcOp("insA_attr_" + mode.toString().toLowerCase(), "INSERT INTO a (id, cint, clong, cfloat, cdouble) VALUES (?, ?, ?, ?, ?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); setCommonAttributes(stmt, -i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("insB0_attr" + (batch ? "_batch" : ""), + new JdbcOp("insB0_attr_" + mode.toString().toLowerCase(), "INSERT INTO b0 (id, cint, clong, cfloat, cdouble) VALUES (?, ?, ?, ?, ?)") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); for (int i = 1; i <= nOps; i++) { stmt.setInt(1, i); setCommonAttributes(stmt, -i); - if (batch) { + if (mode == CrundDriver.XMode.BULK) { stmt.addBatch(); } else { int cnt = stmt.executeUpdate(); verify(cnt == 1); } } - if (batch) { + if (mode == CrundDriver.XMode.BULK) { int[] cnts = stmt.executeBatch(); for (int i = 0; i < cnts.length; i++) { verify(cnts[i] == 1); } } - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("delAllB0", + new JdbcOp("delAllB0_" + mode.toString().toLowerCase(), "DELETE FROM b0") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); int cnt = stmt.executeUpdate(); verify(cnt == nOps); - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); ops.add( - new JdbcOp("delAllA", + new JdbcOp("delAllA_" + mode.toString().toLowerCase(), "DELETE FROM a") { public void run(int nOps) throws SQLException { + conn.setAutoCommit(mode == CrundDriver.XMode.INDY); int cnt = stmt.executeUpdate(); verify(cnt == nOps); - conn.commit(); + if (mode != CrundDriver.XMode.INDY) + conn.commit(); } }); } @@ -867,17 +884,54 @@ public class JdbcLoad extends CrundDrive // ---------------------------------------------------------------------- protected void initConnection() throws SQLException { - out.print("initializing connection ..."); + assert (conn == null); + + out.println(); + out.println("initializing jdbc resources ..."); + + out.println(); + out.print("creating jdbc connection ..."); out.flush(); conn = DriverManager.getConnection(url, user, password); - conn.setAutoCommit(autoCommit); + // XXX remove this default when fully implemented all of XMode + conn.setAutoCommit(false); delAllA = conn.prepareStatement("DELETE FROM a"); delAllB0 = conn.prepareStatement("DELETE FROM b0"); - out.println(" [Conn: 1]"); + out.println(" [ok: " + url + "]"); + + out.print("setting isolation level ..."); + out.flush(); + // ndb storage engine only supports READ_COMMITTED + final int il = Connection.TRANSACTION_READ_COMMITTED; + conn.setTransactionIsolation(il); + out.print(" [ok: "); + switch (conn.getTransactionIsolation()) { + case Connection.TRANSACTION_READ_UNCOMMITTED: + out.print("READ_UNCOMMITTED"); + break; + case Connection.TRANSACTION_READ_COMMITTED: + out.print("READ_COMMITTED"); + break; + case Connection.TRANSACTION_REPEATABLE_READ: + out.print("REPEATABLE_READ"); + break; + case Connection.TRANSACTION_SERIALIZABLE: + out.print("SERIALIZABLE"); + break; + default: + assert false; + } + out.println("]"); } protected void closeConnection() throws SQLException { - out.print("closing connection ..."); + assert (conn != null); + + out.println(); + out.println("releasing jdbc resources ..."); + + out.println(); + out.print("closing jdbc connection ..."); out.flush(); if (delAllB0 != null) delAllB0.close(); @@ -888,7 +942,7 @@ public class JdbcLoad extends CrundDrive if (conn != null) conn.close(); conn = null; - out.println(" [ok]"); + out.println(" [ok]"); } protected void clearPersistenceContext() { @@ -896,6 +950,7 @@ public class JdbcLoad extends CrundDrive } protected void clearData() throws SQLException { + conn.setAutoCommit(false); out.print("deleting all rows ..."); out.flush(); int delB0 = delAllB0.executeUpdate(); === modified file 'storage/ndb/test/crund/src/com/mysql/cluster/crund/JpaLoad.java' --- a/storage/ndb/test/crund/src/com/mysql/cluster/crund/JpaLoad.java 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/src/com/mysql/cluster/crund/JpaLoad.java 2011-06-07 14:12:24 +0000 @@ -137,26 +137,29 @@ public class JpaLoad extends CrundDriver out.println("openjpa.ndb.database: " + ndbDatabase); } - protected void init() throws Exception { - super.init(); + protected void initLoad() throws Exception { + // XXX support generic load class + //super.init(); out.println(); - out.print("creating EMFactory ..."); + out.print("creating JPA EMFactory ..."); out.flush(); // create EMF by standard API, which allows vendors to pool factories emf = Persistence.createEntityManagerFactory("crundjpa", props); - out.println(" [EMF: 1]"); + out.println(" [EMF: 1]"); } - protected void close() throws Exception { - out.print("closing EMFactory ..."); + protected void closeLoad() throws Exception { + out.println(); + out.print("closing JPA EMFactory ..."); out.flush(); if (emf != null) emf.close(); emf = null; - out.println(" [ok]"); + out.println(" [ok]"); - super.close(); + // XXX support generic load class + //super.close(); } // ---------------------------------------------------------------------- @@ -602,7 +605,8 @@ public class JpaLoad extends CrundDriver // ---------------------------------------------------------------------- protected void initConnection() { - out.print("creating EntityManager ..."); + out.println(); + out.print("creating JPA EntityManager ..."); out.flush(); // See: clearPersistenceContext() for !allowExtendedPC // Tx-scope EM supported by JPA only by container injection: @@ -619,18 +623,19 @@ public class JpaLoad extends CrundDriver //query.setHint("eclipselink.join-fetch", "e.address"); delAllA = em.createQuery("DELETE FROM A"); delAllB0 = em.createQuery("DELETE FROM B0"); - out.println(" [EM: 1]"); + out.println(" [EM: 1]"); } protected void closeConnection() { - out.print("closing EntityManager ..."); + out.println(); + out.print("closing JPA EntityManager ..."); out.flush(); delAllB0 = null; delAllA = null; if (em != null) em.close(); em = null; - out.println(" [ok]"); + out.println(" [ok]"); } protected void clearPersistenceContext() { === modified file 'storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbApiLoad.java' --- a/storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbApiLoad.java 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbApiLoad.java 2011-06-07 14:12:24 +0000 @@ -35,8 +35,9 @@ public class NdbApiLoad extends NdbBase static protected native int ndbinit(String mgmd_host_portno); static protected native int ndbclose(); - protected void init() throws Exception { - super.init(); + protected void initLoad() throws Exception { + // XXX support generic load class + //super.init(); // load dependent libs first out.println(); @@ -53,7 +54,7 @@ public class NdbApiLoad extends NdbBase } } - protected void close() throws Exception { + protected void closeLoad() throws Exception { // release NDB resources final int ret = ndbclose(); if (ret != 0) { @@ -62,7 +63,9 @@ public class NdbApiLoad extends NdbBase err.println(msg); throw new Exception(msg); } - super.close(); + + // XXX support generic load class + //super.close(); } // ---------------------------------------------------------------------- === modified file 'storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbJTieLoad.java' --- a/storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbJTieLoad.java 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbJTieLoad.java 2011-06-07 14:12:24 +0000 @@ -78,8 +78,9 @@ public class NdbJTieLoad extends NdbBase descr = "->ndbjtie(" + mgmdConnect + ")"; } - protected void init() throws Exception { - super.init(); + protected void initLoad() throws Exception { + // XXX support generic load class + //super.init(); // load native library (better diagnostics doing it explicitely) out.println(); @@ -109,14 +110,17 @@ public class NdbJTieLoad extends NdbBase out.println(" [ok: " + mgmdConnect + "]"); } - protected void close() throws Exception { - out.print("closing mgmd conn ..."); + protected void closeLoad() throws Exception { + out.println(); + out.print("closing mgmd connection ..."); out.flush(); if (mgmd != null) Ndb_cluster_connection.delete(mgmd); mgmd = null; - out.println(" [ok]"); - super.close(); + out.println(" [ok]"); + + // XXX support generic load class + //super.close(); } // ---------------------------------------------------------------------- @@ -895,8 +899,10 @@ public class NdbJTieLoad extends NdbBase // ---------------------------------------------------------------------- protected void initConnection() { + out.println(); + // optionally, connect and wait for reaching the data nodes (ndbds) - out.print("waiting for data nodes..."); + out.print("waiting for ndbd ..."); out.flush(); final int initial_wait = 10; // secs to wait until first node detected final int final_wait = 0; // secs to wait after first node detected @@ -907,10 +913,10 @@ public class NdbJTieLoad extends NdbBase out.println(msg); throw new RuntimeException(msg); } - out.println(" [ok]"); + out.println(" [ok]"); // connect to database - out.print("connecting to database..."); + out.print("connecting to ndbd ..."); out.flush(); ndb = Ndb.create(mgmd, catalog, schema); final int max_no_tx = 10; // maximum number of parallel tx (<=1024) @@ -919,19 +925,20 @@ public class NdbJTieLoad extends NdbBase String msg = "Error caught: " + ndb.getNdbError().message(); throw new RuntimeException(msg); } - out.println(" [ok]"); + out.println(" [ok]"); // initialize the schema shortcuts model = new Model(ndb); } protected void closeConnection() { - out.print("closing database conn ..."); + out.println(); + out.print("closing ndbd connection ..."); out.flush(); model = null; Ndb.delete(ndb); ndb = null; - out.println(" [ok]"); + out.println(" [ok]"); } protected void clearData() { === modified file 'storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbjLoad.java' --- a/storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbjLoad.java 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/src/com/mysql/cluster/crund/NdbjLoad.java 2011-06-07 14:12:24 +0000 @@ -73,8 +73,9 @@ public class NdbjLoad extends NdbBase { descr = "->ndbj->ndbapi(" + mgmdConnect + ")"; } - protected void init() throws Exception { - super.init(); + protected void initLoad() throws Exception { + // XXX support generic load class + //super.init(); // load native library (better diagnostics doing it explicitely) out.println(); @@ -102,17 +103,20 @@ public class NdbjLoad extends NdbBase { out.println(msg); throw new RuntimeException("!!! " + msg); } - out.println(" [ok: " + mgmdConnect + "]"); + out.println(" [ok: " + mgmdConnect + "]"); } - protected void close() throws Exception { - out.print("closing mgmd conn ..."); + protected void closeLoad() throws Exception { + out.println(); + out.print("closing mgmd connection ..."); out.flush(); if (mgmd != null) mgmd.close(); mgmd = null; - out.println(" [ok]"); - super.close(); + out.println(" [ok]"); + + // XXX support generic load class + //super.close(); } // ---------------------------------------------------------------------- @@ -1189,8 +1193,10 @@ public class NdbjLoad extends NdbBase { // ---------------------------------------------------------------------- protected void initConnection() throws NdbApiException { + out.println(); + // optionally, connect and wait for reaching the data nodes (ndbds) - out.print("waiting for data nodes..."); + out.print("waiting for ndbd ..."); out.flush(); final int initial_wait = 10; // secs to wait until first node detected final int final_wait = 0; // secs to wait after first node detected @@ -1204,10 +1210,10 @@ public class NdbjLoad extends NdbBase { + (initial_wait + final_wait) + "s."); throw e; } - out.println(" [ok]"); + out.println(" [ok]"); // connect to database - out.print("connecting to database..."); + out.print("connecting to ndbd ..."); out.flush(); try { // XXX where to set schema? @@ -1223,26 +1229,27 @@ public class NdbjLoad extends NdbBase { out.println("!!! failed to connect: " + e); throw e; } - out.println(" [ok]"); + out.println(" [ok]"); // initialize the schema shortcuts model = new Model(ndb); } protected void closeConnection() { - out.print("closing database conn ..."); + out.println(); + out.print("closing ndbd connection ..."); out.flush(); model = null; ndb.close(); ndb = null; - out.println(" [ok]"); + out.println(" [ok]"); } protected void clearData() throws NdbApiException { out.print("deleting all rows ..."); out.flush(); final int delB0 = delByScan(model.table_B0); - out.print(" [B0: " + delB0); + out.print(" [B0: " + delB0); out.flush(); final int delA = delByScan(model.table_A); out.print(", A: " + delA); === modified file 'storage/ndb/test/crund/src/com/mysql/cluster/crund/ResultProcessor.java' --- a/storage/ndb/test/crund/src/com/mysql/cluster/crund/ResultProcessor.java 2011-02-02 09:52:33 +0000 +++ b/storage/ndb/test/crund/src/com/mysql/cluster/crund/ResultProcessor.java 2011-06-07 14:12:24 +0000 @@ -55,6 +55,7 @@ public class ResultProcessor { * @param avg the relative standard deviations */ void report(String tag, + int nRuns, int nTxOps, String[] op, double[] avg, @@ -72,6 +73,7 @@ public class ResultProcessor { * */ public void report(String tag, + int nRuns, int nTxOps, String[] op, double[] avg, @@ -79,6 +81,7 @@ public class ResultProcessor { double[] rsdev) { out.println(); out.println("tag = " + tag); + out.println("nRuns = " + nRuns); out.println("nTxOps = " + nTxOps); out.println(); @@ -126,7 +129,7 @@ public class ResultProcessor { protected ResultReporter reporter; protected String[] header; protected int nTxOps; - protected int nval; + protected int nRuns; protected double[] ravg; protected double[] rdev; @@ -252,7 +255,7 @@ public class ResultProcessor { header = line.split("\\t"); assert (header.length > 0); - nval = 0; + nRuns = 0; nTxOps = 0; ravg = new double[header.length]; rdev = new double[header.length]; @@ -268,7 +271,7 @@ public class ResultProcessor { + ", found: " + values.length); throw new ParseException(msg, 0); } - nval++; + nRuns++; // parse nTxOps int n; @@ -279,7 +282,7 @@ public class ResultProcessor { + ": " + e); throw new ParseException(msg, 0); } - if (nval == 1) { + if (nRuns == 1) { nTxOps = n; } else if (nTxOps != n) { String msg = ("line # " + lineNo @@ -290,8 +293,8 @@ public class ResultProcessor { } // skip warmup runs - if (nval <= nIgnored) { - nval--; + if (nRuns <= nIgnored) { + nRuns--; nIgnored--; continue; } @@ -310,7 +313,7 @@ public class ResultProcessor { // compute running averages and squared deviations final double v = l; final double oavg = ravg[i]; - final double navg = oavg + (v - oavg) / nval; + final double navg = oavg + (v - oavg) / nRuns; final double odev = rdev[i]; final double ndev = odev + (v - oavg) * (v - navg); ravg[i] = navg; @@ -331,12 +334,12 @@ public class ResultProcessor { for (int i = 1; i <= nops; i++) { op[i-1] = header[i]; avg[i-1] = ravg[i]; - sdev[i-1] = Math.sqrt(rdev[i] / nval); + sdev[i-1] = Math.sqrt(rdev[i] / nRuns); rsdev[i-1] = (sdev[i-1] * 100.0) / avg[i-1]; } final String tag = header[0]; - reporter.report(tag, nTxOps, op, avg, sdev, rsdev); + reporter.report(tag, nRuns, nTxOps, op, avg, sdev, rsdev); } // ---------------------------------------------------------------------- === modified file 'storage/ndb/test/crund/src/crundndb/Driver.cpp' --- a/storage/ndb/test/crund/src/crundndb/Driver.cpp 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/src/crundndb/Driver.cpp 2011-06-07 14:12:24 +0000 @@ -114,32 +114,13 @@ void Driver::run() { init(); - if (warmupRuns > 0) { - cout << endl - << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl - << "warmup runs ..." << endl - << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl; - - for (int i = 0; i < warmupRuns; i++) { - runTests(); - } - - // truncate log file, reset log buffers - closeLogFile(); - openLogFile(); - header.rdbuf()->str(""); - rtimes.rdbuf()->str(""); - ctimes.rdbuf()->str(""); - logHeader = true; - } - - if (hotRuns > 0) { + if (nRuns > 0) { cout << endl << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl << "hot runs ..." << endl << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl; - for (int i = 0; i < hotRuns; i++) { + for (int i = 0; i < nRuns; i++) { runTests(); } @@ -201,18 +182,11 @@ Driver::initProperties() { logRealTime = toBool(props[L"logRealTime"], true); logCpuTime = toBool(props[L"logCpuTime"], false); - warmupRuns = toInt(props[L"warmupRuns"], 0, -1); - if (warmupRuns < 0) { - msg << "[ignored] warmupRuns: '" - << toString(props[L"warmupRuns"]) << "'" << endl; - warmupRuns = 0; - } - - hotRuns = toInt(props[L"hotRuns"], 1, -1); - if (hotRuns < 0) { - msg << "[ignored] hotRuns: '" - << toString(props[L"hotRuns"]) << "'" << endl; - hotRuns = 1; + nRuns = toInt(props[L"nRuns"], 1, -1); + if (nRuns < 0) { + msg << "[ignored] nRuns: '" + << toString(props[L"nRuns"]) << "'" << endl; + nRuns = 1; } //if (msg.tellp() == 0) // netbeans reports amibuities @@ -233,8 +207,7 @@ Driver::printProperties() { cout << endl << "driver settings ..." << endl; cout << "logRealTime: " << logRealTime << endl; cout << "logCpuTime: " << logCpuTime << endl; - cout << "warmupRuns: " << warmupRuns << endl; - cout << "hotRuns: " << hotRuns << endl; + cout << "nRuns: " << nRuns << endl; cout.flags(f); } === modified file 'storage/ndb/test/crund/src/crundndb/Driver.hpp' --- a/storage/ndb/test/crund/src/crundndb/Driver.hpp 2011-01-31 09:07:01 +0000 +++ b/storage/ndb/test/crund/src/crundndb/Driver.hpp 2011-06-07 14:12:24 +0000 @@ -71,8 +71,7 @@ protected: Properties props; bool logRealTime; bool logCpuTime; - int warmupRuns; - int hotRuns; + int nRuns; // driver resources ofstream log; --===============5857718435417134379== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/martin.zaun@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: martin.zaun@stripped # target_branch: file:///Users/mz/mysql/ndb-7.1/ # testament_sha1: 593d035d61a7417c7abec02c35e56cfc0de3fb20 # timestamp: 2011-06-07 12:51:07 -0700 # source_branch: file:///Users/mz/mysql/ndb-7.1-jtie/ # base_revision_id: martin.zaun@stripped\ # uo0hu844mmai7pib # # Begin bundle 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 cHEaEv/F3JFOFCQMPhZKwA== --===============5857718435417134379==--