From 85394329bce5c4c239e5e4bc0abf050cef930a90 Mon Sep 17 00:00:00 2001 From: "dli/root@dev3-76.dev.cn.tlan" <> Date: Tue, 15 Aug 2006 20:26:47 +0800 Subject: [PATCH] Bug#19047, not start the event thread when ndb_mgm is running in executing (-e) thread. --- ndb/src/mgmclient/CommandInterpreter.cpp | 148 ++++++++++++----------- ndb/src/mgmclient/main.cpp | 4 +- ndb/src/mgmclient/ndb_mgmclient.hpp | 4 +- 3 files changed, 80 insertions(+), 76 deletions(-) diff --git a/ndb/src/mgmclient/CommandInterpreter.cpp b/ndb/src/mgmclient/CommandInterpreter.cpp index d4f66a56da9..28953b5b7e2 100644 --- a/ndb/src/mgmclient/CommandInterpreter.cpp +++ b/ndb/src/mgmclient/CommandInterpreter.cpp @@ -55,11 +55,11 @@ public: * * @return true until quit/bye/exit has been typed */ - int execute(const char *_line, int _try_reconnect=-1, int *error= 0); + int execute(const char *_line, int _try_reconnect=-1, bool interactive=1, int *error= 0); private: void printError(); - int execute_impl(const char *_line); + int execute_impl(const char *_line, bool interactive=1); /** * Analyse the command line, after the first token. @@ -99,7 +99,7 @@ private: */ void executeHelp(char* parameters); void executeShow(char* parameters); - void executeConnect(char* parameters); + void executeConnect(char* parameters, bool interactive); void executePurge(char* parameters); int executeShutdown(char* parameters); void executeRun(char* parameters); @@ -137,7 +137,7 @@ public: void executeCpc(char * parameters); public: - bool connect(); + bool connect(bool interactive); bool disconnect(); /** @@ -198,9 +198,9 @@ Ndb_mgmclient::~Ndb_mgmclient() { delete m_cmd; } -int Ndb_mgmclient::execute(const char *_line, int _try_reconnect, int *error) +int Ndb_mgmclient::execute(const char *_line, int _try_reconnect, bool interactive, int *error) { - return m_cmd->execute(_line,_try_reconnect,error); + return m_cmd->execute(_line,_try_reconnect,interactive, error); } int Ndb_mgmclient::disconnect() @@ -246,7 +246,7 @@ extern "C" { #include #include -int Ndb_mgmclient::execute(int argc, char** argv, int _try_reconnect, int *error) +int Ndb_mgmclient::execute(int argc, char** argv, int _try_reconnect, bool interactive, int *error) { if (argc <= 0) return 0; @@ -255,7 +255,7 @@ int Ndb_mgmclient::execute(int argc, char** argv, int _try_reconnect, int *error { _line.appfmt(" %s", argv[i]); } - return m_cmd->execute(_line.c_str(),_try_reconnect, error); + return m_cmd->execute(_line.c_str(),_try_reconnect, interactive, error); } /***************************************************************************** @@ -400,7 +400,7 @@ CommandInterpreter::CommandInterpreter(const char *_host,int verbose) { m_constr= _host; m_connected= false; - m_event_thread= 0; + m_event_thread= NULL; try_reconnect = 0; m_print_mutex= NdbMutex_Create(); #ifdef HAVE_GLOBAL_REPLICATION @@ -495,7 +495,7 @@ event_thread_run(void* p) } bool -CommandInterpreter::connect() +CommandInterpreter::connect(bool interactive) { DBUG_ENTER("CommandInterpreter::connect"); @@ -507,10 +507,12 @@ CommandInterpreter::connect() ndbout_c("Cannot create handle to management server."); exit(-1); } - m_mgmsrv2 = ndb_mgm_create_handle(); - if(m_mgmsrv2 == NULL) { - ndbout_c("Cannot create 2:nd handle to management server."); - exit(-1); + if (interactive) { + m_mgmsrv2 = ndb_mgm_create_handle(); + if(m_mgmsrv2 == NULL) { + ndbout_c("Cannot create 2:nd handle to management server."); + exit(-1); + } } if (ndb_mgm_set_connectstring(m_mgmsrv, m_constr)) @@ -524,62 +526,64 @@ CommandInterpreter::connect() const char *host= ndb_mgm_get_connected_host(m_mgmsrv); unsigned port= ndb_mgm_get_connected_port(m_mgmsrv); - BaseString constr; - constr.assfmt("%s:%d",host,port); - if(!ndb_mgm_set_connectstring(m_mgmsrv2, constr.c_str()) && - !ndb_mgm_connect(m_mgmsrv2, try_reconnect-1, 5, 1)) - { - DBUG_PRINT("info",("2:ndb connected to Management Server ok at: %s:%d", - host, port)); - assert(m_event_thread == 0); - assert(do_event_thread == 0); - do_event_thread= 0; - struct event_thread_param p; - p.m= &m_mgmsrv2; - p.p= &m_print_mutex; - m_event_thread = NdbThread_Create(event_thread_run, - (void**)&p, - 32768, - "CommandInterpreted_event_thread", - NDB_THREAD_PRIO_LOW); - if (m_event_thread != 0) + if (interactive) { + BaseString constr; + constr.assfmt("%s:%d",host,port); + if(!ndb_mgm_set_connectstring(m_mgmsrv2, constr.c_str()) && + !ndb_mgm_connect(m_mgmsrv2, try_reconnect-1, 5, 1)) { - DBUG_PRINT("info",("Thread created ok, waiting for started...")); - int iter= 1000; // try for 30 seconds - while(do_event_thread == 0 && - iter-- > 0) - NdbSleep_MilliSleep(30); - } - if (m_event_thread == 0 || - do_event_thread == 0 || - do_event_thread == -1) - { - DBUG_PRINT("info",("Warning, event thread startup failed, " - "degraded printouts as result, errno=%d", - errno)); - printf("Warning, event thread startup failed, " - "degraded printouts as result, errno=%d\n", errno); + DBUG_PRINT("info",("2:ndb connected to Management Server ok at: %s:%d", + host, port)); + assert(m_event_thread == NULL); + assert(do_event_thread == 0); do_event_thread= 0; + struct event_thread_param p; + p.m= &m_mgmsrv2; + p.p= &m_print_mutex; + m_event_thread = NdbThread_Create(event_thread_run, + (void**)&p, + 32768, + "CommandInterpreted_event_thread", + NDB_THREAD_PRIO_LOW); if (m_event_thread) { - void *res; - NdbThread_WaitFor(m_event_thread, &res); - NdbThread_Destroy(&m_event_thread); + DBUG_PRINT("info",("Thread created ok, waiting for started...")); + int iter= 1000; // try for 30 seconds + while(do_event_thread == 0 && + iter-- > 0) + NdbSleep_MilliSleep(30); + } + if (m_event_thread == NULL || + do_event_thread == 0 || + do_event_thread == -1) + { + DBUG_PRINT("info",("Warning, event thread startup failed, " + "degraded printouts as result, errno=%d", + errno)); + printf("Warning, event thread startup failed, " + "degraded printouts as result, errno=%d\n", errno); + do_event_thread= 0; + if (m_event_thread) + { + void *res; + NdbThread_WaitFor(m_event_thread, &res); + NdbThread_Destroy(&m_event_thread); + } + ndb_mgm_disconnect(m_mgmsrv2); } - ndb_mgm_disconnect(m_mgmsrv2); } - } - else - { - DBUG_PRINT("warning", - ("Could not do 2:nd connect to mgmtserver for event listening")); - DBUG_PRINT("info", ("code: %d, msg: %s", - ndb_mgm_get_latest_error(m_mgmsrv2), - ndb_mgm_get_latest_error_msg(m_mgmsrv2))); - printf("Warning, event connect failed, degraded printouts as result\n"); - printf("code: %d, msg: %s\n", - ndb_mgm_get_latest_error(m_mgmsrv2), - ndb_mgm_get_latest_error_msg(m_mgmsrv2)); + else + { + DBUG_PRINT("warning", + ("Could not do 2:nd connect to mgmtserver for event listening")); + DBUG_PRINT("info", ("code: %d, msg: %s", + ndb_mgm_get_latest_error(m_mgmsrv2), + ndb_mgm_get_latest_error_msg(m_mgmsrv2))); + printf("Warning, event connect failed, degraded printouts as result\n"); + printf("code: %d, msg: %s\n", + ndb_mgm_get_latest_error(m_mgmsrv2), + ndb_mgm_get_latest_error_msg(m_mgmsrv2)); + } } m_connected= true; DBUG_PRINT("info",("Connected to Management Server at: %s:%d", host, port)); @@ -602,7 +606,7 @@ CommandInterpreter::disconnect() do_event_thread= 0; NdbThread_WaitFor(m_event_thread, &res); NdbThread_Destroy(&m_event_thread); - m_event_thread= 0; + m_event_thread= NULL; ndb_mgm_destroy_handle(&m_mgmsrv2); } if (m_connected) @@ -618,11 +622,11 @@ CommandInterpreter::disconnect() int CommandInterpreter::execute(const char *_line, int _try_reconnect, - int *error) + bool interactive, int *error) { if (_try_reconnect >= 0) try_reconnect=_try_reconnect; - int result= execute_impl(_line); + int result= execute_impl(_line, interactive); if (error) *error= m_error; @@ -637,7 +641,7 @@ invalid_command(const char *cmd) } int -CommandInterpreter::execute_impl(const char *_line) +CommandInterpreter::execute_impl(const char *_line, bool interactive) { DBUG_ENTER("CommandInterpreter::execute_impl"); DBUG_PRINT("enter",("line=\"%s\"",_line)); @@ -686,7 +690,7 @@ CommandInterpreter::execute_impl(const char *_line) DBUG_RETURN(true); } else if (strcasecmp(firstToken, "CONNECT") == 0) { - executeConnect(allAfterFirstToken); + executeConnect(allAfterFirstToken, interactive); DBUG_RETURN(true); } else if (strcasecmp(firstToken, "SLEEP") == 0) { @@ -701,7 +705,7 @@ CommandInterpreter::execute_impl(const char *_line) DBUG_RETURN(false); } - if (!connect()) + if (!connect(interactive)) DBUG_RETURN(true); if (strcasecmp(firstToken, "SHOW") == 0) { @@ -1312,13 +1316,13 @@ CommandInterpreter::executeShow(char* parameters) } void -CommandInterpreter::executeConnect(char* parameters) +CommandInterpreter::executeConnect(char* parameters, bool interactive) { disconnect(); if (!emptyString(parameters)) { m_constr= BaseString(parameters).trim().c_str(); } - connect(); + connect(interactive); } //***************************************************************************** diff --git a/ndb/src/mgmclient/main.cpp b/ndb/src/mgmclient/main.cpp index ba5d0308f1f..57041af8fd1 100644 --- a/ndb/src/mgmclient/main.cpp +++ b/ndb/src/mgmclient/main.cpp @@ -121,7 +121,7 @@ read_and_execute(int _try_reconnect) line_read= strdup(linebuffer); } #endif - return com->execute(line_read,_try_reconnect); + return com->execute(line_read, _try_reconnect, 1); } int main(int argc, char** argv){ @@ -163,7 +163,7 @@ int main(int argc, char** argv){ } else { - com->execute(opt_execute_str,_try_reconnect, &ret); + com->execute(opt_execute_str,_try_reconnect, 0, &ret); } delete com; diff --git a/ndb/src/mgmclient/ndb_mgmclient.hpp b/ndb/src/mgmclient/ndb_mgmclient.hpp index bffdf69f920..956caebe803 100644 --- a/ndb/src/mgmclient/ndb_mgmclient.hpp +++ b/ndb/src/mgmclient/ndb_mgmclient.hpp @@ -23,8 +23,8 @@ class Ndb_mgmclient public: Ndb_mgmclient(const char*,int verbose=0); ~Ndb_mgmclient(); - int execute(const char *_line, int _try_reconnect=-1, int *error= 0); - int execute(int argc, char** argv, int _try_reconnect=-1, int *error= 0); + int execute(const char *_line, int _try_reconnect=-1, bool interactive=1, int *error= 0); + int execute(int argc, char** argv, int _try_reconnect=-1, bool interactive=1, int *error= 0); int disconnect(); private: CommandInterpreter *m_cmd;