From: Martin Zaun Date: October 1 2010 9:03am Subject: bzr commit into mysql-5.1-telco-7.1 branch (martin.zaun:3856) List-Archive: http://lists.mysql.com/commits/119658 Message-Id: <201010010903.o916s5ND020517@rcsinet13.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0557292196==" --===============0557292196== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/md/mysql/ndb-7.1/ based on revid:jonas@stripped 3856 Martin Zaun 2010-10-01 [merge] crund - minor cleanups modified: storage/ndb/test/crund/build.xml storage/ndb/test/crund/src/crundndb/Driver.cpp storage/ndb/test/crund/src/crundndb/Makefile storage/ndb/test/crund/src/crundndb/Operations.cpp storage/ndb/test/crund/src/crundndb/Operations.hpp storage/ndb/test/crund/src/crundndb/com_mysql_cluster_crund_NdbApiLoad.cpp === modified file 'storage/ndb/test/crund/build.xml' --- a/storage/ndb/test/crund/build.xml 2010-03-01 19:10:54 +0000 +++ b/storage/ndb/test/crund/build.xml 2010-10-01 08:58:08 +0000 @@ -277,10 +277,6 @@ - - - - @@ -353,7 +349,7 @@ - + @@ -361,7 +357,6 @@ fork="true" failonerror="true" classpathref="classpath.ndbapi.run"> - === modified file 'storage/ndb/test/crund/src/crundndb/Driver.cpp' --- a/storage/ndb/test/crund/src/crundndb/Driver.cpp 2010-10-01 04:10:21 +0000 +++ b/storage/ndb/test/crund/src/crundndb/Driver.cpp 2010-10-01 08:58:08 +0000 @@ -18,6 +18,9 @@ #include "hrt_utils.h" #include "Operations.hpp" +// global type aliases +typedef const NdbDictionary::Table* NdbTable; + namespace crund_ndb { //using namespace std; @@ -31,18 +34,18 @@ using std::set; using utils::Properties; class Driver { - + public: /** * Creates a Driver instance. */ Driver(); - + /** * Parses the benchmark's command-line arguments. */ void parseArguments(int argc, const char* argv[]); - + /** * Runs the entire benchmark. */ @@ -87,7 +90,7 @@ protected: */ struct Op { const string name; - + virtual void run(int countA, int countB) const = 0; //void (*run)(int countA, int countB); @@ -129,7 +132,7 @@ protected: * Reads and initializes the benchmark's properties from a file. */ void initProperties(); - + /** * Prints the benchmark's properties. */ @@ -139,12 +142,12 @@ protected: * Opens the benchmark's data log file. */ void openLogFile(); - + /** * Closes the benchmark's data log file. */ void closeLogFile(); - + /** * Initializes the benchmark's resources. */ @@ -169,7 +172,7 @@ protected: * Runs a series of benchmark operations. */ void runOperations(int countA, int countB); - + /** * Runs a benchmark operation. */ @@ -179,7 +182,7 @@ protected: * Begins a benchmarked transaction. */ void begin(const string& name); - + /** * Closes a benchmarked transaction. */ @@ -192,7 +195,7 @@ protected: void closeConnection(); void initOperations(); - + template< bool feat > void initOperationsFeat(); void closeOperations(); @@ -208,27 +211,29 @@ protected: template< bool, bool > struct B0InsOp; - template< const char** opName, - void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*, - int,int,bool), - bool batch > + template< const char**, + void (crund_ndb::Operations::*)(NdbTable,int,int,bool), + bool > struct AByPKOp; - template< const char** opName, - void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*, - int,int,bool), - bool batch > + template< const char**, + void (crund_ndb::Operations::*)(NdbTable,int,int,bool), + bool > struct B0ByPKOp; - template< const char** opName, - void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*, - int,int,bool,int), - bool batch > + template< const char**, + void (crund_ndb::Operations::*)(NdbTable,int,int,bool,int), + bool > struct LengthOp; - template< const char** opName, - void (crund_ndb::Operations::*OP)(int,int,bool), - bool forceSend > + template< const char**, + void (crund_ndb::Operations::*)(NdbTable,int,int,bool,int), + bool > + struct ZeroLengthOp; + + template< const char**, + void (crund_ndb::Operations::*)(int,int,bool), + bool > struct RelOp; }; @@ -268,7 +273,7 @@ Driver::run() { for (int i = 0; i < warmupRuns; i++) { runTests(); } - + // truncate log file, reset log buffers cout << endl << "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" << endl @@ -283,7 +288,7 @@ Driver::run() { // hot runs for (int i = 0; i < hotRuns; i++) { runTests(); - } + } // write log buffers if (logRealTime) { @@ -462,7 +467,7 @@ Driver::initProperties() { const wstring& s = estr.substr(beg, len - beg); exclude.insert(toString(s)); } - + // string properties mgmdConnect = toString(props[L"ndb.mgmdConnect"]); catalog = toString(props[L"ndb.catalog"]); @@ -483,11 +488,11 @@ Driver::initProperties() { void Driver::printProperties() { - const ios_base::fmtflags f = cout.flags(); + const ios_base::fmtflags f = cout.flags(); // no effect calling manipulator function, not sure why //cout << ios_base::boolalpha; cout.flags(ios_base::boolalpha); - + cout << endl << "main settings:" << endl; cout << "logRealTime: " << logRealTime << endl; cout << "logCpuTime: " << logCpuTime << endl; @@ -558,14 +563,14 @@ void Driver::runOperations(int countA, int countB) { cout << endl << "------------------------------------------------------------" << endl; - + if (countA > countB) { cout << "skipping operations ... " << "[A=" << countA << ", B=" << countB << "]" << endl; return; } cout << "running operations ... " - << "[A=" << countA << ", B=" << countB << "]" << endl; + << "[A=" << countA << ", B=" << countB << "]" << endl; // log buffers if (logRealTime) { @@ -576,7 +581,7 @@ Driver::runOperations(int countA, int co ctimes << "A=" << countA << ", B=" << countB; cta = 0L; } - + // pre-run cleanup if (renewConnection) { closeOperations(); @@ -638,7 +643,7 @@ Driver::runOp(const Op& op, int countA, commit(name); } } - + void Driver::begin(const string& name) { cout << endl; @@ -717,7 +722,7 @@ Driver::initOperations() { const bool feat = true; initOperationsFeat< !feat >(); - initOperationsFeat< feat >(); + initOperationsFeat< feat >(); cout << " [Op: " << operations.size() << "]" << endl; } @@ -725,111 +730,121 @@ Driver::initOperations() { // the operation invocation templates look a bit complex, but they help // a lot to factorize code over the operations' parameter signatures -template< bool batch > +template< bool OB > struct Driver::ADelAllOp : Op { ADelAllOp() : Op(string("delAllA") - + (batch ? "_batch" : "")) { + + (OB ? "_batch" : "")) { } - + virtual void run(int countA, int countB) const { int count; - ops->delByScan(ops->meta->table_A, count, batch); + ops->delByScan(ops->meta->table_A, count, OB); assert (count == countA); } }; -template< bool batch > +template< bool OB > struct Driver::B0DelAllOp : Op { B0DelAllOp() : Op(string("delAllB0") - + (batch ? "_batch" : "")) { + + (OB ? "_batch" : "")) { } - + virtual void run(int countA, int countB) const { int count; - ops->delByScan(ops->meta->table_B0, count, batch); + ops->delByScan(ops->meta->table_B0, count, OB); assert (count == countB); } }; -template< bool setAttrs, bool batch > +template< bool OSA, bool OB > struct Driver::AInsOp : Op { AInsOp() : Op(string("insA") - + (setAttrs ? "_attr" : "") - + (batch ? "_batch" : "")) { + + (OSA ? "_attr" : "") + + (OB ? "_batch" : "")) { } - + virtual void run(int countA, int countB) const { - ops->ins(ops->meta->table_A, 1, countA, setAttrs, batch); + ops->ins(ops->meta->table_A, 1, countA, OSA, OB); } }; -template< bool setAttrs, bool batch > +template< bool OSA, bool OB > struct Driver::B0InsOp : Op { B0InsOp() : Op(string("insB0") - + (setAttrs ? "_attr" : "") - + (batch ? "_batch" : "")) { + + (OSA ? "_attr" : "") + + (OB ? "_batch" : "")) { } - + virtual void run(int countA, int countB) const { - ops->ins(ops->meta->table_B0, 1, countB, setAttrs, batch); + ops->ins(ops->meta->table_B0, 1, countB, OSA, OB); } }; -template< const char** opName, - void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*, - int,int,bool), - bool batch > +template< const char** ON, + void (crund_ndb::Operations::*OF)(NdbTable,int,int,bool), + bool OB > struct Driver::AByPKOp : Op { - AByPKOp() : Op(string(*opName) - + (batch ? "_batch" : "")) { + AByPKOp() : Op(string(*ON) + + (OB ? "_batch" : "")) { } - + virtual void run(int countA, int countB) const { - (ops->*OP)(ops->meta->table_A, 1, countA, batch); + (ops->*OF)(ops->meta->table_A, 1, countA, OB); } }; -template< const char** opName, - void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*, - int,int,bool), - bool batch > +template< const char** ON, + void (crund_ndb::Operations::*OF)(NdbTable,int,int,bool), + bool OB > struct Driver::B0ByPKOp : Op { - B0ByPKOp() : Op(string(*opName) - + (batch ? "_batch" : "")) { + B0ByPKOp() : Op(string(*ON) + + (OB ? "_batch" : "")) { } - + virtual void run(int countA, int countB) const { - (ops->*OP)(ops->meta->table_B0, 1, countB, batch); + (ops->*OF)(ops->meta->table_B0, 1, countB, OB); } }; -template< const char** opName, - void (crund_ndb::Operations::*OP)(const NdbDictionary::Table*, - int,int,bool,int), - bool batch > +template< const char** ON, + void (crund_ndb::Operations::*OF)(NdbTable,int,int,bool,int), + bool OB > struct Driver::LengthOp : Op { const int length; - LengthOp(int length) : Op(string(*opName) + LengthOp(int length) : Op(string(*ON) + toString(length) - + (batch ? "_batch" : "")), + + (OB ? "_batch" : "")), length(length) { } - + + virtual void run(int countA, int countB) const { + (ops->*OF)(ops->meta->table_B0, 1, countB, OB, length); + } +}; + +template< const char** ON, + void (crund_ndb::Operations::*OF)(NdbTable,int,int,bool,int), + bool OB > +struct Driver::ZeroLengthOp : LengthOp< ON, OF, OB > { + ZeroLengthOp(int length) : LengthOp< ON, OF, OB >(length) { + } + virtual void run(int countA, int countB) const { - (ops->*OP)(ops->meta->table_B0, 1, countB, batch, length); + (ops->*OF)(ops->meta->table_B0, 1, countB, OB, 0); } }; -template< const char** opName, - void (crund_ndb::Operations::*OP)(int x,int y,bool z), - bool forceSend > +template< const char** ON, + void (crund_ndb::Operations::*OF)(int,int,bool), + bool OFS > struct Driver::RelOp : Op { - RelOp() : Op(string(*opName) + (forceSend ? "_forceSend" : "")) { + RelOp() : Op(string(*ON) + + (OFS ? "_forceSend" : "")) { } - + virtual void run(int countA, int countB) const { - (ops->*OP)(countA, countB, forceSend); + (ops->*OF)(countA, countB, OFS); } }; @@ -900,9 +915,9 @@ Driver::initOperationsFeat() { new LengthOp< &getVarbinary_s, &crund_ndb::Operations::getVarbinary, feat >(length)); operations.push_back( - new LengthOp< &clearVarbinary_s, &crund_ndb::Operations::setVarbinary, feat >(0)); + new ZeroLengthOp< &clearVarbinary_s, &crund_ndb::Operations::setVarbinary, feat >(length)); } - + for (int i = 1; i <= maxVarcharChars; i *= 10) { const int length = i; @@ -913,7 +928,7 @@ Driver::initOperationsFeat() { new LengthOp< &getVarchar_s, &crund_ndb::Operations::getVarchar, feat >(length)); operations.push_back( - new LengthOp< &clearVarchar_s, &crund_ndb::Operations::setVarchar, feat >(0)); + new ZeroLengthOp< &clearVarchar_s, &crund_ndb::Operations::setVarchar, feat >(length)); } operations.push_back( @@ -1005,17 +1020,17 @@ Driver::parseArguments(int argc, const c exitUsage(); } } - + if (logFileName.empty()) { logFileName = "log_"; // format, destination strings (static size) - const char format[] = "%Y%m%d_%H%M%S"; + const char format[] = "%Y%m%d_%H%M%S"; const int size = sizeof("yyyymmdd_HHMMSS"); char dest[size]; - + // get time, convert to timeinfo (statically allocated) then to string - const time_t now = time(0); + const time_t now = time(0); const int nchars = strftime(dest, size, format, localtime(&now)); assert (nchars == size-1); (void)nchars; @@ -1030,7 +1045,7 @@ int main(int argc, const char* argv[]) { TRACE("main()"); - + Driver d; d.parseArguments(argc, argv); d.run(); === modified file 'storage/ndb/test/crund/src/crundndb/Makefile' --- a/storage/ndb/test/crund/src/crundndb/Makefile 2010-02-14 05:05:31 +0000 +++ b/storage/ndb/test/crund/src/crundndb/Makefile 2010-10-01 08:58:08 +0000 @@ -58,8 +58,13 @@ run.driver: Driver LD_LIBRARY_PATH=${NDB_LIBDIR} ./Driver \ -p ../../crundRun.properties -p ../../crundNdbapi.properties +# for JVM processes, try running valgrind with +# --smc-check=all --trace-children=yes --leak-check=full --show-reachable=yes valgrind.driver: Driver - LD_LIBRARY_PATH=${NDB_LIBDIR} valgrind --leak-check=full --show-reachable=yes ./Driver -p ../../crund.properties + LD_LIBRARY_PATH=${NDB_LIBDIR} valgrind \ + --leak-check=full --show-reachable=yes --trace-children=yes \ + ./Driver \ + -p ../../crundRun.properties -p ../../crundNdbapi.properties Driver: libcrundndb.a === modified file 'storage/ndb/test/crund/src/crundndb/Operations.cpp' --- a/storage/ndb/test/crund/src/crundndb/Operations.cpp 2010-10-01 04:10:21 +0000 +++ b/storage/ndb/test/crund/src/crundndb/Operations.cpp 2010-10-01 08:58:08 +0000 @@ -708,7 +708,7 @@ Operations::setVar(const NdbDictionary:: //CDBG << "!!! buf[1]=" << toString(buf[1]) << endl; //CDBG << "!!! buf[" << toString(slen) << "]=" << toString(buf[slen]) << endl; } - + beginTransaction(); for (int i = from; i <= to; i++) { // get an insert operation for the table @@ -797,7 +797,7 @@ Operations::getVar(const NdbDictionary:: // move and 0-terminated string memmove(s, s + 1, n); s[n] = 0; - + // check fetched values VERIFY(strcmp(s, str) == 0); } === modified file 'storage/ndb/test/crund/src/crundndb/Operations.hpp' --- a/storage/ndb/test/crund/src/crundndb/Operations.hpp 2010-10-01 04:10:21 +0000 +++ b/storage/ndb/test/crund/src/crundndb/Operations.hpp 2010-10-01 08:58:08 +0000 @@ -110,34 +110,34 @@ public: void setVarbinary(const NdbDictionary::Table* table, int from, int to, bool batch, int length); - + void getVarbinary(const NdbDictionary::Table* table, int from, int to, bool batch, int length); void setVarchar(const NdbDictionary::Table* table, int from, int to, bool batch, int length); - + void getVarchar(const NdbDictionary::Table* table, int from, int to, bool batch, int length); void setB0ToA(int count_A, int count_B, bool batch); - + void navB0ToA(int count_A, int count_B, bool batch); - + void navB0ToAalt(int count_A, int count_B, bool batch); - + void navAToB0(int count_A, int count_B, bool forceSend); - + void navAToB0alt(int count_A, int count_B, bool forceSend); - + void nullB0ToA(int count_A, int count_B, bool batch); - + protected: // executes the operations in the current transaction void executeOperations(); @@ -147,7 +147,7 @@ protected: void setVar(const NdbDictionary::Table* table, int attr_cvar, int from, int to, bool batch, const char* str); - + void getVar(const NdbDictionary::Table* table, int attr_cvar, int from, int to, bool batch, const char* str); }; === modified file 'storage/ndb/test/crund/src/crundndb/com_mysql_cluster_crund_NdbApiLoad.cpp' --- a/storage/ndb/test/crund/src/crundndb/com_mysql_cluster_crund_NdbApiLoad.cpp 2010-10-01 04:10:21 +0000 +++ b/storage/ndb/test/crund/src/crundndb/com_mysql_cluster_crund_NdbApiLoad.cpp 2010-10-01 08:58:08 +0000 @@ -34,7 +34,7 @@ Java_com_mysql_cluster_crund_NdbApiLoad_ // location of cluster management server (ndb_mgmd) // get a native string from the Java string const char* mgmd_cstr = env->GetStringUTFChars(mgmd_jstr, NULL); - + // initialize the benchmark's resources ops = new Operations(); ops->init(mgmd_cstr); --===============0557292196== 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:///home/md/mysql/ndb-7.1/ # testament_sha1: 6c7c5b3f48220213e6bff74272dbd5c63d78976f # timestamp: 2010-10-01 02:03:18 -0700 # source_branch: file:///home/md/mysql/ndb-7.1-opt32/ # base_revision_id: jonas@stripped # # Begin bundle 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 --===============0557292196==--