diff options
Diffstat (limited to 'ndb/tools')
-rw-r--r-- | ndb/tools/Makefile.am | 6 | ||||
-rw-r--r-- | ndb/tools/delete_all.cpp | 52 | ||||
-rw-r--r-- | ndb/tools/desc.cpp | 51 | ||||
-rw-r--r-- | ndb/tools/drop_index.cpp | 31 | ||||
-rw-r--r-- | ndb/tools/drop_tab.cpp | 31 | ||||
-rw-r--r-- | ndb/tools/listTables.cpp | 24 | ||||
-rw-r--r-- | ndb/tools/ndb_config.cpp | 175 | ||||
-rw-r--r-- | ndb/tools/ndb_test_platform.cpp | 6 | ||||
-rw-r--r-- | ndb/tools/restore/Restore.cpp | 73 | ||||
-rw-r--r-- | ndb/tools/restore/Restore.hpp | 15 | ||||
-rw-r--r-- | ndb/tools/restore/consumer.cpp | 2 | ||||
-rw-r--r-- | ndb/tools/restore/consumer_printer.hpp | 2 | ||||
-rw-r--r-- | ndb/tools/restore/consumer_restore.cpp | 88 | ||||
-rw-r--r-- | ndb/tools/restore/consumer_restore.hpp | 4 | ||||
-rw-r--r-- | ndb/tools/restore/consumer_restorem.cpp | 17 | ||||
-rw-r--r-- | ndb/tools/restore/restore_main.cpp | 29 | ||||
-rw-r--r-- | ndb/tools/select_all.cpp | 68 | ||||
-rw-r--r-- | ndb/tools/select_count.cpp | 50 | ||||
-rw-r--r-- | ndb/tools/waiter.cpp | 15 |
19 files changed, 511 insertions, 228 deletions
diff --git a/ndb/tools/Makefile.am b/ndb/tools/Makefile.am index d16b7387534..c8aff4da633 100644 --- a/ndb/tools/Makefile.am +++ b/ndb/tools/Makefile.am @@ -1,5 +1,5 @@ -dist_bin_SCRIPTS = ndb_size.pl +dist_bin_SCRIPTS = ndb_size.pl ndb_error_reporter dist_pkgdata_DATA = ndb_size.tmpl ndbtools_PROGRAMS = \ @@ -33,12 +33,14 @@ ndb_restore_SOURCES = restore/restore_main.cpp \ restore/consumer.cpp \ restore/consumer_restore.cpp \ restore/consumer_printer.cpp \ - restore/Restore.cpp $(tools_common_sources) + restore/Restore.cpp \ + ../test/src/NDBT_ResultRow.cpp $(tools_common_sources) ndb_config_SOURCES = ndb_config.cpp \ ../src/mgmsrv/Config.cpp \ ../src/mgmsrv/ConfigInfo.cpp \ ../src/mgmsrv/InitConfigFileParser.cpp + ndb_config_CXXFLAGS = -I$(top_srcdir)/ndb/src/mgmapi \ -I$(top_srcdir)/ndb/src/mgmsrv \ -I$(top_srcdir)/ndb/include/mgmcommon \ diff --git a/ndb/tools/delete_all.cpp b/ndb/tools/delete_all.cpp index c1ab77cb39f..6aea9f87aaa 100644 --- a/ndb/tools/delete_all.cpp +++ b/ndb/tools/delete_all.cpp @@ -49,35 +49,37 @@ static void usage() my_print_help(my_long_options); my_print_variables(my_long_options); } -static my_bool -get_one_option(int optid, const struct my_option *opt __attribute__((unused)), - char *argument) -{ - return ndb_std_get_one_option(optid, opt, argument ? argument : - "d:t:O,/tmp/ndb_delete_all.trace"); -} int main(int argc, char** argv){ NDB_INIT(argv[0]); const char *load_default_groups[]= { "mysql_cluster",0 }; load_defaults("my",load_default_groups,&argc,&argv); int ho_error; - if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) +#ifndef DBUG_OFF + opt_debug= "d:t:O,/tmp/ndb_delete_all.trace"; +#endif + if ((ho_error=handle_options(&argc, &argv, my_long_options, + ndb_std_get_one_option))) return NDBT_ProgramExit(NDBT_WRONGARGS); - Ndb::setConnectString(opt_connect_str); - // Connect to Ndb - Ndb MyNdb(_dbname); + Ndb_cluster_connection con(opt_connect_str); + if(con.connect(12, 5, 1) != 0) + { + ndbout << "Unable to connect to management server." << endl; + return NDBT_ProgramExit(NDBT_FAILED); + } + if (con.wait_until_ready(30,0) < 0) + { + ndbout << "Cluster nodes not ready in 30 seconds." << endl; + return NDBT_ProgramExit(NDBT_FAILED); + } + Ndb MyNdb(&con, _dbname ); if(MyNdb.init() != 0){ ERR(MyNdb.getNdbError()); return NDBT_ProgramExit(NDBT_FAILED); } - // Connect to Ndb and wait for it to become ready - while(MyNdb.waitUntilReady() != 0) - ndbout << "Waiting for ndb to become ready..." << endl; - // Check if table exists in db int res = NDBT_OK; for(int i = 0; i<argc; i++){ @@ -108,7 +110,7 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, const int retryMax = 10; int deletedRows = 0; int check; - NdbConnection *pTrans; + NdbTransaction *pTrans; NdbScanOperation *pOp; NdbError err; @@ -137,12 +139,11 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, goto failed; } - NdbResultSet * rs = pOp->readTuplesExclusive(par); - if( rs == 0 ) { + if( pOp->readTuples(NdbOperation::LM_Exclusive,par) ) { goto failed; } - if(pTrans->execute(NoCommit) != 0){ + if(pTrans->execute(NdbTransaction::NoCommit) != 0){ err = pTrans->getNdbError(); if(err.status == NdbError::TemporaryError){ ERR(err); @@ -153,20 +154,20 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, goto failed; } - while((check = rs->nextResult(true)) == 0){ + while((check = pOp->nextResult(true)) == 0){ do { - if (rs->deleteTuple() != 0){ + if (pOp->deleteCurrentTuple() != 0){ goto failed; } deletedRows++; - } while((check = rs->nextResult(false)) == 0); + } while((check = pOp->nextResult(false)) == 0); if(check != -1){ if (fetch_across_commit) { - check = pTrans->execute(Commit); + check = pTrans->execute(NdbTransaction::Commit); pTrans->restart(); // new tx id } else { - check = pTrans->execute(NoCommit); + check = pTrans->execute(NdbTransaction::NoCommit); } } @@ -193,7 +194,8 @@ int clear_table(Ndb* pNdb, const NdbDictionary::Table* pTab, } goto failed; } - if (! fetch_across_commit && pTrans->execute(Commit) != 0) { + if (! fetch_across_commit && + pTrans->execute(NdbTransaction::Commit) != 0) { err = pTrans->getNdbError(); goto failed; } diff --git a/ndb/tools/desc.cpp b/ndb/tools/desc.cpp index e5371b9b458..74cd740f2ae 100644 --- a/ndb/tools/desc.cpp +++ b/ndb/tools/desc.cpp @@ -48,13 +48,6 @@ static void usage() my_print_help(my_long_options); my_print_variables(my_long_options); } -static my_bool -get_one_option(int optid, const struct my_option *opt __attribute__((unused)), - char *argument) -{ - return ndb_std_get_one_option(optid, opt, argument ? argument : - "d:t:O,/tmp/ndb_desc.trace"); -} static void print_part_info(Ndb* pNdb, NDBT_Table* pTab); @@ -63,22 +56,32 @@ int main(int argc, char** argv){ const char *load_default_groups[]= { "mysql_cluster",0 }; load_defaults("my",load_default_groups,&argc,&argv); int ho_error; - if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) +#ifndef DBUG_OFF + opt_debug= "d:t:O,/tmp/ndb_desc.trace"; +#endif + if ((ho_error=handle_options(&argc, &argv, my_long_options, + ndb_std_get_one_option))) return NDBT_ProgramExit(NDBT_WRONGARGS); - Ndb::setConnectString(opt_connect_str); - - Ndb* pMyNdb; - pMyNdb = new Ndb(_dbname); - pMyNdb->init(); - - ndbout << "Waiting..."; - while (pMyNdb->waitUntilReady() != 0) { - ndbout << "..."; + Ndb_cluster_connection con(opt_connect_str); + if(con.connect(12, 5, 1) != 0) + { + ndbout << "Unable to connect to management server." << endl; + return NDBT_ProgramExit(NDBT_FAILED); + } + if (con.wait_until_ready(30,0) < 0) + { + ndbout << "Cluster nodes not ready in 30 seconds." << endl; + return NDBT_ProgramExit(NDBT_FAILED); } - ndbout << endl; - NdbDictionary::Dictionary * dict = pMyNdb->getDictionary(); + Ndb MyNdb(&con, _dbname); + if(MyNdb.init() != 0){ + ERR(MyNdb.getNdbError()); + return NDBT_ProgramExit(NDBT_FAILED); + } + + const NdbDictionary::Dictionary * dict= MyNdb.getDictionary(); for (int i = 0; i < argc; i++) { NDBT_Table* pTab = (NDBT_Table*)dict->getTable(argv[i]); if (pTab != 0){ @@ -116,13 +119,12 @@ int main(int argc, char** argv){ ndbout << endl; if (_partinfo) - print_part_info(pMyNdb, pTab); + print_part_info(&MyNdb, pTab); } else ndbout << argv[i] << ": " << dict->getNdbError() << endl; } - delete pMyNdb; return NDBT_ProgramExit(NDBT_OK); } @@ -141,6 +143,7 @@ void print_part_info(Ndb* pNdb, NDBT_Table* pTab) { "Partition", 0, NdbDictionary::Column::FRAGMENT }, { "Row count", 0, NdbDictionary::Column::ROW_COUNT }, { "Commit count", 0, NdbDictionary::Column::COMMIT_COUNT }, + { "Frag memory", 0, NdbDictionary::Column::FRAGMENT_MEMORY }, { 0, 0, 0 } }; @@ -156,8 +159,8 @@ void print_part_info(Ndb* pNdb, NDBT_Table* pTab) if (pOp == NULL) break; - NdbResultSet* rs= pOp->readTuples(NdbOperation::LM_CommittedRead); - if (rs == 0) + int rs = pOp->readTuples(NdbOperation::LM_CommittedRead); + if (rs != 0) break; if (pOp->interpret_exit_last_row() != 0) @@ -180,7 +183,7 @@ void print_part_info(Ndb* pNdb, NDBT_Table* pTab) ndbout << g_part_info[i].m_title << "\t"; ndbout << endl; - while(rs->nextResult() == 0) + while(pOp->nextResult() == 0) { for(i = 0; g_part_info[i].m_title != 0; i++) { diff --git a/ndb/tools/drop_index.cpp b/ndb/tools/drop_index.cpp index 69c8345fdb6..24116f22784 100644 --- a/ndb/tools/drop_index.cpp +++ b/ndb/tools/drop_index.cpp @@ -41,37 +41,40 @@ static void usage() my_print_help(my_long_options); my_print_variables(my_long_options); } -static my_bool -get_one_option(int optid, const struct my_option *opt __attribute__((unused)), - char *argument) -{ - return ndb_std_get_one_option(optid, opt, argument ? argument : - "d:t:O,/tmp/ndb_drop_index.trace"); -} int main(int argc, char** argv){ NDB_INIT(argv[0]); const char *load_default_groups[]= { "mysql_cluster",0 }; load_defaults("my",load_default_groups,&argc,&argv); int ho_error; - if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) +#ifndef DBUG_OFF + "d:t:O,/tmp/ndb_drop_index.trace"; +#endif + if ((ho_error=handle_options(&argc, &argv, my_long_options, + ndb_std_get_one_option))) return NDBT_ProgramExit(NDBT_WRONGARGS); if (argc < 1) { usage(); return NDBT_ProgramExit(NDBT_WRONGARGS); } - Ndb::setConnectString(opt_connect_str); - // Connect to Ndb - Ndb MyNdb(_dbname); + Ndb_cluster_connection con(opt_connect_str); + if(con.connect(12, 5, 1) != 0) + { + return NDBT_ProgramExit(NDBT_FAILED); + } + if (con.wait_until_ready(30,3) < 0) + { + ndbout << "Cluster nodes not ready in 30 seconds." << endl; + return NDBT_ProgramExit(NDBT_FAILED); + } + + Ndb MyNdb(&con, _dbname ); if(MyNdb.init() != 0){ ERR(MyNdb.getNdbError()); return NDBT_ProgramExit(NDBT_FAILED); } - while(MyNdb.waitUntilReady() != 0) - ndbout << "Waiting for ndb to become ready..." << endl; - int res = 0; for(int i = 0; i+1<argc; i += 2){ ndbout << "Dropping index " << argv[i] << "/" << argv[i+1] << "..."; diff --git a/ndb/tools/drop_tab.cpp b/ndb/tools/drop_tab.cpp index 091db5cc4b7..991e1505486 100644 --- a/ndb/tools/drop_tab.cpp +++ b/ndb/tools/drop_tab.cpp @@ -41,36 +41,41 @@ static void usage() my_print_help(my_long_options); my_print_variables(my_long_options); } -static my_bool -get_one_option(int optid, const struct my_option *opt __attribute__((unused)), - char *argument) -{ - return ndb_std_get_one_option(optid, opt, argument ? argument : - "d:t:O,/tmp/ndb_drop_table.trace"); -} int main(int argc, char** argv){ NDB_INIT(argv[0]); const char *load_default_groups[]= { "mysql_cluster",0 }; load_defaults("my",load_default_groups,&argc,&argv); int ho_error; - if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) +#ifndef DBUG_OFF + "d:t:O,/tmp/ndb_drop_table.trace"; +#endif + if ((ho_error=handle_options(&argc, &argv, my_long_options, + ndb_std_get_one_option))) return NDBT_ProgramExit(NDBT_WRONGARGS); if (argc < 1) { usage(); return NDBT_ProgramExit(NDBT_WRONGARGS); } - Ndb::setConnectString(opt_connect_str); - Ndb MyNdb(_dbname); + Ndb_cluster_connection con(opt_connect_str); + if(con.connect(12, 5, 1) != 0) + { + ndbout << "Unable to connect to management server." << endl; + return NDBT_ProgramExit(NDBT_FAILED); + } + if (con.wait_until_ready(30,3) < 0) + { + ndbout << "Cluster nodes not ready in 30 seconds." << endl; + return NDBT_ProgramExit(NDBT_FAILED); + } + + Ndb MyNdb(&con, _dbname ); if(MyNdb.init() != 0){ ERR(MyNdb.getNdbError()); return NDBT_ProgramExit(NDBT_FAILED); } - while(MyNdb.waitUntilReady() != 0) - ndbout << "Waiting for ndb to become ready..." << endl; - int res = 0; for(int i = 0; i<argc; i++){ ndbout << "Dropping table " << argv[i] << "..."; diff --git a/ndb/tools/listTables.cpp b/ndb/tools/listTables.cpp index eb0c1c53c2d..fa078f7d351 100644 --- a/ndb/tools/listTables.cpp +++ b/ndb/tools/listTables.cpp @@ -29,7 +29,7 @@ static Ndb_cluster_connection *ndb_cluster_connection= 0; static Ndb* ndb = 0; -static NdbDictionary::Dictionary* dic = 0; +static const NdbDictionary::Dictionary * dic = 0; static int _unqualified = 0; static void @@ -199,13 +199,6 @@ static void usage() my_print_help(my_long_options); my_print_variables(my_long_options); } -static my_bool -get_one_option(int optid, const struct my_option *opt __attribute__((unused)), - char *argument) -{ - return ndb_std_get_one_option(optid, opt, argument ? argument : - "d:t:O,/tmp/ndb_show_tables.trace"); -} int main(int argc, char** argv){ NDB_INIT(argv[0]); @@ -213,22 +206,29 @@ int main(int argc, char** argv){ const char *load_default_groups[]= { "mysql_cluster",0 }; load_defaults("my",load_default_groups,&argc,&argv); int ho_error; - if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) +#ifndef DBUG_OFF + opt_debug= "d:t:O,/tmp/ndb_show_tables.trace"; +#endif + if ((ho_error=handle_options(&argc, &argv, my_long_options, + ndb_std_get_one_option))) return NDBT_ProgramExit(NDBT_WRONGARGS); _tabname = argv[0]; ndb_cluster_connection = new Ndb_cluster_connection(opt_connect_str); if (ndb_cluster_connection->connect(12,5,1)) - fatal("unable to connect"); + fatal("Unable to connect to management server."); + if (ndb_cluster_connection->wait_until_ready(30,0) < 0) + fatal("Cluster nodes not ready in 30 seconds."); + ndb = new Ndb(ndb_cluster_connection, _dbname); if (ndb->init() != 0) fatal("init"); - if (ndb->waitUntilReady(30) < 0) - fatal("waitUntilReady"); dic = ndb->getDictionary(); for (int i = 0; _loops == 0 || i < _loops; i++) { list(_tabname, (NdbDictionary::Object::Type)_type); } + delete ndb; + delete ndb_cluster_connection; return NDBT_ProgramExit(NDBT_OK); } diff --git a/ndb/tools/ndb_config.cpp b/ndb/tools/ndb_config.cpp index 78a2fa38fba..135bec7ef72 100644 --- a/ndb/tools/ndb_config.cpp +++ b/ndb/tools/ndb_config.cpp @@ -23,6 +23,8 @@ #include <my_getopt.h> #include <mysql_version.h> +#include <netdb.h> + #include <NdbOut.hpp> #include <mgmapi.h> #include <mgmapi_configuration.hpp> @@ -31,7 +33,7 @@ static int g_verbose = 0; static int try_reconnect = 3; -static int g_nodes = 1; +static int g_nodes, g_connections, g_section; static const char * g_connectstring = 0; static const char * g_query = 0; @@ -41,6 +43,7 @@ static const char * g_host = 0; static const char * g_field_delimiter=","; static const char * g_row_delimiter=" "; static const char * g_config_file = 0; +static int g_mycnf = 0; int g_print_full_config, opt_ndb_shm; my_bool opt_core; @@ -67,13 +70,19 @@ static struct my_option my_long_options[] = "Overides specifying entries in NDB_CONNECTSTRING and Ndb.cfg", (gptr*) &g_connectstring, (gptr*) &g_connectstring, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 }, + { "ndb-shm", 256, "Print nodes", + (gptr*) &opt_ndb_shm, (gptr*) &opt_ndb_shm, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, { "nodes", 256, "Print nodes", (gptr*) &g_nodes, (gptr*) &g_nodes, - 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0}, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, + { "connections", 256, "Print connections", + (gptr*) &g_connections, (gptr*) &g_connections, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, { "query", 'q', "Query option(s)", (gptr*) &g_query, (gptr*) &g_query, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, - { "host", 257, "Host", + { "host", 256, "Host", (gptr*) &g_host, (gptr*) &g_host, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, { "type", 258, "Type of node/connection", @@ -94,6 +103,9 @@ static struct my_option my_long_options[] = { "config-file", 256, "Path to config.ini", (gptr*) &g_config_file, (gptr*) &g_config_file, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0}, + { "mycnf", 256, "Read config from my.cnf", + (gptr*) &g_mycnf, (gptr*) &g_mycnf, + 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0} }; @@ -131,6 +143,11 @@ struct Match virtual int eval(const Iter&); }; +struct HostMatch : public Match +{ + virtual int eval(const Iter&); +}; + struct Apply { Apply() {} @@ -144,6 +161,11 @@ struct NodeTypeApply : public Apply virtual int apply(const Iter&); }; +struct ConnectionTypeApply : public Apply +{ + virtual int apply(const Iter&); +}; + static int parse_query(Vector<Apply*>&, int &argc, char**& argv); static int parse_where(Vector<Match*>&, int &argc, char**& argv); static int eval(const Iter&, const Vector<Match*>&); @@ -161,9 +183,20 @@ main(int argc, char** argv){ ndb_std_get_one_option))) return -1; + if (g_nodes && g_connections) + { + fprintf(stderr, + "Only one option of --nodes and --connections allowed\n"); + return -1; + } + + g_section = CFG_SECTION_NODE; //default + if (g_connections) + g_section = CFG_SECTION_CONNECTION; + ndb_mgm_configuration * conf = 0; - if (g_config_file) + if (g_config_file || g_mycnf) conf = load_configuration(); else conf = fetch_configuration(); @@ -172,7 +205,7 @@ main(int argc, char** argv){ { return -1; } - + Vector<Apply*> select_list; Vector<Match*> where_clause; @@ -191,7 +224,7 @@ main(int argc, char** argv){ exit(0); } - Iter iter(* conf, CFG_SECTION_NODE); + Iter iter(* conf, g_section); bool prev= false; iter.first(); for(iter.first(); iter.valid(); iter.next()) @@ -220,13 +253,32 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv) for(unsigned i = 0; i<list.size(); i++) { const char * str= list[i].c_str(); - if(strcasecmp(str, "id") == 0 || strcasecmp(str, "nodeid") == 0) - select.push_back(new Apply(CFG_NODE_ID)); - else if(strncasecmp(str, "host", 4) == 0) - select.push_back(new Apply(CFG_NODE_HOST)); - else if(strcasecmp(str, "type") == 0) - select.push_back(new NodeTypeApply()); - else if(g_nodes) + if(g_section == CFG_SECTION_NODE) + { + if(strcasecmp(str, "id") == 0 || strcasecmp(str, "nodeid") == 0) + { + select.push_back(new Apply(CFG_NODE_ID)); + continue; + } + else if(strncasecmp(str, "host", 4) == 0) + { + select.push_back(new Apply(CFG_NODE_HOST)); + continue; + } + else if(strcasecmp(str, "type") == 0) + { + select.push_back(new NodeTypeApply()); + continue; + } + } + else if (g_section == CFG_SECTION_CONNECTION) + { + if(strcasecmp(str, "type") == 0) + { + select.push_back(new ConnectionTypeApply()); + continue; + } + } { bool found = false; for(int p = 0; p<ConfigInfo::m_NoOfParams; p++) @@ -234,9 +286,15 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv) if(0)ndbout_c("%s %s", ConfigInfo::m_ParamInfo[p]._section, ConfigInfo::m_ParamInfo[p]._fname); - if(strcmp(ConfigInfo::m_ParamInfo[p]._section, "DB") == 0 || - strcmp(ConfigInfo::m_ParamInfo[p]._section, "API") == 0 || - strcmp(ConfigInfo::m_ParamInfo[p]._section, "MGM") == 0) + if(g_section == CFG_SECTION_CONNECTION && + (strcmp(ConfigInfo::m_ParamInfo[p]._section, "TCP") == 0 || + strcmp(ConfigInfo::m_ParamInfo[p]._section, "SCI") == 0 || + strcmp(ConfigInfo::m_ParamInfo[p]._section, "SHM") == 0) + || + g_section == CFG_SECTION_NODE && + (strcmp(ConfigInfo::m_ParamInfo[p]._section, "DB") == 0 || + strcmp(ConfigInfo::m_ParamInfo[p]._section, "API") == 0 || + strcmp(ConfigInfo::m_ParamInfo[p]._section, "MGM") == 0)) { if(strcasecmp(ConfigInfo::m_ParamInfo[p]._fname, str) == 0) { @@ -252,11 +310,6 @@ parse_query(Vector<Apply*>& select, int &argc, char**& argv) return 1; } } - else - { - fprintf(stderr, "Unknown query option: %s\n", str); - return 1; - } } } return 0; @@ -269,9 +322,10 @@ parse_where(Vector<Match*>& where, int &argc, char**& argv) Match m; if(g_host) { - m.m_key = CFG_NODE_HOST; - m.m_value.assfmt("%s", g_host); - where.push_back(new Match(m)); + HostMatch *m = new HostMatch; + m->m_key = CFG_NODE_HOST; + m->m_value.assfmt("%s", g_host); + where.push_back(m); } if(g_type) @@ -348,6 +402,40 @@ Match::eval(const Iter& iter) } int +HostMatch::eval(const Iter& iter) +{ + const char* valc; + + if(iter.get(m_key, &valc) == 0) + { + struct hostent *h1, *h2; + + h1 = gethostbyname(m_value.c_str()); + if (h1 == NULL) { + return 0; + } + + h2 = gethostbyname(valc); + if (h2 == NULL) { + return 0; + } + + if (h1->h_addrtype != h2->h_addrtype) { + return 0; + } + + if (h1->h_length != h2->h_length) + { + return 0; + } + + return 0 == memcmp(h1->h_addr, h2->h_addr, h1->h_length); + } + + return 0; +} + +int Apply::apply(const Iter& iter) { Uint32 val32; @@ -379,6 +467,31 @@ NodeTypeApply::apply(const Iter& iter) return 0; } +int +ConnectionTypeApply::apply(const Iter& iter) +{ + Uint32 val32; + if (iter.get(CFG_TYPE_OF_SECTION, &val32) == 0) + { + switch (val32) + { + case CONNECTION_TYPE_TCP: + printf("tcp"); + break; + case CONNECTION_TYPE_SCI: + printf("sci"); + break; + case CONNECTION_TYPE_SHM: + printf("shm"); + break; + default: + printf("<unknown>"); + break; + } + } + return 0; +} + ndb_mgm_configuration* fetch_configuration() { @@ -442,10 +555,20 @@ ndb_mgm_configuration* load_configuration() { InitConfigFileParser parser(stderr); + if (g_config_file) + { + if (g_verbose) + fprintf(stderr, "Using config.ini : %s", g_config_file); + + Config* conf = parser.parseConfig(g_config_file); + if (conf) + return conf->m_configValues; + } + if (g_verbose) - fprintf(stderr, "Using config.ini : %s", g_config_file); + fprintf(stderr, "Using my.cnf"); - Config* conf = parser.parseConfig(g_config_file); + Config* conf = parser.parse_mycnf(); if (conf) return conf->m_configValues; diff --git a/ndb/tools/ndb_test_platform.cpp b/ndb/tools/ndb_test_platform.cpp index 72dd146dacd..88f21b31d58 100644 --- a/ndb/tools/ndb_test_platform.cpp +++ b/ndb/tools/ndb_test_platform.cpp @@ -33,14 +33,14 @@ int test_snprintf(const char * fmt, int buf_sz, int result) if(ret < 0) { printf("BaseString::snprint returns %d with size=%d and strlen(fmt)=%d\n", - ret, buf_sz, strlen(fmt)); + ret, buf_sz, (int) strlen(fmt)); return -1; } if(ret+1 == buf_sz) { printf("BaseString::snprint truncates returns %d with size=%d and strlen(fmt)=%d\n", - ret, buf_sz, strlen(fmt)); + ret, buf_sz, (int) strlen(fmt)); return -1; } @@ -87,7 +87,7 @@ main(void) if (sizeof(UintPtr) != sizeof(Uint32*)) { printf("sizeof(UintPtr)=%d != sizeof(Uint32*)=%d\n", - sizeof(UintPtr), sizeof(Uint32*)); + (int) sizeof(UintPtr), (int) sizeof(Uint32*)); return -1; } diff --git a/ndb/tools/restore/Restore.cpp b/ndb/tools/restore/Restore.cpp index 79df49c6f26..a808a48b558 100644 --- a/ndb/tools/restore/Restore.cpp +++ b/ndb/tools/restore/Restore.cpp @@ -80,7 +80,12 @@ RestoreMetaData::RestoreMetaData(const char* path, Uint32 nodeId, Uint32 bNo) { RestoreMetaData::~RestoreMetaData(){ for(Uint32 i= 0; i < allTables.size(); i++) - delete allTables[i]; + { + TableS *table = allTables[i]; + for(Uint32 j= 0; j < table->m_fragmentInfo.size(); j++) + delete table->m_fragmentInfo[j]; + delete table; + } allTables.clear(); } @@ -111,6 +116,9 @@ RestoreMetaData::loadContent() } if(!readGCPEntry()) return 0; + + if(!readFragmentInfo()) + return 0; return 1; } @@ -192,6 +200,52 @@ RestoreMetaData::readGCPEntry() { return true; } +bool +RestoreMetaData::readFragmentInfo() +{ + BackupFormat::CtlFile::FragmentInfo fragInfo; + TableS * table = 0; + Uint32 tableId = RNIL; + + while (buffer_read(&fragInfo, 4, 2) == 2) + { + fragInfo.SectionType = ntohl(fragInfo.SectionType); + fragInfo.SectionLength = ntohl(fragInfo.SectionLength); + + if (fragInfo.SectionType != BackupFormat::FRAGMENT_INFO) + { + err << "readFragmentInfo invalid section type: " << + fragInfo.SectionType << endl; + return false; + } + + if (buffer_read(&fragInfo.TableId, (fragInfo.SectionLength-2)*4, 1) != 1) + { + err << "readFragmentInfo invalid section length: " << + fragInfo.SectionLength << endl; + return false; + } + + fragInfo.TableId = ntohl(fragInfo.TableId); + if (fragInfo.TableId != tableId) + { + tableId = fragInfo.TableId; + table = getTable(tableId); + } + + FragmentInfo * tmp = new FragmentInfo; + tmp->fragmentNo = ntohl(fragInfo.FragmentNo); + tmp->noOfRecords = ntohl(fragInfo.NoOfRecordsLow) + + (((Uint64)ntohl(fragInfo.NoOfRecordsHigh)) << 32); + tmp->filePosLow = ntohl(fragInfo.FilePosLow); + tmp->filePosHigh = ntohl(fragInfo.FilePosHigh); + + table->m_fragmentInfo.push_back(tmp); + table->m_noOfRecords += tmp->noOfRecords; + } + return true; +} + TableS::TableS(Uint32 version, NdbTableImpl* tableImpl) : m_dictTable(tableImpl) { @@ -199,6 +253,7 @@ TableS::TableS(Uint32 version, NdbTableImpl* tableImpl) m_noOfNullable = m_nullBitmaskSize = 0; m_auto_val_id= ~(Uint32)0; m_max_auto_val= 0; + m_noOfRecords= 0; backupVersion = version; for (int i = 0; i < tableImpl->getNoOfColumns(); i++) @@ -646,7 +701,7 @@ bool RestoreDataIterator::readFragmentHeader(int & ret) } info << "_____________________________________________________" << endl - << "Restoring data in table: " << m_currentTable->getTableName() + << "Processing data in table: " << m_currentTable->getTableName() << "(" << Header.TableId << ") fragment " << Header.FragmentNo << endl; @@ -925,23 +980,17 @@ operator<<(NdbOut& ndbout, const LogEntry& logE) return ndbout; } +#include <NDBT.hpp> NdbOut & operator<<(NdbOut& ndbout, const TableS & table){ - ndbout << endl << "Table: " << table.getTableName() << endl; - for (int j = 0; j < table.getNoOfAttributes(); j++) - { - const AttributeDesc * desc = table[j]; - ndbout << desc->m_column->getName() << ": " - << (Uint32) desc->m_column->getType(); - ndbout << " key: " << (Uint32) desc->m_column->getPrimaryKey(); - ndbout << " array: " << desc->arraySize; - ndbout << " size: " << desc->size << endl; - } // for + + ndbout << (* (NDBT_Table*)table.m_dictTable) << endl; return ndbout; } template class Vector<TableS*>; template class Vector<AttributeS*>; template class Vector<AttributeDesc*>; +template class Vector<FragmentInfo*>; diff --git a/ndb/tools/restore/Restore.hpp b/ndb/tools/restore/Restore.hpp index 85793baf9df..cf8feb7125c 100644 --- a/ndb/tools/restore/Restore.hpp +++ b/ndb/tools/restore/Restore.hpp @@ -114,6 +114,14 @@ public: AttributeData * getData(int i) const; }; // class TupleS +struct FragmentInfo +{ + Uint32 fragmentNo; + Uint64 noOfRecords; + Uint32 filePosLow; + Uint32 filePosHigh; +}; + class TableS { friend class TupleS; @@ -136,6 +144,9 @@ class TableS { int pos; + Uint64 m_noOfRecords; + Vector<FragmentInfo *> m_fragmentInfo; + void createAttr(NdbDictionary::Column *column); public: @@ -146,6 +157,9 @@ public: Uint32 getTableId() const { return m_dictTable->getTableId(); } + Uint32 getNoOfRecords() const { + return m_noOfRecords; + } /* void setMysqlTableName(char * tableName) { strpcpy(mysqlTableName, tableName); @@ -274,6 +288,7 @@ class RestoreMetaData : public BackupFile { bool readMetaTableDesc(); bool readGCPEntry(); + bool readFragmentInfo(); Uint32 readMetaTableList(); Uint32 m_startGCP; diff --git a/ndb/tools/restore/consumer.cpp b/ndb/tools/restore/consumer.cpp index ecbdbbf8f4e..b130c4998d5 100644 --- a/ndb/tools/restore/consumer.cpp +++ b/ndb/tools/restore/consumer.cpp @@ -45,9 +45,11 @@ BackupConsumer::create_table_string(const TableS & table, pos += sprintf(buf+pos, "%s", "float"); break; case NdbDictionary::Column::Olddecimal: + case NdbDictionary::Column::Decimal: pos += sprintf(buf+pos, "%s", "decimal"); break; case NdbDictionary::Column::Olddecimalunsigned: + case NdbDictionary::Column::Decimalunsigned: pos += sprintf(buf+pos, "%s", "decimal unsigned"); break; case NdbDictionary::Column::Char: diff --git a/ndb/tools/restore/consumer_printer.hpp b/ndb/tools/restore/consumer_printer.hpp index 7cbc924e364..e47bc56f874 100644 --- a/ndb/tools/restore/consumer_printer.hpp +++ b/ndb/tools/restore/consumer_printer.hpp @@ -29,6 +29,8 @@ public: m_print_log = false; m_print_data = false; m_print_meta = false; + m_logCount = 0; + m_dataCount = 0; } virtual bool table(const TableS &); diff --git a/ndb/tools/restore/consumer_restore.cpp b/ndb/tools/restore/consumer_restore.cpp index 70ea7460d78..dc1399e73b2 100644 --- a/ndb/tools/restore/consumer_restore.cpp +++ b/ndb/tools/restore/consumer_restore.cpp @@ -24,7 +24,10 @@ extern FilteredNdbOut err; extern FilteredNdbOut info; extern FilteredNdbOut debug; -static void callback(int, NdbConnection*, void*); +static void callback(int, NdbTransaction*, void*); + +extern const char * g_connect_string; +extern BaseString g_options; bool BackupRestore::init() @@ -34,7 +37,14 @@ BackupRestore::init() if (!m_restore && !m_restore_meta) return true; - m_ndb = new Ndb(); + m_cluster_connection = new Ndb_cluster_connection(g_connect_string); + m_cluster_connection->set_name(g_options.c_str()); + if(m_cluster_connection->connect(12, 5, 1) != 0) + { + return false; + } + + m_ndb = new Ndb(m_cluster_connection); if (m_ndb == NULL) return false; @@ -80,6 +90,12 @@ void BackupRestore::release() delete [] m_callback; m_callback= 0; } + + if (m_cluster_connection) + { + delete m_cluster_connection; + m_cluster_connection= 0; + } } BackupRestore::~BackupRestore() @@ -129,14 +145,38 @@ BackupRestore::finalize_table(const TableS & table){ bool ret= true; if (!m_restore && !m_restore_meta) return ret; - if (table.have_auto_inc()) + if (!table.have_auto_inc()) + return ret; + + Uint64 max_val= table.get_max_auto_val(); + do { - Uint64 max_val= table.get_max_auto_val(); - Uint64 auto_val= m_ndb->readAutoIncrementValue(get_table(table.m_dictTable)); - if (max_val+1 > auto_val || auto_val == ~(Uint64)0) - ret= m_ndb->setAutoIncrementValue(get_table(table.m_dictTable), max_val+1, false); - } - return ret; + Uint64 auto_val = ~(Uint64)0; + int r= m_ndb->readAutoIncrementValue(get_table(table.m_dictTable), auto_val); + if (r == -1 && m_ndb->getNdbError().status == NdbError::TemporaryError) + { + NdbSleep_MilliSleep(50); + continue; // retry + } + else if (r == -1 && m_ndb->getNdbError().code != 626) + { + ret= false; + } + else if ((r == -1 && m_ndb->getNdbError().code == 626) || + max_val+1 > auto_val || auto_val == ~(Uint64)0) + { + r= m_ndb->setAutoIncrementValue(get_table(table.m_dictTable), + max_val+1, false); + if (r == -1 && + m_ndb->getNdbError().status == NdbError::TemporaryError) + { + NdbSleep_MilliSleep(50); + continue; // retry + } + ret = (r == 0); + } + return (ret); + } while (1); } bool @@ -174,6 +214,16 @@ BackupRestore::table(const TableS & table){ copy.setName(split[2].c_str()); + /* + update min and max rows to reflect the table, this to + ensure that memory is allocated properly in the ndb kernel + */ + copy.setMinRows(table.getNoOfRecords()); + if (table.getNoOfRecords() > copy.getMaxRows()) + { + copy.setMaxRows(table.getNoOfRecords()); + } + if (dict->createTable(copy) == -1) { err << "Create table " << table.getTableName() << " failed: " @@ -188,9 +238,6 @@ BackupRestore::table(const TableS & table){ err << "Unable to find table: " << split[2].c_str() << endl; return false; } - if(m_restore_meta){ - m_ndb->setAutoIncrementValue(tab, ~(Uint64)0, false); - } const NdbDictionary::Table* null = 0; m_new_tables.fill(table.m_dictTable->getTableId(), null); m_new_tables[table.m_dictTable->getTableId()] = tab; @@ -204,7 +251,7 @@ BackupRestore::endOfTables(){ NdbDictionary::Dictionary* dict = m_ndb->getDictionary(); for(size_t i = 0; i<m_indexes.size(); i++){ - const NdbTableImpl & indtab = NdbTableImpl::getImpl(* m_indexes[i]); + NdbTableImpl & indtab = NdbTableImpl::getImpl(* m_indexes[i]); BaseString tmp(indtab.m_primaryTable.c_str()); Vector<BaseString> split; @@ -364,7 +411,8 @@ void BackupRestore::tuple_a(restore_callback_t *cb) } // Prepare transaction (the transaction is NOT yet sent to NDB) - cb->connection->executeAsynchPrepare(Commit, &callback, cb); + cb->connection->executeAsynchPrepare(NdbTransaction::Commit, + &callback, cb); m_transactions++; return; } @@ -494,7 +542,7 @@ BackupRestore::logEntry(const LogEntry & tup) if (!m_restore) return; - NdbConnection * trans = m_ndb->startTransaction(); + NdbTransaction * trans = m_ndb->startTransaction(); if (trans == NULL) { // Deep shit, TODO: handle the error @@ -564,7 +612,7 @@ BackupRestore::logEntry(const LogEntry & tup) } // if } - const int ret = trans->execute(Commit); + const int ret = trans->execute(NdbTransaction::Commit); if (ret != 0) { // Both insert update and delete can fail during log running @@ -612,12 +660,12 @@ BackupRestore::endOfLogEntrys() * * (This function must have three arguments: * - The result of the transaction, - * - The NdbConnection object, and + * - The NdbTransaction object, and * - A pointer to an arbitrary object.) */ static void -callback(int result, NdbConnection* trans, void* aObject) +callback(int result, NdbTransaction* trans, void* aObject) { restore_callback_t *cb = (restore_callback_t *)aObject; (cb->restore)->cback(result, cb); @@ -631,7 +679,7 @@ BackupRestore::tuple(const TupleS & tup) return; while (1) { - NdbConnection * trans = m_ndb->startTransaction(); + NdbTransaction * trans = m_ndb->startTransaction(); if (trans == NULL) { // Deep shit, TODO: handle the error @@ -682,7 +730,7 @@ BackupRestore::tuple(const TupleS & tup) else op->setValue(i, dataPtr, length); } - int ret = trans->execute(Commit); + int ret = trans->execute(NdbTransaction::Commit); if (ret != 0) { ndbout << "execute failed: "; diff --git a/ndb/tools/restore/consumer_restore.hpp b/ndb/tools/restore/consumer_restore.hpp index df219cd4412..1bf6d89a912 100644 --- a/ndb/tools/restore/consumer_restore.hpp +++ b/ndb/tools/restore/consumer_restore.hpp @@ -22,7 +22,7 @@ struct restore_callback_t { class BackupRestore *restore; class TupleS tup; - class NdbConnection *connection; + class NdbTransaction *connection; int retries; int error_code; restore_callback_t *next; @@ -35,6 +35,7 @@ public: BackupRestore(Uint32 parallelism=1) { m_ndb = 0; + m_cluster_connection = 0; m_logCount = m_dataCount = 0; m_restore = false; m_restore_meta = false; @@ -62,6 +63,7 @@ public: virtual bool finalize_table(const TableS &); void connectToMysql(); Ndb * m_ndb; + Ndb_cluster_connection * m_cluster_connection; bool m_restore; bool m_restore_meta; Uint32 m_logCount; diff --git a/ndb/tools/restore/consumer_restorem.cpp b/ndb/tools/restore/consumer_restorem.cpp index 6a9ec07148a..56179a60ab0 100644 --- a/ndb/tools/restore/consumer_restorem.cpp +++ b/ndb/tools/restore/consumer_restorem.cpp @@ -21,8 +21,8 @@ extern FilteredNdbOut err; extern FilteredNdbOut info; extern FilteredNdbOut debug; -static bool asynchErrorHandler(NdbConnection * trans, Ndb * ndb); -static void callback(int result, NdbConnection* trans, void* aObject); +static bool asynchErrorHandler(NdbTransaction * trans, Ndb * ndb); +static void callback(int result, NdbTransaction* trans, void* aObject); bool BackupRestore::init() @@ -80,6 +80,7 @@ BackupRestore::init() ndbout_c("Connect failed: %s", mysql_error(&mysql)); returnValue = false; } + mysql.reconnect= 1; ndbout << "Connected to MySQL!!!" <<endl; } @@ -370,7 +371,7 @@ BackupRestore::tuple(const TupleS & tup) return; while (1) { - NdbConnection * trans = m_ndb->startTransaction(); + NdbTransaction * trans = m_ndb->startTransaction(); if (trans == NULL) { // Deep shit, TODO: handle the error @@ -459,7 +460,7 @@ BackupRestore::logEntry(const LogEntry & tup) if (!m_restore) return; - NdbConnection * trans = m_ndb->startTransaction(); + NdbTransaction * trans = m_ndb->startTransaction(); if (trans == NULL) { // Deep shit, TODO: handle the error @@ -550,7 +551,7 @@ BackupRestore::endOfLogEntrys() * ******************************************/ static void restoreCallback(int result, // Result for transaction - NdbConnection *object, // Transaction object + NdbTransaction *object, // Transaction object void *anything) // Not used { static Uint32 counter = 0; @@ -592,12 +593,12 @@ static void restoreCallback(int result, // Result for transaction * * (This function must have three arguments: * - The result of the transaction, - * - The NdbConnection object, and + * - The NdbTransaction object, and * - A pointer to an arbitrary object.) */ static void -callback(int result, NdbConnection* trans, void* aObject) +callback(int result, NdbTransaction* trans, void* aObject) { restore_callback_t *cb = (restore_callback_t *)aObject; (cb->restore)->cback(result, cb); @@ -609,7 +610,7 @@ callback(int result, NdbConnection* trans, void* aObject) * false if it is an error that generates an abort. */ static -bool asynchErrorHandler(NdbConnection * trans, Ndb* ndb) +bool asynchErrorHandler(NdbTransaction * trans, Ndb* ndb) { NdbError error = trans->getNdbError(); ndb->closeTransaction(trans); diff --git a/ndb/tools/restore/restore_main.cpp b/ndb/tools/restore/restore_main.cpp index d786dffe89e..c2e0697b9c5 100644 --- a/ndb/tools/restore/restore_main.cpp +++ b/ndb/tools/restore/restore_main.cpp @@ -50,7 +50,8 @@ static int _print_data = 0; static int _print_log = 0; static int _restore_data = 0; static int _restore_meta = 0; - +BaseString g_options("ndb_restore"); + static struct my_option my_long_options[] = { NDB_STD_OPTS("ndb_restore"), @@ -110,8 +111,10 @@ static my_bool get_one_option(int optid, const struct my_option *opt __attribute__((unused)), char *argument) { - ndb_std_get_one_option(optid, opt, argument ? argument : - "d:t:O,/tmp/ndb_restore.trace"); +#ifndef DBUG_OFF + opt_debug= "d:t:O,/tmp/ndb_restore.trace"; +#endif + ndb_std_get_one_option(optid, opt, argument); switch (optid) { case 'n': if (ga_nodeId == 0) @@ -227,6 +230,7 @@ free_data_callback() g_consumers[i]->tuple_free(); } +const char * g_connect_string = 0; static void exitHandler(int code) { NDBT_ProgramExit(code); @@ -246,7 +250,15 @@ main(int argc, char** argv) exitHandler(NDBT_FAILED); } - Ndb::setConnectString(opt_connect_str); + g_options.appfmt(" -b %d", ga_backupId); + g_options.appfmt(" -n %d", ga_nodeId); + if (_restore_meta) + g_options.appfmt(" -m"); + if (_restore_data) + g_options.appfmt(" -r"); + g_options.appfmt(" -p %d", ga_nParallelism); + + g_connect_string = opt_connect_str; /** * we must always load meta data, even if we will only print it to stdout @@ -324,7 +336,7 @@ main(int argc, char** argv) if (ga_restore || ga_print) { - if (ga_restore) + if(_restore_data || _print_data) { RestoreDataIterator dataIter(metaData, &free_data_callback); @@ -371,7 +383,10 @@ main(int argc, char** argv) for (i= 0; i < g_consumers.size(); i++) g_consumers[i]->endOfTuples(); + } + if(_restore_data || _print_log) + { RestoreLogIterator logIter(metaData); if (!logIter.readHeader()) { @@ -395,6 +410,10 @@ main(int argc, char** argv) logIter.validateFooter(); //not implemented for (i= 0; i < g_consumers.size(); i++) g_consumers[i]->endOfLogEntrys(); + } + + if(_restore_data) + { for(i = 0; i<metaData.getNoOfTables(); i++) { if (checkSysTable(metaData[i]->getTableName())) diff --git a/ndb/tools/select_all.cpp b/ndb/tools/select_all.cpp index 23fd2290349..baa18db1ebd 100644 --- a/ndb/tools/select_all.cpp +++ b/ndb/tools/select_all.cpp @@ -24,7 +24,6 @@ #include <NdbMain.h> #include <NDBT.hpp> #include <NdbSleep.h> -#include <NdbScanFilter.hpp> int scanReadRecords(Ndb*, const NdbDictionary::Table*, @@ -34,14 +33,15 @@ int scanReadRecords(Ndb*, bool headers, bool useHexFormat, char delim, - bool orderby); + bool orderby, + bool descending); NDB_STD_OPTS_VARS; static const char* _dbname = "TEST_DB"; static const char* _delimiter = "\t"; static int _unqualified, _header, _parallelism, _useHexFormat, _lock, - _order; + _order, _descending; static struct my_option my_long_options[] = { @@ -58,6 +58,9 @@ static struct my_option my_long_options[] = { "order", 'o', "Sort resultset according to index", (gptr*) &_order, (gptr*) &_order, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, + { "descending", 'z', "Sort descending (requires order flag)", + (gptr*) &_descending, (gptr*) &_descending, 0, + GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 }, { "header", 'h', "Print header", (gptr*) &_header, (gptr*) &_header, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0 }, @@ -82,13 +85,6 @@ static void usage() my_print_help(my_long_options); my_print_variables(my_long_options); } -static my_bool -get_one_option(int optid, const struct my_option *opt __attribute__((unused)), - char *argument) -{ - return ndb_std_get_one_option(optid, opt, argument ? argument : - "d:t:O,/tmp/ndb_select_all.trace"); -} int main(int argc, char** argv){ NDB_INIT(argv[0]); @@ -96,26 +92,35 @@ int main(int argc, char** argv){ load_defaults("my",load_default_groups,&argc,&argv); const char* _tabname; int ho_error; - if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) +#ifndef DBUG_OFF + opt_debug= "d:t:O,/tmp/ndb_select_all.trace"; +#endif + if ((ho_error=handle_options(&argc, &argv, my_long_options, + ndb_std_get_one_option))) return NDBT_ProgramExit(NDBT_WRONGARGS); if ((_tabname = argv[0]) == 0) { usage(); return NDBT_ProgramExit(NDBT_WRONGARGS); } - Ndb::setConnectString(opt_connect_str); - // Connect to Ndb - Ndb MyNdb(_dbname); + Ndb_cluster_connection con(opt_connect_str); + if(con.connect(12, 5, 1) != 0) + { + ndbout << "Unable to connect to management server." << endl; + return NDBT_ProgramExit(NDBT_FAILED); + } + if (con.wait_until_ready(30,0) < 0) + { + ndbout << "Cluster nodes not ready in 30 seconds." << endl; + return NDBT_ProgramExit(NDBT_FAILED); + } + Ndb MyNdb(&con, _dbname ); if(MyNdb.init() != 0){ ERR(MyNdb.getNdbError()); return NDBT_ProgramExit(NDBT_FAILED); } - // Connect to Ndb and wait for it to become ready - while(MyNdb.waitUntilReady() != 0) - ndbout << "Waiting for ndb to become ready..." << endl; - // Check if table exists in db const NdbDictionary::Table* pTab = NDBT_Table::discoverTableFromDb(&MyNdb, _tabname); const NdbDictionary::Index * pIdx = 0; @@ -138,6 +143,11 @@ int main(int argc, char** argv){ return NDBT_ProgramExit(NDBT_WRONGARGS); } + if (_descending && ! _order) { + ndbout << " Descending flag given without order flag" << endl; + return NDBT_ProgramExit(NDBT_WRONGARGS); + } + if (scanReadRecords(&MyNdb, pTab, pIdx, @@ -145,7 +155,7 @@ int main(int argc, char** argv){ _lock, _header, _useHexFormat, - (char)*_delimiter, _order) != 0){ + (char)*_delimiter, _order, _descending) != 0){ return NDBT_ProgramExit(NDBT_FAILED); } @@ -160,12 +170,12 @@ int scanReadRecords(Ndb* pNdb, int _lock, bool headers, bool useHexFormat, - char delimiter, bool order){ + char delimiter, bool order, bool descending){ int retryAttempt = 0; const int retryMax = 100; int check; - NdbConnection *pTrans; + NdbTransaction *pTrans; NdbScanOperation *pOp; NdbIndexScanOperation * pIOp= 0; @@ -202,7 +212,7 @@ int scanReadRecords(Ndb* pNdb, return -1; } - NdbResultSet * rs; + int rs; switch(_lock + (3 * order)){ case 1: rs = pOp->readTuples(NdbScanOperation::LM_Read, 0, parallel); @@ -212,20 +222,20 @@ int scanReadRecords(Ndb* pNdb, break; case 3: rs = pIOp->readTuples(NdbScanOperation::LM_CommittedRead, 0, parallel, - true); + true, descending); break; case 4: - rs = pIOp->readTuples(NdbScanOperation::LM_Read, 0, parallel, true); + rs = pIOp->readTuples(NdbScanOperation::LM_Read, 0, parallel, true, descending); break; case 5: - rs = pIOp->readTuples(NdbScanOperation::LM_Exclusive, 0, parallel, true); + rs = pIOp->readTuples(NdbScanOperation::LM_Exclusive, 0, parallel, true, descending); break; case 0: default: rs = pOp->readTuples(NdbScanOperation::LM_CommittedRead, 0, parallel); break; } - if( rs == 0 ){ + if( rs != 0 ){ ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return -1; @@ -291,7 +301,7 @@ int scanReadRecords(Ndb* pNdb, } } - check = pTrans->execute(NoCommit); + check = pTrans->execute(NdbTransaction::NoCommit); if( check == -1 ) { const NdbError err = pTrans->getNdbError(); @@ -311,7 +321,7 @@ int scanReadRecords(Ndb* pNdb, int eof; int rows = 0; - eof = rs->nextResult(); + eof = pOp->nextResult(); while(eof == 0){ rows++; @@ -322,7 +332,7 @@ int scanReadRecords(Ndb* pNdb, ndbout << (*row) << endl; } - eof = rs->nextResult(); + eof = pOp->nextResult(); } if (eof == -1) { const NdbError err = pTrans->getNdbError(); diff --git a/ndb/tools/select_count.cpp b/ndb/tools/select_count.cpp index a9a3e71da67..6fa3c77f15a 100644 --- a/ndb/tools/select_count.cpp +++ b/ndb/tools/select_count.cpp @@ -30,7 +30,7 @@ static int select_count(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism, int* count_rows, - UtilTransactions::ScanLock lock); + NdbOperation::LockMode lock); NDB_STD_OPTS_VARS; @@ -60,39 +60,41 @@ static void usage() my_print_help(my_long_options); my_print_variables(my_long_options); } -static my_bool -get_one_option(int optid, const struct my_option *opt __attribute__((unused)), - char *argument) -{ - return ndb_std_get_one_option(optid, opt, argument ? argument : - "d:t:O,/tmp/ndb_select_count.trace"); -} int main(int argc, char** argv){ NDB_INIT(argv[0]); const char *load_default_groups[]= { "mysql_cluster",0 }; load_defaults("my",load_default_groups,&argc,&argv); int ho_error; - if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) +#ifndef DBUG_OFF + opt_debug= "d:t:O,/tmp/ndb_select_count.trace"; +#endif + if ((ho_error=handle_options(&argc, &argv, my_long_options, + ndb_std_get_one_option))) return NDBT_ProgramExit(NDBT_WRONGARGS); if (argc < 1) { usage(); return NDBT_ProgramExit(NDBT_WRONGARGS); } - Ndb::setConnectString(opt_connect_str); - // Connect to Ndb - Ndb MyNdb(_dbname); + Ndb_cluster_connection con(opt_connect_str); + if(con.connect(12, 5, 1) != 0) + { + ndbout << "Unable to connect to management server." << endl; + return NDBT_ProgramExit(NDBT_FAILED); + } + if (con.wait_until_ready(30,0) < 0) + { + ndbout << "Cluster nodes not ready in 30 seconds." << endl; + return NDBT_ProgramExit(NDBT_FAILED); + } + Ndb MyNdb(&con, _dbname ); if(MyNdb.init() != 0){ ERR(MyNdb.getNdbError()); return NDBT_ProgramExit(NDBT_FAILED); } - // Connect to Ndb and wait for it to become ready - while(MyNdb.waitUntilReady() != 0) - ndbout << "Waiting for ndb to become ready..." << endl; - for(int i = 0; i<argc; i++){ // Check if table exists in db const NdbDictionary::Table * pTab = NDBT_Table::discoverTableFromDb(&MyNdb, argv[i]); @@ -103,7 +105,7 @@ int main(int argc, char** argv){ int rows = 0; if (select_count(&MyNdb, pTab, _parallelism, &rows, - (UtilTransactions::ScanLock)_lock) != 0){ + (NdbOperation::LockMode)_lock) != 0){ return NDBT_ProgramExit(NDBT_FAILED); } @@ -116,12 +118,12 @@ int select_count(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism, int* count_rows, - UtilTransactions::ScanLock lock){ + NdbOperation::LockMode lock){ int retryAttempt = 0; const int retryMax = 100; int check; - NdbConnection *pTrans; + NdbTransaction *pTrans; NdbScanOperation *pOp; while (true){ @@ -151,8 +153,7 @@ select_count(Ndb* pNdb, const NdbDictionary::Table* pTab, return NDBT_FAILED; } - NdbResultSet * rs = pOp->readTuples(NdbScanOperation::LM_Dirty); - if( rs == 0 ) { + if( pOp->readTuples(NdbScanOperation::LM_Dirty) ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; @@ -167,9 +168,10 @@ select_count(Ndb* pNdb, const NdbDictionary::Table* pTab, } Uint64 tmp; + Uint32 row_size; pOp->getValue(NdbDictionary::Column::ROW_COUNT, (char*)&tmp); - - check = pTrans->execute(NoCommit); + pOp->getValue(NdbDictionary::Column::ROW_SIZE, (char*)&row_size); + check = pTrans->execute(NdbTransaction::NoCommit); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); @@ -178,7 +180,7 @@ select_count(Ndb* pNdb, const NdbDictionary::Table* pTab, Uint64 row_count = 0; int eof; - while((eof = rs->nextResult(true)) == 0){ + while((eof = pOp->nextResult(true)) == 0){ row_count += tmp; } diff --git a/ndb/tools/waiter.cpp b/ndb/tools/waiter.cpp index 9bd2befce15..cb02d5e7c36 100644 --- a/ndb/tools/waiter.cpp +++ b/ndb/tools/waiter.cpp @@ -60,24 +60,19 @@ static void usage() my_print_variables(my_long_options); } -static my_bool -get_one_option(int optid, const struct my_option *opt __attribute__((unused)), - char *argument) -{ - return ndb_std_get_one_option(optid, opt, argument ? argument : - "d:t:O,/tmp/ndb_drop_table.trace"); -} - int main(int argc, char** argv){ NDB_INIT(argv[0]); const char *load_default_groups[]= { "mysql_cluster",0 }; load_defaults("my",load_default_groups,&argc,&argv); const char* _hostName = NULL; int ho_error; - if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option))) +#ifndef DBUG_OFF + opt_debug= "d:t:O,/tmp/ndb_waiter.trace"; +#endif + if ((ho_error=handle_options(&argc, &argv, my_long_options, + ndb_std_get_one_option))) return NDBT_ProgramExit(NDBT_WRONGARGS); - char buf[255]; _hostName = argv[0]; if (_hostName == 0) |