mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 06:44:16 +01:00
Bug#19047, not start the event thread when ndb_mgm is running in executing (-e) thread.
This commit is contained in:
parent
a0e70db300
commit
85394329bc
3 changed files with 80 additions and 76 deletions
|
@ -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 <util/InputStream.hpp>
|
||||
#include <util/OutputStream.hpp>
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue