From: Martin Zaun Date: October 3 2010 4:34am Subject: bzr commit into mysql-5.1-telco-7.1 branch (martin.zaun:3861) List-Archive: http://lists.mysql.com/commits/119776 Message-Id: <201010030434.o934YX53013259@rcsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0151803204==" --===============0151803204== 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 3861 Martin Zaun 2010-10-02 [merge] crund - added LockMode property to TWS benchmark modified: storage/ndb/test/crund/tws_benchmark/nbproject/configs_sample/server-dbg.properties storage/ndb/test/crund/tws_benchmark/run.properties.sample storage/ndb/test/crund/tws_benchmark/src/Main.java === modified file 'storage/ndb/test/crund/tws_benchmark/nbproject/configs_sample/server-dbg.properties' --- a/storage/ndb/test/crund/tws_benchmark/nbproject/configs_sample/server-dbg.properties 2010-09-29 09:09:26 +0000 +++ b/storage/ndb/test/crund/tws_benchmark/nbproject/configs_sample/server-dbg.properties 2010-10-03 04:32:37 +0000 @@ -1,2 +1,2 @@ run.jvmargs=-server -Xms512m -Xmx512m -ea -Djava.library.path="/Users/mz/mysql/bin-7.1-dbg64/lib/mysql" -#run.jvmargs=-server -Xms512m -Xmx512m -ea -Djava.library.path="/home/md/mysql/bin-7.1-opt32/lib/mysql" +#run.jvmargs=-server -Xms512m -Xmx512m -ea -Djava.library.path="/home/md/mysql/bin-7.1-dbg32/lib/mysql" === modified file 'storage/ndb/test/crund/tws_benchmark/run.properties.sample' --- a/storage/ndb/test/crund/tws_benchmark/run.properties.sample 2010-09-29 10:02:15 +0000 +++ b/storage/ndb/test/crund/tws_benchmark/run.properties.sample 2010-10-03 04:32:37 +0000 @@ -10,6 +10,11 @@ doSingle=true doBulk=true doBatch=true +# lock mode for lookup and read scans +lockMode=READ_COMMITTED +#lockMode=SHARED +#lockMode=EXCLUSIVE, + # nRows >= 40000 # jdbc bulk: 1217 'Out of operation records in local data manager # (increase MaxNoOfLocalOperations)' from NDBCLUSTER === modified file 'storage/ndb/test/crund/tws_benchmark/src/Main.java' --- a/storage/ndb/test/crund/tws_benchmark/src/Main.java 2010-09-27 05:58:05 +0000 +++ b/storage/ndb/test/crund/tws_benchmark/src/Main.java 2010-10-03 04:32:37 +0000 @@ -1,6 +1,29 @@ +/* -*- mode: java; c-basic-offset: 4; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=4:tabstop=4:smarttab: + * + * Copyright (C) 2010 MySQL + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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 + */ + +//package com.mysql.cluster.crund.tws; + import com.mysql.clusterj.ClusterJHelper; import com.mysql.clusterj.SessionFactory; import com.mysql.clusterj.Session; +import com.mysql.clusterj.LockMode; import com.mysql.clusterj.annotation.Index; import com.mysql.clusterj.annotation.PersistenceCapable; import com.mysql.clusterj.annotation.PrimaryKey; @@ -62,6 +85,7 @@ public class Main static protected boolean doSingle; static protected boolean doBulk; static protected boolean doBatch; + static protected LockMode lockMode; static protected int nRows; static protected int nRuns; @@ -80,6 +104,7 @@ public class Main protected Ndb_cluster_connection mgmd; protected Ndb ndb; protected NdbTransaction tx; + protected int ndbOpLockMode; // NDB JTie metadata resources protected TableConst table_t0; @@ -132,7 +157,7 @@ public class Main // NDB JTie data resources protected ByteBuffer bb_r; - // static resources + // NDB JTie static resources static protected final ByteOrder bo = ByteOrder.nativeOrder(); static protected final Charset cs; static protected final CharsetEncoder csEncoder; @@ -153,7 +178,7 @@ public class Main } static public void main(String[] args) throws SQLException, IOException { - parse(); + parseProperties(); Main main = new Main(); main.init(); @@ -163,7 +188,7 @@ public class Main // ---------------------------------------------------------------------- - static public void parse() throws IOException { + static public void parseProperties() throws IOException { out.println("reading properties file " + propsFileName + " ..."); InputStream is = null; try { @@ -184,6 +209,7 @@ public class Main doSingle = parseBoolean("doSingle", false); doBulk = parseBoolean("doBulk", false); doBatch = parseBoolean("doBatch", false); + lockMode = parseLockMode("lockMode", LockMode.READ_COMMITTED); nRows = parseInt("nRows", 50000); nRuns = parseInt("nRuns", 5); @@ -197,6 +223,7 @@ public class Main out.println("doSingle : " + doSingle); out.println("doBulk : " + doBulk); out.println("doBatch : " + doBatch); + out.println("lockMode : " + lockMode); out.println("nRows : " + nRows); out.println("nRuns : " + nRuns); } @@ -219,6 +246,19 @@ public class Main } } + static protected LockMode parseLockMode(String k, LockMode vdefault) { + final String v = props.getProperty(k); + try { + return (v == null ? vdefault : LockMode.valueOf(v)); + } catch (IllegalArgumentException e) { + final IllegalArgumentException iae = new IllegalArgumentException( + "invalid value of benchmark property ('" + k + "', '" + + v + "')."); + iae.initCause(e); + throw iae; + } + } + // ---------------------------------------------------------------------- public void init() throws SQLException { @@ -281,6 +321,30 @@ public class Main } 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; + connection.setTransactionIsolation(il); + out.print(" [ok: "); + switch (connection.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("]"); + initJdbcPreparedStatements(); } @@ -306,16 +370,29 @@ public class Main assert (upd0 == null); assert (del0 == null); - //out.print("preparing jdbc statements ..."); out.print("compiling jdbc statements ..."); out.flush(); final String sqlIns0 = "INSERT INTO mytable (c0, c1, c2, c3, c5, c6, c7, c8) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; ins0 = connection.prepareStatement(sqlIns0); - final String sqlSel0 = "SELECT * FROM mytable where c0=? LOCK IN share mode"; - //final String sqlSel0 = "SELECT * FROM mytable where c0=? FOR UPDATE"; - //final String sqlSel0 = "SELECT * FROM mytable where c0=?"; + final String lm; + switch (lockMode) { + case READ_COMMITTED: + lm = ""; + break; + case SHARED: + lm = " LOCK IN share mode"; + break; + case EXCLUSIVE: + lm = " FOR UPDATE"; + break; + default: + lm = ""; + assert false; + } + + final String sqlSel0 = ("SELECT * FROM mytable where c0=?" + lm); sel0 = connection.prepareStatement(sqlSel0); final String sqlUpd0 = "UPDATE mytable SET c1 = ?, c2 = ?, c3 = ?, c5 = ?, c6 = ?, c7 = ?, c8 = ? WHERE c0=?"; @@ -365,6 +442,10 @@ public class Main sessionFactory = ClusterJHelper.getSessionFactory(props); session = sessionFactory.getSession(); out.println(" [ok]"); + + out.print("setting session lock mode ..."); + session.setLockMode(lockMode); + out.println(" [ok: " + lockMode + "]"); } protected void closeClusterjConnection() { @@ -404,9 +485,9 @@ public class Main "testdb"); final String schema = "def"; - assert mgmdConnect != null; - assert catalog != null; - assert schema != null; + assert (mgmdConnect != null); + assert (catalog != null); + assert (schema != null); // instantiate NDB cluster singleton out.print("creating cluster connection ..."); @@ -436,7 +517,6 @@ public class Main 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 - // returns: 0 all nodes live, > 0 at least one node live, < 0 error if (mgmd.wait_until_ready(initial_wait, final_wait) < 0) { final String msg = ("data nodes were not ready within " @@ -460,6 +540,26 @@ public class Main initNdbjtieMeta(); initNdbjtieBuffers(); + + out.print("using lock mode for reads ... [ok: "); + switch (lockMode) { + case READ_COMMITTED: + ndbOpLockMode = NdbOperation.LockMode.LM_CommittedRead; + out.print("LM_CommittedRead"); + break; + case SHARED: + ndbOpLockMode = NdbOperation.LockMode.LM_Read; + out.print("LM_Read"); + break; + case EXCLUSIVE: + ndbOpLockMode = NdbOperation.LockMode.LM_Exclusive; + out.print("LM_Exclusive"); + break; + default: + ndbOpLockMode = NdbOperation.LockMode.LM_CommittedRead; + assert false; + } + out.println("]"); } protected void closeNdbjtieConnection() { @@ -773,7 +873,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("insert " + nRows + " rows by JDBC " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); connection.setAutoCommit(mode == XMode.SINGLE); for(int i = 0; i < nRows; i++) { jdbcInsert(i, mode); @@ -782,8 +882,7 @@ public class Main ins0.executeBatch(); if (mode != XMode.SINGLE) connection.commit(); - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("jdbc_insert_" + m + " \t: " + time + " ms"); } @@ -792,7 +891,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("insert " + nRows + " rows by ClusterJ " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); if (mode != XMode.SINGLE) session.currentTransaction().begin(); for(int i = 0; i < nRows; i++) { @@ -800,8 +899,7 @@ public class Main } if (mode != XMode.SINGLE) session.currentTransaction().commit(); - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("clusterj_insert_" + m + " \t: " + time + " ms"); } @@ -810,7 +908,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("insert " + nRows + " rows by NDB JTie " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); if (mode == XMode.SINGLE) { for(int i = 0; i < nRows; i++) { ndbjtieBeginTransaction(); @@ -829,8 +927,7 @@ public class Main ndbjtieCommitTransaction(); ndbjtieCloseTransaction(); } - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("ndbjtie_insert_" + m + " \t: " + time + " ms"); } @@ -952,15 +1049,14 @@ public class Main return; } - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); connection.setAutoCommit(mode == XMode.SINGLE); for(int i = 0; i < nRows; i++) { jdbcLookup(i); } if (mode != XMode.SINGLE) connection.commit(); - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("jdbc_lookup_" + m + " \t: " + time + " ms"); } @@ -969,7 +1065,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("lookup " + nRows + " rows by ClusterJ " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); if (mode != XMode.SINGLE) session.currentTransaction().begin(); for(int i = 0; i < nRows; i++) { @@ -977,8 +1073,7 @@ public class Main } if (mode != XMode.SINGLE) session.currentTransaction().commit(); - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("clusterj_lookup_" + m + " \t: " + time + " ms"); } @@ -987,7 +1082,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("lookup " + nRows + " rows by NDB JTie " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); if (mode == XMode.SINGLE) { for(int i = 0; i < nRows; i++) { ndbjtieBeginTransaction(); @@ -1010,8 +1105,7 @@ public class Main ndbjtieRead(i); } } - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("ndbjtie_lookup_" + m + " \t: " + time + " ms"); } @@ -1076,8 +1170,7 @@ public class Main NdbOperation op = tx.getNdbOperation(table_t0); if (op == null) throw new RuntimeException(toStr(tx.getNdbError())); - //if (op.readTuple(NdbOperation.LockMode.LM_CommittedRead) != 0) - if (op.readTuple(NdbOperation.LockMode.LM_Read) != 0) + if (op.readTuple(ndbOpLockMode) != 0) throw new RuntimeException(toStr(tx.getNdbError())); int p = bb_r.position(); @@ -1194,7 +1287,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("update " + nRows + " rows by JDBC " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); connection.setAutoCommit(mode == XMode.SINGLE); for(int i = 0; i < nRows; i++) { jdbcUpdate(i, mode); @@ -1203,8 +1296,7 @@ public class Main upd0.executeBatch(); if (mode != XMode.SINGLE) connection.commit(); - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("jdbc_update_" + m + " \t: " + time + " ms"); } @@ -1213,7 +1305,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("update " + nRows + " rows by ClusterJ " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); if (mode != XMode.SINGLE) session.currentTransaction().begin(); for(int i = 0; i < nRows; i++) { @@ -1221,8 +1313,7 @@ public class Main } if (mode != XMode.SINGLE) session.currentTransaction().commit(); - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("clusterj_update_" + m + " \t: " + time + " ms"); } @@ -1231,7 +1322,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("update " + nRows + " rows by NDB JTie " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); if (mode == XMode.SINGLE) { for(int i = 0; i < nRows; i++) { ndbjtieBeginTransaction(); @@ -1250,8 +1341,7 @@ public class Main ndbjtieCommitTransaction(); ndbjtieCloseTransaction(); } - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("ndbjtie_update_" + m + " \t: " + time + " ms"); } @@ -1376,7 +1466,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("delete " + nRows + " rows by JDBC " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); connection.setAutoCommit(mode == XMode.SINGLE); for(int i = 0; i < nRows; i++) { jdbcDelete(i, mode); @@ -1385,8 +1475,7 @@ public class Main del0.executeBatch(); if (mode != XMode.SINGLE) connection.commit(); - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("jdbc_delete_" + m + " \t: " + time + " ms"); } @@ -1395,7 +1484,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("delete " + nRows + " rows by ClusterJ " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); if (mode != XMode.SINGLE) session.currentTransaction().begin(); for(int i = 0; i < nRows; i++) { @@ -1403,8 +1492,7 @@ public class Main } if (mode != XMode.SINGLE) session.currentTransaction().commit(); - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("clusterj_delete_" + m + " \t: " + time + " ms"); } @@ -1413,7 +1501,7 @@ public class Main final String m = mode.toString().toLowerCase(); //out.println("delete " + nRows + " rows by NDB JTie " + m + " tx ..."); - long start = System.currentTimeMillis(); + long time = -System.currentTimeMillis(); if (mode == XMode.SINGLE) { for(int i = 0; i < nRows; i++) { ndbjtieBeginTransaction(); @@ -1432,8 +1520,7 @@ public class Main ndbjtieCommitTransaction(); ndbjtieCloseTransaction(); } - long stop = System.currentTimeMillis(); - long time = stop - start; + time += System.currentTimeMillis(); out.println("ndbjtie_delete_" + m + " \t: " + time + " ms"); } --===============0151803204== 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: 6b44b76b1b3583a93661df49d47fc550533477e4 # timestamp: 2010-10-02 21:34:16 -0700 # source_branch: file:///Users/mz/mysql/ndb-7.1-opt1/ # base_revision_id: martin.zaun@stripped\ # ywe6cdu0mgspbz0g # # Begin bundle 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 u8ZVoA== --===============0151803204==--