Loading mysql-test/r/ndb_backup_print.result 0 → 100644 +64 −0 Original line number Diff line number Diff line use test; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; Connected to Management Server at: : Waiting for completed, this may take several minutes Node : Backup started from node Node : Backup started from node completed StartGCP: StopGCP: #Records: #LogRecords: Data: bytes Log: bytes create table t1 (pk int key ,a1 BIT(1), a2 BIT(5), a3 BIT(33), a4 BIT(63), a5 BIT(64) ,b1 TINYINT, b2 TINYINT UNSIGNED ,c1 SMALLINT, c2 SMALLINT UNSIGNED ,d1 INT, d2 INT UNSIGNED ,e1 BIGINT, e2 BIGINT UNSIGNED ,f1 CHAR(1) BINARY, f2 CHAR(32) BINARY, f3 CHAR(255) BINARY ,g1 VARCHAR(32) BINARY, g2 VARCHAR(255) BINARY, g3 VARCHAR(1000) BINARY ,h1 BINARY(1), h2 BINARY(8), h3 BINARY(255) ,i1 VARBINARY(32), i2 VARBINARY(255), i3 VARBINARY(1000) ) engine ndb; insert into t1 values (1 ,0x1, 0x17, 0x789a, 0x789abcde, 0xfedc0001 ,127, 255 ,32767, 65535 ,2147483647, 4294967295 ,9223372036854775807, 18446744073709551615 ,'1','12345678901234567890123456789012','123456789' ,'1','12345678901234567890123456789012','123456789' ,0x12,0x123456789abcdef0, 0x012345 ,0x12,0x123456789abcdef0, 0x00123450 ); insert into t1 values (2 ,0, 0, 0, 0, 0 ,-128, 0 ,-32768, 0 ,-2147483648, 0 ,-9223372036854775808, 0 ,'','','' ,'','','' ,0x0,0x0,0x0 ,0x0,0x0,0x0 ); insert into t1 values (3 ,NULL,NULL,NULL,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ); Connected to Management Server at: : Waiting for completed, this may take several minutes Node : Backup started from node Node : Backup started from node completed StartGCP: StopGCP: #Records: #LogRecords: Data: bytes Log: bytes mysql-test/t/ndb_backup_print.test 0 → 100644 +66 −0 Original line number Diff line number Diff line -- source include/have_ndb.inc -- source include/ndb_default_cluster.inc -- source include/not_embedded.inc --disable_warnings use test; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; --enable_warnings #NO.1 test output of backup --exec $NDB_MGM --no-defaults -e "start backup" |sed -e 's/[0-9]//g' |sed -e 's/localhost//g' |sed -e 's/\.\.\.*//g' create table t1 (pk int key ,a1 BIT(1), a2 BIT(5), a3 BIT(33), a4 BIT(63), a5 BIT(64) ,b1 TINYINT, b2 TINYINT UNSIGNED ,c1 SMALLINT, c2 SMALLINT UNSIGNED ,d1 INT, d2 INT UNSIGNED ,e1 BIGINT, e2 BIGINT UNSIGNED ,f1 CHAR(1) BINARY, f2 CHAR(32) BINARY, f3 CHAR(255) BINARY ,g1 VARCHAR(32) BINARY, g2 VARCHAR(255) BINARY, g3 VARCHAR(1000) BINARY ,h1 BINARY(1), h2 BINARY(8), h3 BINARY(255) ,i1 VARBINARY(32), i2 VARBINARY(255), i3 VARBINARY(1000) ) engine ndb; insert into t1 values (1 ,0x1, 0x17, 0x789a, 0x789abcde, 0xfedc0001 ,127, 255 ,32767, 65535 ,2147483647, 4294967295 ,9223372036854775807, 18446744073709551615 ,'1','12345678901234567890123456789012','123456789' ,'1','12345678901234567890123456789012','123456789' ,0x12,0x123456789abcdef0, 0x012345 ,0x12,0x123456789abcdef0, 0x00123450 ); insert into t1 values (2 ,0, 0, 0, 0, 0 ,-128, 0 ,-32768, 0 ,-2147483648, 0 ,-9223372036854775808, 0 ,'','','' ,'','','' ,0x0,0x0,0x0 ,0x0,0x0,0x0 ); insert into t1 values (3 ,NULL,NULL,NULL,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ); #NO.2 test output of backup after some simple SQL operations --exec $NDB_MGM --no-defaults -e "start backup" |sed -e 's/[0-9]//g' |sed -e 's/localhost//g' |sed -e 's/\.\.\.*//g' ndb/include/debugger/EventLogger.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -175,5 +175,5 @@ private: char m_text[MAX_TEXT_LENGTH]; }; extern void getRestartAction(Uint32 action, BaseString &str); #endif ndb/src/mgmclient/CommandInterpreter.cpp +209 −69 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <mgmapi.h> #include <util/BaseString.hpp> #include <ndbd_exit_codes.h> class MgmtSrvr; Loading Loading @@ -125,7 +126,7 @@ class CommandInterpreter { int executeStatus(int processId, const char* parameters, bool all); int executeEventReporting(int processId, const char* parameters, bool all); int executeDumpState(int processId, const char* parameters, bool all); int executeStartBackup(char * parameters); int executeStartBackup(char * parameters, bool interactive); int executeAbortBackup(char * parameters); int executeStop(Vector<BaseString> &command_list, unsigned command_pos, int *node_ids, int no_of_nodes); Loading Loading @@ -768,6 +769,133 @@ CommandInterpreter::printError() } } /* * print log event from mgmsrv to console screen */ #define make_uint64(a,b) (((Uint64)(a)) + (((Uint64)(b)) << 32)) #define Q64(a) make_uint64(event->EVENT.a ## _lo, event->EVENT.a ## _hi) #define R event->source_nodeid #define Q(a) event->EVENT.a #define QVERSION getMajor(Q(version)), getMinor(Q(version)), getBuild(Q(version)) #define NDB_LE_(a) NDB_LE_ ## a static void printLogEvent(struct ndb_logevent* event) { switch (event->type) { /** * NDB_MGM_EVENT_CATEGORY_BACKUP */ #undef EVENT #define EVENT BackupStarted case NDB_LE_BackupStarted: ndbout_c("Node %u: Backup %d started from node %d", R, Q(backup_id), Q(starting_node)); break; #undef EVENT #define EVENT BackupFailedToStart case NDB_LE_BackupFailedToStart: ndbout_c("Node %u: Backup request from %d failed to start. Error: %d", R, Q(starting_node), Q(error)); break; #undef EVENT #define EVENT BackupCompleted case NDB_LE_BackupCompleted: ndbout_c("Node %u: Backup %u started from node %u completed\n" " StartGCP: %u StopGCP: %u\n" " #Records: %u #LogRecords: %u\n" " Data: %u bytes Log: %u bytes", R, Q(backup_id), Q(starting_node), Q(start_gci), Q(stop_gci), Q(n_records), Q(n_log_records), Q(n_bytes), Q(n_log_bytes)); break; #undef EVENT #define EVENT BackupAborted case NDB_LE_BackupAborted: ndbout_c("Node %u: Backup %d started from %d has been aborted. Error: %d", R, Q(backup_id), Q(starting_node), Q(error)); break; /** * NDB_MGM_EVENT_CATEGORY_STARTUP */ #undef EVENT #define EVENT NDBStartStarted case NDB_LE_NDBStartStarted: ndbout_c("Node %u: Start initiated (version %d.%d.%d)", R, QVERSION); break; #undef EVENT #define EVENT NDBStartCompleted case NDB_LE_NDBStartCompleted: ndbout_c("Node %u: Started (version %d.%d.%d)", R, QVERSION); break; #undef EVENT #define EVENT NDBStopStarted case NDB_LE_NDBStopStarted: ndbout_c("Node %u: %s shutdown initiated", R, (Q(stoptype) == 1 ? "Cluster" : "Node")); break; #undef EVENT #define EVENT NDBStopCompleted case NDB_LE_NDBStopCompleted: { BaseString action_str(""); BaseString signum_str(""); getRestartAction(Q(action), action_str); if (Q(signum)) signum_str.appfmt(" Initiated by signal %d.", Q(signum)); ndbout_c("Node %u: Node shutdown completed%s.%s", R, action_str.c_str(), signum_str.c_str()); } break; #undef EVENT #define EVENT NDBStopForced case NDB_LE_NDBStopForced: { BaseString action_str(""); BaseString reason_str(""); BaseString sphase_str(""); int signum = Q(signum); int error = Q(error); int sphase = Q(sphase); int extra = Q(extra); getRestartAction(Q(action), action_str); if (signum) reason_str.appfmt(" Initiated by signal %d.", signum); if (error) { ndbd_exit_classification cl; ndbd_exit_status st; const char *msg = ndbd_exit_message(error, &cl); const char *cl_msg = ndbd_exit_classification_message(cl, &st); const char *st_msg = ndbd_exit_status_message(st); reason_str.appfmt(" Caused by error %d: \'%s(%s). %s\'.", error, msg, cl_msg, st_msg); if (extra != 0) reason_str.appfmt(" (extra info %d)", extra); } if (sphase < 255) sphase_str.appfmt(" Occured during startphase %u.", sphase); ndbout_c("Node %u: Forced node shutdown completed%s.%s%s", R, action_str.c_str(), sphase_str.c_str(), reason_str.c_str()); } break; #undef EVENT #define EVENT StopAborted case NDB_LE_NDBStopAborted: ndbout_c("Node %u: Node shutdown aborted", R); break; /** * default nothing to print */ default: break; } } //***************************************************************************** //***************************************************************************** Loading @@ -784,27 +912,21 @@ event_thread_run(void* p) int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 1, NDB_MGM_EVENT_CATEGORY_STARTUP, 0 }; int fd = ndb_mgm_listen_event(handle, filter); if (fd != NDB_INVALID_SOCKET) NdbLogEventHandle log_handle= NULL; struct ndb_logevent log_event; log_handle= ndb_mgm_create_logevent_handle(handle, filter); if (log_handle) { do_event_thread= 1; char *tmp= 0; char buf[1024]; SocketInputStream in(fd,10); do { if (tmp == 0) NdbSleep_MilliSleep(10); if((tmp = in.gets(buf, 1024))) { const char ping_token[]= "<PING>"; if (memcmp(ping_token,tmp,sizeof(ping_token)-1)) if(tmp && strlen(tmp)) { if (ndb_logevent_get_next(log_handle, &log_event, 2000) <= 0) continue; Guard g(printmutex); ndbout << tmp; } } printLogEvent(&log_event); } while(do_event_thread); NDB_CLOSE_SOCKET(fd); ndb_mgm_destroy_logevent_handle(&log_handle); } else { Loading Loading @@ -1054,7 +1176,7 @@ CommandInterpreter::execute_impl(const char *_line, bool interactive) else if(strcasecmp(firstToken, "START") == 0 && allAfterFirstToken != NULL && strncasecmp(allAfterFirstToken, "BACKUP", sizeof("BACKUP") - 1) == 0){ m_error= executeStartBackup(allAfterFirstToken); m_error= executeStartBackup(allAfterFirstToken, interactive); DBUG_RETURN(true); } else if(strcasecmp(firstToken, "ABORT") == 0 && Loading Loading @@ -2531,20 +2653,11 @@ CommandInterpreter::executeEventReporting(int processId, * Backup *****************************************************************************/ int CommandInterpreter::executeStartBackup(char* parameters) CommandInterpreter::executeStartBackup(char* parameters, bool interactive) { struct ndb_mgm_reply reply; unsigned int backupId; #if 0 int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0 }; int fd = ndb_mgm_listen_event(m_mgmsrv, filter); if (fd < 0) { ndbout << "Initializing start of backup failed" << endl; printError(); return fd; } #endif Vector<BaseString> args; { BaseString(parameters).split(args); Loading @@ -2557,25 +2670,20 @@ CommandInterpreter::executeStartBackup(char* parameters) int sz= args.size(); int result; if (sz == 2 && args[1] == "NOWAIT") int flags = 2; if (sz == 2 && args[1] == "NOWAIT") { result = ndb_mgm_start_backup(m_mgmsrv, 0, &backupId, &reply); flags = 0; } else if (sz == 1 || (sz == 3 && args[1] == "WAIT" && args[2] == "COMPLETED")) else if (sz == 1 || (sz == 3 && args[1] == "WAIT" && args[2] == "COMPLETED")) { flags = 2; ndbout_c("Waiting for completed, this may take several minutes"); result = ndb_mgm_start_backup(m_mgmsrv, 2, &backupId, &reply); } else if (sz == 3 && args[1] == "WAIT" && args[2] == "STARTED") else if (sz == 3 && args[1] == "WAIT" && args[2] == "STARTED") { ndbout_c("Waiting for started, this may take several minutes"); result = ndb_mgm_start_backup(m_mgmsrv, 1, &backupId, &reply); flags = 1; } else { Loading @@ -2583,48 +2691,80 @@ CommandInterpreter::executeStartBackup(char* parameters) return -1; } NdbLogEventHandle log_handle= NULL; struct ndb_logevent log_event; if (flags == 2 && !interactive) { int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0, 0 }; log_handle = ndb_mgm_create_logevent_handle(m_mgmsrv, filter); if (!log_handle) { ndbout << "Initializing start of backup failed" << endl; printError(); return -1; } } result = ndb_mgm_start_backup(m_mgmsrv, flags, &backupId, &reply); if (result != 0) { ndbout << "Backup failed" << endl; printError(); #if 0 close(fd); #endif if (log_handle) ndb_mgm_destroy_logevent_handle(&log_handle); return result; } #if 0 ndbout_c("Waiting for completed, this may take several minutes"); char *tmp; char buf[1024]; /** * If interactive, event listner thread is already running */ if (log_handle && !interactive) { SocketInputStream in(fd); int count = 0; int retry = 0; do { tmp = in.gets(buf, 1024); if(tmp) if (ndb_logevent_get_next(log_handle, &log_event, 60000) > 0) { int print = 0; switch (log_event.type) { case NDB_LE_BackupStarted: if (log_event.BackupStarted.backup_id == backupId) print = 1; break; case NDB_LE_BackupCompleted: if (log_event.BackupCompleted.backup_id == backupId) print = 1; break; case NDB_LE_BackupAborted: if (log_event.BackupAborted.backup_id == backupId) print = 1; break; default: break; } if (print) { ndbout << tmp; unsigned int id; if(sscanf(tmp, "%*[^:]: Backup %d ", &id) == 1 && id == backupId){ Guard g(m_print_mutex); printLogEvent(&log_event); count++; } } } while(count < 2); else { retry++; } } while(count < 2 && retry < 3); SocketInputStream in(fd, 10); do { tmp = in.gets(buf, 1024); if(tmp && tmp[0] != 0) { ndbout << tmp; if (retry >= 3) ndbout << "get backup event failed for " << retry << " times" << endl; ndb_mgm_destroy_logevent_handle(&log_handle); } } while(tmp && tmp[0] != 0); close(fd); #endif return 0; } int CommandInterpreter::executeAbortBackup(char* parameters) { Loading ndb/src/mgmclient/Makefile.am +2 −1 Original line number Diff line number Diff line Loading @@ -21,7 +21,8 @@ libndbmgmclient_la_LIBADD = ../mgmapi/libmgmapi.la \ ../common/logger/liblogger.la \ ../common/portlib/libportlib.la \ ../common/util/libgeneral.la \ ../common/portlib/libportlib.la ../common/portlib/libportlib.la \ ../common/debugger/libtrace.la ndb_mgm_SOURCES = main.cpp Loading Loading
mysql-test/r/ndb_backup_print.result 0 → 100644 +64 −0 Original line number Diff line number Diff line use test; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; Connected to Management Server at: : Waiting for completed, this may take several minutes Node : Backup started from node Node : Backup started from node completed StartGCP: StopGCP: #Records: #LogRecords: Data: bytes Log: bytes create table t1 (pk int key ,a1 BIT(1), a2 BIT(5), a3 BIT(33), a4 BIT(63), a5 BIT(64) ,b1 TINYINT, b2 TINYINT UNSIGNED ,c1 SMALLINT, c2 SMALLINT UNSIGNED ,d1 INT, d2 INT UNSIGNED ,e1 BIGINT, e2 BIGINT UNSIGNED ,f1 CHAR(1) BINARY, f2 CHAR(32) BINARY, f3 CHAR(255) BINARY ,g1 VARCHAR(32) BINARY, g2 VARCHAR(255) BINARY, g3 VARCHAR(1000) BINARY ,h1 BINARY(1), h2 BINARY(8), h3 BINARY(255) ,i1 VARBINARY(32), i2 VARBINARY(255), i3 VARBINARY(1000) ) engine ndb; insert into t1 values (1 ,0x1, 0x17, 0x789a, 0x789abcde, 0xfedc0001 ,127, 255 ,32767, 65535 ,2147483647, 4294967295 ,9223372036854775807, 18446744073709551615 ,'1','12345678901234567890123456789012','123456789' ,'1','12345678901234567890123456789012','123456789' ,0x12,0x123456789abcdef0, 0x012345 ,0x12,0x123456789abcdef0, 0x00123450 ); insert into t1 values (2 ,0, 0, 0, 0, 0 ,-128, 0 ,-32768, 0 ,-2147483648, 0 ,-9223372036854775808, 0 ,'','','' ,'','','' ,0x0,0x0,0x0 ,0x0,0x0,0x0 ); insert into t1 values (3 ,NULL,NULL,NULL,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ); Connected to Management Server at: : Waiting for completed, this may take several minutes Node : Backup started from node Node : Backup started from node completed StartGCP: StopGCP: #Records: #LogRecords: Data: bytes Log: bytes
mysql-test/t/ndb_backup_print.test 0 → 100644 +66 −0 Original line number Diff line number Diff line -- source include/have_ndb.inc -- source include/ndb_default_cluster.inc -- source include/not_embedded.inc --disable_warnings use test; drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9,t10; --enable_warnings #NO.1 test output of backup --exec $NDB_MGM --no-defaults -e "start backup" |sed -e 's/[0-9]//g' |sed -e 's/localhost//g' |sed -e 's/\.\.\.*//g' create table t1 (pk int key ,a1 BIT(1), a2 BIT(5), a3 BIT(33), a4 BIT(63), a5 BIT(64) ,b1 TINYINT, b2 TINYINT UNSIGNED ,c1 SMALLINT, c2 SMALLINT UNSIGNED ,d1 INT, d2 INT UNSIGNED ,e1 BIGINT, e2 BIGINT UNSIGNED ,f1 CHAR(1) BINARY, f2 CHAR(32) BINARY, f3 CHAR(255) BINARY ,g1 VARCHAR(32) BINARY, g2 VARCHAR(255) BINARY, g3 VARCHAR(1000) BINARY ,h1 BINARY(1), h2 BINARY(8), h3 BINARY(255) ,i1 VARBINARY(32), i2 VARBINARY(255), i3 VARBINARY(1000) ) engine ndb; insert into t1 values (1 ,0x1, 0x17, 0x789a, 0x789abcde, 0xfedc0001 ,127, 255 ,32767, 65535 ,2147483647, 4294967295 ,9223372036854775807, 18446744073709551615 ,'1','12345678901234567890123456789012','123456789' ,'1','12345678901234567890123456789012','123456789' ,0x12,0x123456789abcdef0, 0x012345 ,0x12,0x123456789abcdef0, 0x00123450 ); insert into t1 values (2 ,0, 0, 0, 0, 0 ,-128, 0 ,-32768, 0 ,-2147483648, 0 ,-9223372036854775808, 0 ,'','','' ,'','','' ,0x0,0x0,0x0 ,0x0,0x0,0x0 ); insert into t1 values (3 ,NULL,NULL,NULL,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ,NULL,NULL,NULL ); #NO.2 test output of backup after some simple SQL operations --exec $NDB_MGM --no-defaults -e "start backup" |sed -e 's/[0-9]//g' |sed -e 's/localhost//g' |sed -e 's/\.\.\.*//g'
ndb/include/debugger/EventLogger.hpp +1 −1 Original line number Diff line number Diff line Loading @@ -175,5 +175,5 @@ private: char m_text[MAX_TEXT_LENGTH]; }; extern void getRestartAction(Uint32 action, BaseString &str); #endif
ndb/src/mgmclient/CommandInterpreter.cpp +209 −69 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ #include <mgmapi.h> #include <util/BaseString.hpp> #include <ndbd_exit_codes.h> class MgmtSrvr; Loading Loading @@ -125,7 +126,7 @@ class CommandInterpreter { int executeStatus(int processId, const char* parameters, bool all); int executeEventReporting(int processId, const char* parameters, bool all); int executeDumpState(int processId, const char* parameters, bool all); int executeStartBackup(char * parameters); int executeStartBackup(char * parameters, bool interactive); int executeAbortBackup(char * parameters); int executeStop(Vector<BaseString> &command_list, unsigned command_pos, int *node_ids, int no_of_nodes); Loading Loading @@ -768,6 +769,133 @@ CommandInterpreter::printError() } } /* * print log event from mgmsrv to console screen */ #define make_uint64(a,b) (((Uint64)(a)) + (((Uint64)(b)) << 32)) #define Q64(a) make_uint64(event->EVENT.a ## _lo, event->EVENT.a ## _hi) #define R event->source_nodeid #define Q(a) event->EVENT.a #define QVERSION getMajor(Q(version)), getMinor(Q(version)), getBuild(Q(version)) #define NDB_LE_(a) NDB_LE_ ## a static void printLogEvent(struct ndb_logevent* event) { switch (event->type) { /** * NDB_MGM_EVENT_CATEGORY_BACKUP */ #undef EVENT #define EVENT BackupStarted case NDB_LE_BackupStarted: ndbout_c("Node %u: Backup %d started from node %d", R, Q(backup_id), Q(starting_node)); break; #undef EVENT #define EVENT BackupFailedToStart case NDB_LE_BackupFailedToStart: ndbout_c("Node %u: Backup request from %d failed to start. Error: %d", R, Q(starting_node), Q(error)); break; #undef EVENT #define EVENT BackupCompleted case NDB_LE_BackupCompleted: ndbout_c("Node %u: Backup %u started from node %u completed\n" " StartGCP: %u StopGCP: %u\n" " #Records: %u #LogRecords: %u\n" " Data: %u bytes Log: %u bytes", R, Q(backup_id), Q(starting_node), Q(start_gci), Q(stop_gci), Q(n_records), Q(n_log_records), Q(n_bytes), Q(n_log_bytes)); break; #undef EVENT #define EVENT BackupAborted case NDB_LE_BackupAborted: ndbout_c("Node %u: Backup %d started from %d has been aborted. Error: %d", R, Q(backup_id), Q(starting_node), Q(error)); break; /** * NDB_MGM_EVENT_CATEGORY_STARTUP */ #undef EVENT #define EVENT NDBStartStarted case NDB_LE_NDBStartStarted: ndbout_c("Node %u: Start initiated (version %d.%d.%d)", R, QVERSION); break; #undef EVENT #define EVENT NDBStartCompleted case NDB_LE_NDBStartCompleted: ndbout_c("Node %u: Started (version %d.%d.%d)", R, QVERSION); break; #undef EVENT #define EVENT NDBStopStarted case NDB_LE_NDBStopStarted: ndbout_c("Node %u: %s shutdown initiated", R, (Q(stoptype) == 1 ? "Cluster" : "Node")); break; #undef EVENT #define EVENT NDBStopCompleted case NDB_LE_NDBStopCompleted: { BaseString action_str(""); BaseString signum_str(""); getRestartAction(Q(action), action_str); if (Q(signum)) signum_str.appfmt(" Initiated by signal %d.", Q(signum)); ndbout_c("Node %u: Node shutdown completed%s.%s", R, action_str.c_str(), signum_str.c_str()); } break; #undef EVENT #define EVENT NDBStopForced case NDB_LE_NDBStopForced: { BaseString action_str(""); BaseString reason_str(""); BaseString sphase_str(""); int signum = Q(signum); int error = Q(error); int sphase = Q(sphase); int extra = Q(extra); getRestartAction(Q(action), action_str); if (signum) reason_str.appfmt(" Initiated by signal %d.", signum); if (error) { ndbd_exit_classification cl; ndbd_exit_status st; const char *msg = ndbd_exit_message(error, &cl); const char *cl_msg = ndbd_exit_classification_message(cl, &st); const char *st_msg = ndbd_exit_status_message(st); reason_str.appfmt(" Caused by error %d: \'%s(%s). %s\'.", error, msg, cl_msg, st_msg); if (extra != 0) reason_str.appfmt(" (extra info %d)", extra); } if (sphase < 255) sphase_str.appfmt(" Occured during startphase %u.", sphase); ndbout_c("Node %u: Forced node shutdown completed%s.%s%s", R, action_str.c_str(), sphase_str.c_str(), reason_str.c_str()); } break; #undef EVENT #define EVENT StopAborted case NDB_LE_NDBStopAborted: ndbout_c("Node %u: Node shutdown aborted", R); break; /** * default nothing to print */ default: break; } } //***************************************************************************** //***************************************************************************** Loading @@ -784,27 +912,21 @@ event_thread_run(void* p) int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 1, NDB_MGM_EVENT_CATEGORY_STARTUP, 0 }; int fd = ndb_mgm_listen_event(handle, filter); if (fd != NDB_INVALID_SOCKET) NdbLogEventHandle log_handle= NULL; struct ndb_logevent log_event; log_handle= ndb_mgm_create_logevent_handle(handle, filter); if (log_handle) { do_event_thread= 1; char *tmp= 0; char buf[1024]; SocketInputStream in(fd,10); do { if (tmp == 0) NdbSleep_MilliSleep(10); if((tmp = in.gets(buf, 1024))) { const char ping_token[]= "<PING>"; if (memcmp(ping_token,tmp,sizeof(ping_token)-1)) if(tmp && strlen(tmp)) { if (ndb_logevent_get_next(log_handle, &log_event, 2000) <= 0) continue; Guard g(printmutex); ndbout << tmp; } } printLogEvent(&log_event); } while(do_event_thread); NDB_CLOSE_SOCKET(fd); ndb_mgm_destroy_logevent_handle(&log_handle); } else { Loading Loading @@ -1054,7 +1176,7 @@ CommandInterpreter::execute_impl(const char *_line, bool interactive) else if(strcasecmp(firstToken, "START") == 0 && allAfterFirstToken != NULL && strncasecmp(allAfterFirstToken, "BACKUP", sizeof("BACKUP") - 1) == 0){ m_error= executeStartBackup(allAfterFirstToken); m_error= executeStartBackup(allAfterFirstToken, interactive); DBUG_RETURN(true); } else if(strcasecmp(firstToken, "ABORT") == 0 && Loading Loading @@ -2531,20 +2653,11 @@ CommandInterpreter::executeEventReporting(int processId, * Backup *****************************************************************************/ int CommandInterpreter::executeStartBackup(char* parameters) CommandInterpreter::executeStartBackup(char* parameters, bool interactive) { struct ndb_mgm_reply reply; unsigned int backupId; #if 0 int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0 }; int fd = ndb_mgm_listen_event(m_mgmsrv, filter); if (fd < 0) { ndbout << "Initializing start of backup failed" << endl; printError(); return fd; } #endif Vector<BaseString> args; { BaseString(parameters).split(args); Loading @@ -2557,25 +2670,20 @@ CommandInterpreter::executeStartBackup(char* parameters) int sz= args.size(); int result; if (sz == 2 && args[1] == "NOWAIT") int flags = 2; if (sz == 2 && args[1] == "NOWAIT") { result = ndb_mgm_start_backup(m_mgmsrv, 0, &backupId, &reply); flags = 0; } else if (sz == 1 || (sz == 3 && args[1] == "WAIT" && args[2] == "COMPLETED")) else if (sz == 1 || (sz == 3 && args[1] == "WAIT" && args[2] == "COMPLETED")) { flags = 2; ndbout_c("Waiting for completed, this may take several minutes"); result = ndb_mgm_start_backup(m_mgmsrv, 2, &backupId, &reply); } else if (sz == 3 && args[1] == "WAIT" && args[2] == "STARTED") else if (sz == 3 && args[1] == "WAIT" && args[2] == "STARTED") { ndbout_c("Waiting for started, this may take several minutes"); result = ndb_mgm_start_backup(m_mgmsrv, 1, &backupId, &reply); flags = 1; } else { Loading @@ -2583,48 +2691,80 @@ CommandInterpreter::executeStartBackup(char* parameters) return -1; } NdbLogEventHandle log_handle= NULL; struct ndb_logevent log_event; if (flags == 2 && !interactive) { int filter[] = { 15, NDB_MGM_EVENT_CATEGORY_BACKUP, 0, 0 }; log_handle = ndb_mgm_create_logevent_handle(m_mgmsrv, filter); if (!log_handle) { ndbout << "Initializing start of backup failed" << endl; printError(); return -1; } } result = ndb_mgm_start_backup(m_mgmsrv, flags, &backupId, &reply); if (result != 0) { ndbout << "Backup failed" << endl; printError(); #if 0 close(fd); #endif if (log_handle) ndb_mgm_destroy_logevent_handle(&log_handle); return result; } #if 0 ndbout_c("Waiting for completed, this may take several minutes"); char *tmp; char buf[1024]; /** * If interactive, event listner thread is already running */ if (log_handle && !interactive) { SocketInputStream in(fd); int count = 0; int retry = 0; do { tmp = in.gets(buf, 1024); if(tmp) if (ndb_logevent_get_next(log_handle, &log_event, 60000) > 0) { int print = 0; switch (log_event.type) { case NDB_LE_BackupStarted: if (log_event.BackupStarted.backup_id == backupId) print = 1; break; case NDB_LE_BackupCompleted: if (log_event.BackupCompleted.backup_id == backupId) print = 1; break; case NDB_LE_BackupAborted: if (log_event.BackupAborted.backup_id == backupId) print = 1; break; default: break; } if (print) { ndbout << tmp; unsigned int id; if(sscanf(tmp, "%*[^:]: Backup %d ", &id) == 1 && id == backupId){ Guard g(m_print_mutex); printLogEvent(&log_event); count++; } } } while(count < 2); else { retry++; } } while(count < 2 && retry < 3); SocketInputStream in(fd, 10); do { tmp = in.gets(buf, 1024); if(tmp && tmp[0] != 0) { ndbout << tmp; if (retry >= 3) ndbout << "get backup event failed for " << retry << " times" << endl; ndb_mgm_destroy_logevent_handle(&log_handle); } } while(tmp && tmp[0] != 0); close(fd); #endif return 0; } int CommandInterpreter::executeAbortBackup(char* parameters) { Loading
ndb/src/mgmclient/Makefile.am +2 −1 Original line number Diff line number Diff line Loading @@ -21,7 +21,8 @@ libndbmgmclient_la_LIBADD = ../mgmapi/libmgmapi.la \ ../common/logger/liblogger.la \ ../common/portlib/libportlib.la \ ../common/util/libgeneral.la \ ../common/portlib/libportlib.la ../common/portlib/libportlib.la \ ../common/debugger/libtrace.la ndb_mgm_SOURCES = main.cpp Loading