📄 ndbcntrmain.cpp
字号:
if (cndbBlocksCount < ZNO_NDB_BLOCKS) { jam(); sendNdbSttor(signal); return; }//if sendSttorry(signal); return;}//Ndbcntr::ph3ALab()/*4.5 START PHASE 4 *//*###########################################################################*/// WAIT FOR ALL NODES IN CLUSTER TO CHANGE STATE INTO ZSTART ,// APPL_CHANGEREP IS ALWAYS SENT WHEN SOMEONE HAVE// CHANGED THEIR STATE. APPL_STARTCONF INDICATES THAT ALL NODES ARE IN START // STATE SEND NDB_STARTREQ TO DIH AND THEN WAIT FOR NDB_STARTCONF/*---------------------------------------------------------------------------*//*******************************//* STTOR *//*******************************/void Ndbcntr::startPhase4Lab(Signal* signal) { ph4ALab(signal);}//Ndbcntr::startPhase4Lab()void Ndbcntr::ph4ALab(Signal* signal) { ph4BLab(signal); return;}//Ndbcntr::ph4ALab()/*******************************//* NDB_STTORRY *//*******************************/void Ndbcntr::ph4BLab(Signal* signal) {/*--------------------------------------*//* CASE: CSTART_PHASE = ZSTART_PHASE_4 *//*--------------------------------------*/ if (cndbBlocksCount < ZNO_NDB_BLOCKS) { jam(); sendNdbSttor(signal); return; }//if if ((ctypeOfStart == NodeState::ST_NODE_RESTART) || (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) { jam(); sendSttorry(signal); return; }//if waitpoint41Lab(signal); return;}//Ndbcntr::ph4BLab()void Ndbcntr::waitpoint41Lab(Signal* signal) { if (getOwnNodeId() == cmasterNodeId) { jam();/*--------------------------------------*//* MASTER WAITS UNTIL ALL SLAVES HAS *//* SENT THE REPORTS *//*--------------------------------------*/ cnoWaitrep++; if (cnoWaitrep == cnoStartNodes) { jam(); cnoWaitrep = 0;/*---------------------------------------------------------------------------*/// NDB_STARTREQ STARTS UP ALL SET UP OF DISTRIBUTION INFORMATION IN DIH AND// DICT. AFTER SETTING UP THIS// DATA IT USES THAT DATA TO SET UP WHICH FRAGMENTS THAT ARE TO START AND// WHERE THEY ARE TO START. THEN// IT SETS UP THE FRAGMENTS AND RECOVERS THEM BY:// 1) READING A LOCAL CHECKPOINT FROM DISK.// 2) EXECUTING THE UNDO LOG ON INDEX AND DATA.// 3) EXECUTING THE FRAGMENT REDO LOG FROM ONE OR SEVERAL NODES TO// RESTORE THE RESTART CONFIGURATION OF DATA IN NDB CLUSTER./*---------------------------------------------------------------------------*/ signal->theData[0] = reference(); signal->theData[1] = ctypeOfStart; sendSignal(DBDIH_REF, GSN_NDB_STARTREQ, signal, 2, JBB); }//if } else { jam();/*--------------------------------------*//* SLAVE NODES WILL PASS HERE ONCE AND *//* SEND A WAITPOINT REPORT TO MASTER. *//* SLAVES WONT DO ANYTHING UNTIL THEY *//* RECEIVE A WAIT REPORT FROM THE MASTER*//*--------------------------------------*/ signal->theData[0] = getOwnNodeId(); signal->theData[1] = ZWAITPOINT_4_1; sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_WAITREP, signal, 2, JBB); }//if return;}//Ndbcntr::waitpoint41Lab()/*******************************//* NDB_STARTCONF *//*******************************/void Ndbcntr::execNDB_STARTCONF(Signal* signal) { jamEntry(); NodeReceiverGroup rg(NDBCNTR, c_start.m_starting); signal->theData[0] = getOwnNodeId(); signal->theData[1] = ZWAITPOINT_4_2; sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB); return;}//Ndbcntr::execNDB_STARTCONF()/*4.6 START PHASE 5 *//*###########################################################################*/// SEND APPL_RUN TO THE QMGR IN THIS BLOCK// SEND NDB_STTOR ALL BLOCKS ACC, DICT, DIH, LQH, TC AND TUP THEN WAIT FOR// THEIR NDB_STTORRY/*---------------------------------------------------------------------------*//*******************************//* STTOR *//*******************************/void Ndbcntr::startPhase5Lab(Signal* signal) { ph5ALab(signal); return;}//Ndbcntr::startPhase5Lab()/*******************************//* NDB_STTORRY *//*******************************//*---------------------------------------------------------------------------*/// THIS IS NDB START PHASE 5./*---------------------------------------------------------------------------*/// IN THIS START PHASE TUP INITIALISES DISK FILES FOR DISK STORAGE IF INITIAL// START. DIH WILL START UP// THE GLOBAL CHECKPOINT PROTOCOL AND WILL CONCLUDE ANY UNFINISHED TAKE OVERS // THAT STARTED BEFORE THE SYSTEM CRASH./*---------------------------------------------------------------------------*/void Ndbcntr::ph5ALab(Signal* signal) { if (cndbBlocksCount < ZNO_NDB_BLOCKS) { jam(); sendNdbSttor(signal); return; }//if cstartPhase = cstartPhase + 1; cinternalStartphase = cstartPhase - 1; if (getOwnNodeId() == cmasterNodeId) { switch(ctypeOfStart){ case NodeState::ST_INITIAL_START: jam(); /*--------------------------------------*/ /* MASTER CNTR IS RESPONSIBLE FOR */ /* CREATING SYSTEM TABLES */ /*--------------------------------------*/ createSystableLab(signal, 0); return; case NodeState::ST_SYSTEM_RESTART: jam(); waitpoint52Lab(signal); return; case NodeState::ST_NODE_RESTART: case NodeState::ST_INITIAL_NODE_RESTART: jam(); break; case NodeState::ST_ILLEGAL_TYPE: jam(); break; } ndbrequire(false); } /** * Not master */ NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend(); switch(ctypeOfStart){ case NodeState::ST_NODE_RESTART: case NodeState::ST_INITIAL_NODE_RESTART: jam(); /*----------------------------------------------------------------------*/ // SEND NDB START PHASE 5 IN NODE RESTARTS TO COPY DATA TO THE NEWLY // STARTED NODE. /*----------------------------------------------------------------------*/ req->senderRef = reference(); req->nodeId = getOwnNodeId(); req->internalStartPhase = cinternalStartphase; req->typeOfStart = ctypeOfStart; req->masterNodeId = cmasterNodeId; //#define TRACE_STTOR#ifdef TRACE_STTOR ndbout_c("sending NDB_STTOR(%d) to DIH", cinternalStartphase);#endif sendSignal(DBDIH_REF, GSN_NDB_STTOR, signal, NdbSttor::SignalLength, JBB); return; case NodeState::ST_INITIAL_START: case NodeState::ST_SYSTEM_RESTART: jam(); /*--------------------------------------*/ /* DURING SYSTEMRESTART AND INITALSTART:*/ /* SLAVE NODES WILL PASS HERE ONCE AND */ /* SEND A WAITPOINT REPORT TO MASTER. */ /* SLAVES WONT DO ANYTHING UNTIL THEY */ /* RECEIVE A WAIT REPORT FROM THE MASTER*/ /* WHEN THE MASTER HAS FINISHED HIS WORK*/ /*--------------------------------------*/ signal->theData[0] = getOwnNodeId(); signal->theData[1] = ZWAITPOINT_5_2; sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_WAITREP, signal, 2, JBB); return; default: ndbrequire(false); }}//Ndbcntr::ph5ALab()void Ndbcntr::waitpoint52Lab(Signal* signal) { cnoWaitrep = cnoWaitrep + 1;/*---------------------------------------------------------------------------*/// THIS WAITING POINT IS ONLY USED BY A MASTER NODE. WE WILL EXECUTE NDB START // PHASE 5 FOR DIH IN THE// MASTER. THIS WILL START UP LOCAL CHECKPOINTS AND WILL ALSO CONCLUDE ANY// UNFINISHED LOCAL CHECKPOINTS// BEFORE THE SYSTEM CRASH. THIS WILL ENSURE THAT WE ALWAYS RESTART FROM A// WELL KNOWN STATE./*---------------------------------------------------------------------------*//*--------------------------------------*//* MASTER WAITS UNTIL HE RECEIVED WAIT *//* REPORTS FROM ALL SLAVE CNTR *//*--------------------------------------*/ if (cnoWaitrep == cnoStartNodes) { jam(); cnoWaitrep = 0; NdbSttor * const req = (NdbSttor*)signal->getDataPtrSend(); req->senderRef = reference(); req->nodeId = getOwnNodeId(); req->internalStartPhase = cinternalStartphase; req->typeOfStart = ctypeOfStart; req->masterNodeId = cmasterNodeId;#ifdef TRACE_STTOR ndbout_c("sending NDB_STTOR(%d) to DIH", cinternalStartphase);#endif sendSignal(DBDIH_REF, GSN_NDB_STTOR, signal, NdbSttor::SignalLength, JBB); }//if return;}//Ndbcntr::waitpoint52Lab()/*******************************//* NDB_STTORRY *//*******************************/void Ndbcntr::ph6ALab(Signal* signal) { if ((ctypeOfStart == NodeState::ST_NODE_RESTART) || (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) { jam(); waitpoint51Lab(signal); return; }//if NodeReceiverGroup rg(NDBCNTR, c_start.m_starting); rg.m_nodes.clear(getOwnNodeId()); signal->theData[0] = getOwnNodeId(); signal->theData[1] = ZWAITPOINT_5_1; sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB); waitpoint51Lab(signal); return;}//Ndbcntr::ph6ALab()void Ndbcntr::waitpoint51Lab(Signal* signal) { cstartPhase = cstartPhase + 1;/*---------------------------------------------------------------------------*/// A FINAL STEP IS NOW TO SEND NDB_STTOR TO TC. THIS MAKES IT POSSIBLE TO // CONNECT TO TC FOR APPLICATIONS.// THIS IS NDB START PHASE 6 WHICH IS FOR ALL BLOCKS IN ALL NODES./*---------------------------------------------------------------------------*/ cinternalStartphase = cstartPhase - 1; cndbBlocksCount = 0; ph6BLab(signal); return;}//Ndbcntr::waitpoint51Lab()void Ndbcntr::ph6BLab(Signal* signal) { // c_missra.currentStartPhase - cstartPhase - cinternalStartphase = // 5 - 7 - 6 if (cndbBlocksCount < ZNO_NDB_BLOCKS) { jam(); sendNdbSttor(signal); return; }//if if ((ctypeOfStart == NodeState::ST_NODE_RESTART) || (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) { jam(); sendSttorry(signal); return; } waitpoint61Lab(signal);}void Ndbcntr::waitpoint61Lab(Signal* signal){ if (getOwnNodeId() == cmasterNodeId) { jam(); cnoWaitrep6++; if (cnoWaitrep6 == cnoStartNodes) { jam(); NodeReceiverGroup rg(NDBCNTR, c_start.m_starting); rg.m_nodes.clear(getOwnNodeId()); signal->theData[0] = getOwnNodeId(); signal->theData[1] = ZWAITPOINT_6_2; sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB); sendSttorry(signal); } } else { jam(); signal->theData[0] = getOwnNodeId(); signal->theData[1] = ZWAITPOINT_6_1; sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_WAITREP, signal, 2, JBB); }}// Start phase 8 (internal 7)void Ndbcntr::startPhase8Lab(Signal* signal){ cinternalStartphase = cstartPhase - 1; cndbBlocksCount = 0; ph7ALab(signal);}void Ndbcntr::ph7ALab(Signal* signal){ while (cndbBlocksCount < ZNO_NDB_BLOCKS) { jam(); sendNdbSttor(signal); return; } if ((ctypeOfStart == NodeState::ST_NODE_RESTART) || (ctypeOfStart == NodeState::ST_INITIAL_NODE_RESTART)) { jam(); sendSttorry(signal); return; } waitpoint71Lab(signal);}void Ndbcntr::waitpoint71Lab(Signal* signal){ if (getOwnNodeId() == cmasterNodeId) { jam(); cnoWaitrep7++; if (cnoWaitrep7 == cnoStartNodes) { jam(); NodeReceiverGroup rg(NDBCNTR, c_start.m_starting); rg.m_nodes.clear(getOwnNodeId()); signal->theData[0] = getOwnNodeId(); signal->theData[1] = ZWAITPOINT_7_2; sendSignal(rg, GSN_CNTR_WAITREP, signal, 2, JBB); sendSttorry(signal); } } else { jam(); signal->theData[0] = getOwnNodeId(); signal->theData[1] = ZWAITPOINT_7_1; sendSignal(calcNdbCntrBlockRef(cmasterNodeId), GSN_CNTR_WAITREP, signal, 2, JBB); }}// Start phase 9 (internal 8)void Ndbcntr::startPhase9Lab(Signal* signal){ cinternalStartphase = cstartPhase - 1; cndbBlocksCount = 0; ph8ALab(signal);}void Ndbcntr::ph8ALab(Signal* signal){/*---------------------------------------------------------------------------*/// NODES WHICH PERFORM A NODE RESTART NEEDS TO GET THE DYNAMIC ID'S// OF THE OTHER NODES HERE./*---------------------------------------------------------------------------*/ sendSttorry(signal); resetStartVariables(signal); return;}//Ndbcntr::ph8BLab()/*******************************//* CNTR_WAITREP *//*******************************/void Ndbcntr::execCNTR_WAITREP(Signal* signal) { Uint16 twaitPoint; jamEntry(); twaitPoint = signal->theData[1]; switch (twaitPoint) { case ZWAITPOINT_4_1: jam(); waitpoint41Lab(signal); break; case ZWAITPOINT_4_2: jam(); sendSttorry(signal); break; case ZWAITPOINT_5_1: jam(); waitpoint51Lab(signal); break; case ZWAITPOINT_5_2: jam(); waitpoint52Lab(signal); break; case ZWAITPOINT_6_1: jam(); waitpoint61Lab(signal); break; case ZWAITPOINT_6_2: jam(); sendSttorry(signal); break; case ZWAITPOINT_7_1: jam(); waitpoint71Lab(signal); break; case ZWAITPOINT_7_2: jam(); sendSttorry(signal); break; default: jam(); systemErrorLab(signal, __LINE__); break; }//switch}//Ndbcntr::execCNTR_WAITREP()/*******************************//* NODE_FAILREP *//*******************************/void Ndbcntr::execNODE_FAILREP(Signal* signal) { jamEntry(); const NodeFailRep * nodeFail = (NodeFailRep *)&signal->theData[0]; NdbNodeBitmask allFailed; allFailed.assign(NdbNodeBitmask::Size, nodeFail->theNodes); NdbNodeBitmask failedStarted = c_startedNodes; NdbNodeBitmask failedStarting = c_start.m_starting; NdbNodeBitmask failedWaiting = c_start.m_waiting;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -