#At file:///home/zhl/mysql/mysql-5.1-telco-6.2-WL3932/
2637 Leonard Zhou 2008-08-06
WL#3932 Node recovery status report
modified:
storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp
storage/ndb/include/mgmapi/mgmapi_config_parameters.h
storage/ndb/include/mgmapi/ndb_logevent.h
storage/ndb/src/common/debugger/EventLogger.cpp
storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp
storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp
storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
storage/ndb/src/mgmapi/ndb_logevent.cpp
storage/ndb/src/mgmsrv/ConfigInfo.cpp
per-file messages:
storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp
Add node restart status dump type
storage/ndb/include/mgmapi/mgmapi_config_parameters.h
Define node startup status report frequency
storage/ndb/include/mgmapi/ndb_logevent.h
Define node restart status report variable
storage/ndb/src/common/debugger/EventLogger.cpp
Add log function for node restart status report
storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp
Add dump state order for node restart status
storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp
Define variables and functions for node restart status report
storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp
Initialize variables for node restart status report
storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
Implement node restart status report
storage/ndb/src/mgmapi/ndb_logevent.cpp
Define node restart status report variables
storage/ndb/src/mgmsrv/ConfigInfo.cpp
Define startup report frequency parameter
=== modified file 'storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp'
--- a/storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp 2008-05-29 15:58:58 +0000
+++ b/storage/ndb/include/kernel/signaldata/DumpStateOrd.hpp 2008-08-06 16:44:29 +0000
@@ -61,6 +61,10 @@ public:
_TCMin = 101000,
_TCMax = 101999,
+ _LQHMin = 102000,
+ NRStatus = 102001,
+ _LQHMax = 102999,
+
// 1 QMGR Dump information about phase 1 variables
// 13 CMVMI Dump signal counter
// 13 NDBCNTR Dump start phase information
=== modified file 'storage/ndb/include/mgmapi/mgmapi_config_parameters.h'
--- a/storage/ndb/include/mgmapi/mgmapi_config_parameters.h 2008-05-29 13:09:49 +0000
+++ b/storage/ndb/include/mgmapi/mgmapi_config_parameters.h 2008-08-06 16:44:29 +0000
@@ -131,6 +131,7 @@
#define CFG_DB_SUB_OPERATIONS 181
#define CFG_DB_MAX_BUFFERED_EPOCHS 182 /* subscriptions */
#define CFG_DB_SUMA_HANDOVER_TIMEOUT 183
+#define CFG_DB_STARTUP_REPORT_FREQUENCY 184
#define CFG_DB_SGA 198 /* super pool mem */
#define CFG_DB_DATA_MEM_2 199 /* used in special build in 5.1 */
=== modified file 'storage/ndb/include/mgmapi/ndb_logevent.h'
--- a/storage/ndb/include/mgmapi/ndb_logevent.h 2008-02-11 14:07:49 +0000
+++ b/storage/ndb/include/mgmapi/ndb_logevent.h 2008-08-06 16:44:29 +0000
@@ -192,9 +192,11 @@ extern "C" {
/* 68 (used in upcoming patch) */
/** NDB_MGM_EVENT_SEVERITY_WARNING */
- NDB_LE_SubscriptionStatus = 69
+ NDB_LE_SubscriptionStatus = 69,
+ /** NDB_MGM_EVENT_CATEGORY_NODE_RESTART */
+ NDB_LE_NR_Status = 70
- /* 70 unused */
+ /* 71 unused */
};
/**
@@ -488,6 +490,13 @@ extern "C" {
struct {
unsigned dest_node;
} NR_CopyFragsCompleted;
+ /** Log event specific data for for corresponding NDB_LE_ log event */
+ struct {
+ unsigned starting_node;
+ unsigned copy_node;
+ unsigned n_bytes_lo;
+ unsigned n_bytes_hi;
+ } NR_Status;
/** Log event specific data for for corresponding NDB_LE_ log event */
struct {
=== modified file 'storage/ndb/src/common/debugger/EventLogger.cpp'
--- a/storage/ndb/src/common/debugger/EventLogger.cpp 2008-04-22 19:36:05 +0000
+++ b/storage/ndb/src/common/debugger/EventLogger.cpp 2008-08-06 16:44:29 +0000
@@ -499,6 +499,12 @@ void getTextNR_CopyFragsCompleted(QQQQ)
"to Node %u",
theData[1]);
}
+void getTextNR_Status(QQQQ) {
+ BaseString::snprintf(m_text, m_text_len,
+ "Node restart status: Copy %llu bytes data from node %u to node %u\n",
+ make_uint64(theData[3], theData[4]),
+ theData[2],theData[1]);
+}
void getTextLCPFragmentCompleted(QQQQ) {
BaseString::snprintf(m_text, m_text_len,
"Table ID = %u, fragment ID = %u has completed LCP "
@@ -1068,6 +1074,7 @@ const EventLoggerBase::EventRepLogLevelM
ROW(NR_CopyFragsStarted, LogLevel::llNodeRestart, 8, Logger::LL_INFO ),
ROW(NR_CopyFragDone, LogLevel::llNodeRestart,10, Logger::LL_INFO ),
ROW(NR_CopyFragsCompleted, LogLevel::llNodeRestart, 8, Logger::LL_INFO ),
+ ROW(NR_Status, LogLevel::llNodeRestart, 7, Logger::LL_INFO ),
ROW(NodeFailCompleted, LogLevel::llNodeRestart, 8, Logger::LL_ALERT),
ROW(NODE_FAILREP, LogLevel::llNodeRestart, 8, Logger::LL_ALERT),
=== modified file 'storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp'
--- a/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 2008-04-25 10:56:03 +0000
+++ b/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 2008-08-06 16:44:29 +0000
@@ -923,6 +923,10 @@ Cmvmi::execDUMP_STATE_ORD(Signal* signal
{
sendSignal(BACKUP_REF, GSN_DUMP_STATE_ORD, signal, signal->length(), JBB);
}
+ else if (check_block(LQH, val))
+ {
+ sendSignal(DBLQH_REF, GSN_DUMP_STATE_ORD, signal, signal->length(), JBB);
+ }
else if (check_block(TC, val))
{
}
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2008-05-30 06:33:46 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/Dblqh.hpp 2008-08-06 16:44:29 +0000
@@ -2896,8 +2896,26 @@ private:
Uint32 c_diskless;
Uint32 c_o_direct;
Uint32 c_error_insert_table_id;
+
+ /*
+ keeps track of total data written into new data node and show backup status
+ */
+ Uint64 m_nr_bytes_total;
+ /* next time to report node start status */
+ Uint32 m_nr_next_report;
+ Uint32 m_nr_report_frequency;
public:
+ /*
+ For periodic node restart status reporting and explicit node restart status reporting
+ */
+ /* Init at start of node restart, timers etc... */
+ void initNRReportStatus(Signal* signal);
+ /* Sheck timers for reporting at certain points */
+ void checkNRReportStatus(Signal* signal, ScanRecordPtr scanptr);
+ /* Send backup status, invoked either periodically, or explicitly */
+ void reportNRStatus(Signal* signal, ScanRecordPtr scanptr);
+
bool is_same_trans(Uint32 opId, Uint32 trid1, Uint32 trid2);
void get_op_info(Uint32 opId, Uint32 *hash, Uint32* gci_hi, Uint32* gci_lo);
void accminupdate(Signal*, Uint32 opPtrI, const Local_key*);
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp 2007-11-19 10:04:24 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhInit.cpp 2008-08-06 16:44:29 +0000
@@ -63,6 +63,9 @@ void Dblqh::initData()
m_backup_ptr = RNIL;
clogFileSize = 16;
cmaxLogFilesInPageZero = 40;
+
+ m_nr_bytes_total = 0;
+ m_nr_report_frequency = 0;
}//Dblqh::initData()
void Dblqh::initRecords()
=== modified file 'storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp'
--- a/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2008-07-23 11:15:31 +0000
+++ b/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp 2008-08-06 16:44:29 +0000
@@ -948,6 +948,7 @@ void Dblqh::checkStartCompletedLab(Signa
void Dblqh::startphase4Lab(Signal* signal)
{
sendNdbSttorryLab(signal);
+ initNRReportStatus(signal);
return;
}//Dblqh::startphase4Lab()
@@ -1049,6 +1050,10 @@ void Dblqh::execREAD_CONFIG_REQ(Signal*
ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_LQH_FRAG, &tmp));
c_fragment_pool.setSize(tmp);
+ m_nr_report_frequency = 0;
+ ndb_mgm_get_int_parameter(p, CFG_DB_STARTUP_REPORT_FREQUENCY,
+ &m_nr_report_frequency);
+
if (!ndb_mgm_get_int_parameter(p, CFG_DB_REDOLOG_FILE_SIZE,
&clogFileSize))
{
@@ -10821,6 +10826,8 @@ void Dblqh::copyTupkeyConfLab(Signal* si
tcConnectptr.p->copyCountWords += TnoOfWords;
scanptr.p->scanState = ScanRecord::WAIT_LQHKEY_COPY;
if (tcConnectptr.p->copyCountWords < cmaxWordsAtNodeRec) {
+ m_nr_bytes_total += (TnoOfWords << 2);
+ checkNRReportStatus(signal, scanptr);
nextRecordCopy(signal);
return;
}//if
@@ -19096,6 +19103,24 @@ Dblqh::execDUMP_STATE_ORD(Signal* signal
jamEntry();
DumpStateOrd * const dumpState = (DumpStateOrd *)&signal->theData[0];
Uint32 arg= dumpState->args[0];
+
+ /* Dump commands used in public interfaces */
+ switch(arg) {
+ case DumpStateOrd::NRStatus:
+ {
+ scanptr.i = tcConnectptr.p->tcScanRec;
+ if (scanptr.i != RNIL)
+ {
+ c_scanRecordPool.getPtr(scanptr);
+ reportNRStatus(signal,scanptr);
+ }
+ return;
+ }
+ default:
+ /* continue to debug section */
+ break;
+ }
+
if(dumpState->args[0] == DumpStateOrd::CommitAckMarkersSize){
infoEvent("LQH: m_commitAckMarkerPool: %d free size: %d",
m_commitAckMarkerPool.getNoOfFree(),
@@ -19739,6 +19764,51 @@ Dblqh::execDUMP_STATE_ORD(Signal* signal
}
}//Dblqh::execDUMP_STATE_ORD()
+// Node recovery status report
+void
+Dblqh::initNRReportStatus(Signal *signal)
+{
+ struct timeval the_time;
+ gettimeofday(&the_time, 0);
+ m_nr_next_report = the_time.tv_sec + m_nr_report_frequency;
+}
+
+void
+Dblqh::checkNRReportStatus(Signal *signal, ScanRecordPtr scanptr)
+{
+ if (m_nr_report_frequency == 0)
+ return;
+
+ struct timeval the_time;
+ gettimeofday(&the_time, 0);
+ if (the_time.tv_sec > m_nr_next_report)
+ {
+ reportNRStatus(signal, scanptr);
+ m_nr_next_report = the_time.tv_sec + m_nr_report_frequency;
+ }
+}
+
+void
+Dblqh::reportNRStatus(Signal* signal, ScanRecordPtr scanptr)
+{
+ const int signal_length = 5;
+
+ signal->theData[0] = NDB_LE_NR_Status;
+ for (int i= 1; i < signal_length; i++)
+ signal->theData[i] = 0;
+
+ if (scanptr.i == RNIL)
+ {
+ sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, signal_length, JBB);
+ return;
+ }
+ signal->theData[1] = scanptr.p->scanNodeId;
+ signal->theData[2] = getOwnNodeId();;
+
+ signal->theData[3] = (Uint32)(m_nr_bytes_total & 0xFFFFFFFF);
+ signal->theData[4] = (Uint32)(m_nr_bytes_total >> 32);
+ sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, signal_length, JBB);
+}
/* **************************************************************** */
/* ---------------------------------------------------------------- */
/* ---------------------- TRIGGER HANDLING ------------------------ */
=== modified file 'storage/ndb/src/mgmapi/ndb_logevent.cpp'
--- a/storage/ndb/src/mgmapi/ndb_logevent.cpp 2008-01-24 11:21:39 +0000
+++ b/storage/ndb/src/mgmapi/ndb_logevent.cpp 2008-08-06 16:44:29 +0000
@@ -205,6 +205,11 @@ struct Ndb_logevent_body_row ndb_logeven
ROW( NR_CopyFragsCompleted, "dest_node", 1, dest_node),
+ ROW( NR_Status, "starting_node", 1, starting_node),
+ ROW( NR_Status, "copy_node", 2, copy_node),
+ ROW( NR_Status, "n_bytes_lo", 3, n_bytes_lo),
+ ROW( NR_Status, "n_bytes_hi", 4, n_bytes_hi),
+
ROW( NodeFailCompleted, "block", 1, block), /* 0 = all */
ROW( NodeFailCompleted, "failed_node", 2, failed_node),
ROW( NodeFailCompleted, "completing_node", 3, completing_node), /* 0 = all */
=== modified file 'storage/ndb/src/mgmsrv/ConfigInfo.cpp'
--- a/storage/ndb/src/mgmsrv/ConfigInfo.cpp 2008-02-20 15:15:31 +0000
+++ b/storage/ndb/src/mgmsrv/ConfigInfo.cpp 2008-08-06 16:44:29 +0000
@@ -1443,6 +1443,18 @@ const ConfigInfo::ParamInfo ConfigInfo::
STR_VALUE(MAX_INT_RNIL) },
{
+ CFG_DB_STARTUP_REPORT_FREQUENCY,
+ "StartupStatusReportFrequency",
+ DB_TOKEN,
+ "Frequency of various status reports during startup in seconds",
+ ConfigInfo::CI_USED,
+ false,
+ ConfigInfo::CI_INT,
+ "0",
+ "0",
+ STR_VALUE(MAX_INT_RNIL) },
+
+ {
CFG_DB_O_DIRECT,
"ODirect",
DB_TOKEN,
| Thread |
|---|
| • bzr commit into mysql-5.1-telco-6.2 branch (leonard:2637) WL#3932 | Leonard Zhou | 6 Aug |