Loading ndb/src/kernel/blocks/dbdict/Dbdict.cpp +13 −1 Original line number Diff line number Diff line Loading @@ -2575,7 +2575,19 @@ Dbdict::restartCreateTab_readTableConf(Signal* signal, Uint32 sz = c_readTableRecord.noOfPages * ZSIZE_OF_PAGES_IN_WORDS; SimplePropertiesLinearReader r(&pageRecPtr.p->word[0], sz); handleTabInfoInit(r, &parseRecord); if (parseRecord.errorCode != 0) { char buf[255]; BaseString::snprintf(buf, sizeof(buf), "Unable to restart, fail while creating table %d" " error: %d. Most likely change of configuration", c_readTableRecord.tableId, parseRecord.errorCode); progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf); ndbrequire(parseRecord.errorCode == 0); } /* ---------------------------------------------------------------- */ // We have read the table description from disk as part of system restart. Loading ndb/src/kernel/blocks/dbdih/Dbdih.hpp +4 −3 Original line number Diff line number Diff line Loading @@ -774,7 +774,7 @@ private: //------------------------------------ // Methods for LCP functionality //------------------------------------ void checkKeepGci(Uint32 replicaStartIndex); void checkKeepGci(TabRecordPtr, Uint32, Fragmentstore*, Uint32); void checkLcpStart(Signal *, Uint32 lineNo); void checkStartMoreLcp(Signal *, Uint32 nodeId); bool reportLcpCompletion(const class LcpFragRep *); Loading Loading @@ -1292,7 +1292,7 @@ private: } Uint32 lcpStart; Uint32 lcpStartGcp; Uint32 lcpStopGcp; Uint32 keepGci; /* USED TO CALCULATE THE GCI TO KEEP AFTER A LCP */ Uint32 oldestRestorableGci; Loading Loading @@ -1361,6 +1361,7 @@ private: Uint32 cstarttype; Uint32 csystemnodes; Uint32 currentgcp; Uint32 c_newest_restorable_gci; enum GcpMasterTakeOverState { GMTOS_IDLE = 0, Loading ndb/src/kernel/blocks/dbdih/DbdihMain.cpp +17 −11 Original line number Diff line number Diff line Loading @@ -674,6 +674,7 @@ void Dbdih::execCOPY_GCIREQ(Signal* signal) jam(); coldgcp = SYSFILE->newestRestorableGCI; crestartGci = SYSFILE->newestRestorableGCI; c_newest_restorable_gci = SYSFILE->newestRestorableGCI; Sysfile::setRestartOngoing(SYSFILE->systemRestartBits); currentgcp = coldgcp + 1; cnewgcp = coldgcp + 1; Loading @@ -692,6 +693,7 @@ void Dbdih::execCOPY_GCIREQ(Signal* signal) ok = true; jam(); cgcpParticipantState = GCP_PARTICIPANT_COPY_GCI_RECEIVED; c_newest_restorable_gci = SYSFILE->newestRestorableGCI; setNodeInfo(signal); break; }//if Loading Loading @@ -7790,6 +7792,8 @@ void Dbdih::execCOPY_GCICONF(Signal* signal) signal->theData[1] = coldgcp; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); c_newest_restorable_gci = coldgcp; CRASH_INSERTION(7004); emptyWaitGCPMasterQueue(signal); cgcpStatus = GCP_READY; Loading Loading @@ -9192,7 +9196,7 @@ void Dbdih::checkTcCounterLab(Signal* signal) }//if c_lcpState.ctimer += 32; if ((c_nodeStartMaster.blockLcp == true) || ((c_lcpState.lcpStartGcp + 1) > currentgcp)) { (c_lcpState.lcpStopGcp >= c_newest_restorable_gci)) { jam(); /* --------------------------------------------------------------------- */ // No reason to start juggling the states and checking for start of LCP if Loading Loading @@ -9275,7 +9279,6 @@ void Dbdih::execTCGETOPSIZECONF(Signal* signal) /* ----------------------------------------------------------------------- */ c_lcpState.ctimer = 0; c_lcpState.keepGci = coldgcp; c_lcpState.lcpStartGcp = currentgcp; /* ----------------------------------------------------------------------- */ /* UPDATE THE NEW LATEST LOCAL CHECKPOINT ID. */ /* ----------------------------------------------------------------------- */ Loading Loading @@ -9347,7 +9350,7 @@ void Dbdih::calculateKeepGciLab(Signal* signal, Uint32 tableId, Uint32 fragId) cnoOfActiveTables++; FragmentstorePtr fragPtr; getFragstore(tabPtr.p, fragId, fragPtr); checkKeepGci(fragPtr.p->storedReplicas); checkKeepGci(tabPtr, fragId, fragPtr.p, fragPtr.p->storedReplicas); fragId++; if (fragId >= tabPtr.p->totalfragments) { jam(); Loading Loading @@ -10205,6 +10208,7 @@ void Dbdih::allNodesLcpCompletedLab(Signal* signal) signal->theData[0] = NDB_LE_LocalCheckpointCompleted; //Event type signal->theData[1] = SYSFILE->latestLCP_ID; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); c_lcpState.lcpStopGcp = c_newest_restorable_gci; /** * Start checking for next LCP Loading Loading @@ -10639,7 +10643,8 @@ void Dbdih::checkEscalation() /* DESCRIPTION: CHECK FOR MINIMUM GCI RESTORABLE WITH NEW LOCAL */ /* CHECKPOINT. */ /*************************************************************************/ void Dbdih::checkKeepGci(Uint32 replicaStartIndex) void Dbdih::checkKeepGci(TabRecordPtr tabPtr, Uint32 fragId, Fragmentstore*, Uint32 replicaStartIndex) { ReplicaRecordPtr ckgReplicaPtr; ckgReplicaPtr.i = replicaStartIndex; Loading @@ -10661,7 +10666,6 @@ void Dbdih::checkKeepGci(Uint32 replicaStartIndex) if (oldestRestorableGci > c_lcpState.oldestRestorableGci) { jam(); c_lcpState.oldestRestorableGci = oldestRestorableGci; ndbrequire(((int)c_lcpState.oldestRestorableGci) >= 0); }//if ckgReplicaPtr.i = ckgReplicaPtr.p->nextReplica; }//while Loading Loading @@ -10955,7 +10959,7 @@ void Dbdih::findMinGci(ReplicaRecordPtr fmgReplicaPtr, do { ndbrequire(lcpNo < MAX_LCP_STORED); if (fmgReplicaPtr.p->lcpStatus[lcpNo] == ZVALID && fmgReplicaPtr.p->maxGciStarted[lcpNo] <= coldgcp) fmgReplicaPtr.p->maxGciStarted[lcpNo] < c_newest_restorable_gci) { jam(); keepGci = fmgReplicaPtr.p->maxGciCompleted[lcpNo]; Loading Loading @@ -11077,7 +11081,7 @@ void Dbdih::initCommonData() c_lcpState.clcpDelay = 0; c_lcpState.lcpStart = ZIDLE; c_lcpState.lcpStartGcp = 0; c_lcpState.lcpStopGcp = 0; c_lcpState.setLcpStatus(LCP_STATUS_IDLE, __LINE__); c_lcpState.currentFragment.tableId = 0; c_lcpState.currentFragment.fragmentId = 0; Loading Loading @@ -11113,6 +11117,7 @@ void Dbdih::initCommonData() csystemnodes = 0; c_updateToLock = RNIL; currentgcp = 0; c_newest_restorable_gci = 0; cverifyQueueCounter = 0; cwaitLcpSr = false; Loading Loading @@ -11188,6 +11193,7 @@ void Dbdih::initRestartInfo() currentgcp = 2; cnewgcp = 2; crestartGci = 1; c_newest_restorable_gci = 1; SYSFILE->keepGCI = 1; SYSFILE->oldestRestorableGCI = 1; Loading Loading @@ -13155,9 +13161,9 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal) if (signal->theData[0] == 7001) { infoEvent("c_lcpState.keepGci = %d", c_lcpState.keepGci); infoEvent("c_lcpState.lcpStatus = %d, clcpStartGcp = %d", infoEvent("c_lcpState.lcpStatus = %d, clcpStopGcp = %d", c_lcpState.lcpStatus, c_lcpState.lcpStartGcp); c_lcpState.lcpStopGcp); infoEvent("cgcpStartCounter = %d, cimmediateLcpStart = %d", cgcpStartCounter, c_lcpState.immediateLcpStart); }//if Loading Loading @@ -13338,8 +13344,8 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal) infoEvent("lcpStatus = %d (update place = %d) ", c_lcpState.lcpStatus, c_lcpState.lcpStatusUpdatedPlace); infoEvent ("lcpStart = %d lcpStartGcp = %d keepGci = %d oldestRestorable = %d", c_lcpState.lcpStart, c_lcpState.lcpStartGcp, ("lcpStart = %d lcpStopGcp = %d keepGci = %d oldestRestorable = %d", c_lcpState.lcpStart, c_lcpState.lcpStopGcp, c_lcpState.keepGci, c_lcpState.oldestRestorableGci); infoEvent Loading ndb/src/kernel/blocks/dblqh/DblqhMain.cpp +25 −3 Original line number Diff line number Diff line Loading @@ -14829,7 +14829,9 @@ void Dblqh::execSr(Signal* signal) signal->theData[4] = logFilePtr.p->currentFilepage; signal->theData[5] = logFilePtr.p->currentMbyte; signal->theData[6] = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX]; sendSignal(cownref, GSN_DEBUG_SIG, signal, 7, JBA); signal->theData[7] = ~0; signal->theData[8] = __LINE__; sendSignal(cownref, GSN_DEBUG_SIG, signal, 9, JBA); return; }//if }//if Loading Loading @@ -14895,7 +14897,8 @@ void Dblqh::execSr(Signal* signal) signal->theData[5] = logFilePtr.p->currentFilepage; signal->theData[6] = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX]; signal->theData[7] = logWord; sendSignal(cownref, GSN_DEBUG_SIG, signal, 8, JBA); signal->theData[8] = __LINE__; sendSignal(cownref, GSN_DEBUG_SIG, signal, 9, JBA); return; break; }//switch Loading Loading @@ -14924,8 +14927,9 @@ void Dblqh::execDEBUG_SIG(Signal* signal) char buf[100]; BaseString::snprintf(buf, 100, "Error while reading REDO log.\n" "Error while reading REDO log. from %d\n" "D=%d, F=%d Mb=%d FP=%d W1=%d W2=%d", signal->theData[8], signal->theData[2], signal->theData[3], signal->theData[4], signal->theData[5], signal->theData[6], signal->theData[7]); Loading Loading @@ -15501,6 +15505,10 @@ void Dblqh::readSrFourthZeroLab(Signal* signal) // to read a page from file. lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_SR_INVALIDATE_PAGES; /** * Make sure we dont release zero page */ seizeLogpage(signal); invalidateLogAfterLastGCI(signal); return; }//Dblqh::readSrFourthZeroLab() Loading Loading @@ -16154,8 +16162,22 @@ void Dblqh::findLogfile(Signal* signal, }//if locLogFilePtr.i = locLogFilePtr.p->nextLogFile; loopCount++; if (loopCount >= flfLogPartPtr.p->noLogFiles && getNodeState().startLevel != NodeState::SL_STARTED) { goto error; } ndbrequire(loopCount < flfLogPartPtr.p->noLogFiles); }//while error: char buf[255]; BaseString::snprintf(buf, sizeof(buf), "Unable to restart, failed while reading redo." " Likely invalid change of configuration"); progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf); }//Dblqh::findLogfile() /* ------------------------------------------------------------------------- */ Loading
ndb/src/kernel/blocks/dbdict/Dbdict.cpp +13 −1 Original line number Diff line number Diff line Loading @@ -2575,7 +2575,19 @@ Dbdict::restartCreateTab_readTableConf(Signal* signal, Uint32 sz = c_readTableRecord.noOfPages * ZSIZE_OF_PAGES_IN_WORDS; SimplePropertiesLinearReader r(&pageRecPtr.p->word[0], sz); handleTabInfoInit(r, &parseRecord); if (parseRecord.errorCode != 0) { char buf[255]; BaseString::snprintf(buf, sizeof(buf), "Unable to restart, fail while creating table %d" " error: %d. Most likely change of configuration", c_readTableRecord.tableId, parseRecord.errorCode); progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf); ndbrequire(parseRecord.errorCode == 0); } /* ---------------------------------------------------------------- */ // We have read the table description from disk as part of system restart. Loading
ndb/src/kernel/blocks/dbdih/Dbdih.hpp +4 −3 Original line number Diff line number Diff line Loading @@ -774,7 +774,7 @@ private: //------------------------------------ // Methods for LCP functionality //------------------------------------ void checkKeepGci(Uint32 replicaStartIndex); void checkKeepGci(TabRecordPtr, Uint32, Fragmentstore*, Uint32); void checkLcpStart(Signal *, Uint32 lineNo); void checkStartMoreLcp(Signal *, Uint32 nodeId); bool reportLcpCompletion(const class LcpFragRep *); Loading Loading @@ -1292,7 +1292,7 @@ private: } Uint32 lcpStart; Uint32 lcpStartGcp; Uint32 lcpStopGcp; Uint32 keepGci; /* USED TO CALCULATE THE GCI TO KEEP AFTER A LCP */ Uint32 oldestRestorableGci; Loading Loading @@ -1361,6 +1361,7 @@ private: Uint32 cstarttype; Uint32 csystemnodes; Uint32 currentgcp; Uint32 c_newest_restorable_gci; enum GcpMasterTakeOverState { GMTOS_IDLE = 0, Loading
ndb/src/kernel/blocks/dbdih/DbdihMain.cpp +17 −11 Original line number Diff line number Diff line Loading @@ -674,6 +674,7 @@ void Dbdih::execCOPY_GCIREQ(Signal* signal) jam(); coldgcp = SYSFILE->newestRestorableGCI; crestartGci = SYSFILE->newestRestorableGCI; c_newest_restorable_gci = SYSFILE->newestRestorableGCI; Sysfile::setRestartOngoing(SYSFILE->systemRestartBits); currentgcp = coldgcp + 1; cnewgcp = coldgcp + 1; Loading @@ -692,6 +693,7 @@ void Dbdih::execCOPY_GCIREQ(Signal* signal) ok = true; jam(); cgcpParticipantState = GCP_PARTICIPANT_COPY_GCI_RECEIVED; c_newest_restorable_gci = SYSFILE->newestRestorableGCI; setNodeInfo(signal); break; }//if Loading Loading @@ -7790,6 +7792,8 @@ void Dbdih::execCOPY_GCICONF(Signal* signal) signal->theData[1] = coldgcp; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); c_newest_restorable_gci = coldgcp; CRASH_INSERTION(7004); emptyWaitGCPMasterQueue(signal); cgcpStatus = GCP_READY; Loading Loading @@ -9192,7 +9196,7 @@ void Dbdih::checkTcCounterLab(Signal* signal) }//if c_lcpState.ctimer += 32; if ((c_nodeStartMaster.blockLcp == true) || ((c_lcpState.lcpStartGcp + 1) > currentgcp)) { (c_lcpState.lcpStopGcp >= c_newest_restorable_gci)) { jam(); /* --------------------------------------------------------------------- */ // No reason to start juggling the states and checking for start of LCP if Loading Loading @@ -9275,7 +9279,6 @@ void Dbdih::execTCGETOPSIZECONF(Signal* signal) /* ----------------------------------------------------------------------- */ c_lcpState.ctimer = 0; c_lcpState.keepGci = coldgcp; c_lcpState.lcpStartGcp = currentgcp; /* ----------------------------------------------------------------------- */ /* UPDATE THE NEW LATEST LOCAL CHECKPOINT ID. */ /* ----------------------------------------------------------------------- */ Loading Loading @@ -9347,7 +9350,7 @@ void Dbdih::calculateKeepGciLab(Signal* signal, Uint32 tableId, Uint32 fragId) cnoOfActiveTables++; FragmentstorePtr fragPtr; getFragstore(tabPtr.p, fragId, fragPtr); checkKeepGci(fragPtr.p->storedReplicas); checkKeepGci(tabPtr, fragId, fragPtr.p, fragPtr.p->storedReplicas); fragId++; if (fragId >= tabPtr.p->totalfragments) { jam(); Loading Loading @@ -10205,6 +10208,7 @@ void Dbdih::allNodesLcpCompletedLab(Signal* signal) signal->theData[0] = NDB_LE_LocalCheckpointCompleted; //Event type signal->theData[1] = SYSFILE->latestLCP_ID; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); c_lcpState.lcpStopGcp = c_newest_restorable_gci; /** * Start checking for next LCP Loading Loading @@ -10639,7 +10643,8 @@ void Dbdih::checkEscalation() /* DESCRIPTION: CHECK FOR MINIMUM GCI RESTORABLE WITH NEW LOCAL */ /* CHECKPOINT. */ /*************************************************************************/ void Dbdih::checkKeepGci(Uint32 replicaStartIndex) void Dbdih::checkKeepGci(TabRecordPtr tabPtr, Uint32 fragId, Fragmentstore*, Uint32 replicaStartIndex) { ReplicaRecordPtr ckgReplicaPtr; ckgReplicaPtr.i = replicaStartIndex; Loading @@ -10661,7 +10666,6 @@ void Dbdih::checkKeepGci(Uint32 replicaStartIndex) if (oldestRestorableGci > c_lcpState.oldestRestorableGci) { jam(); c_lcpState.oldestRestorableGci = oldestRestorableGci; ndbrequire(((int)c_lcpState.oldestRestorableGci) >= 0); }//if ckgReplicaPtr.i = ckgReplicaPtr.p->nextReplica; }//while Loading Loading @@ -10955,7 +10959,7 @@ void Dbdih::findMinGci(ReplicaRecordPtr fmgReplicaPtr, do { ndbrequire(lcpNo < MAX_LCP_STORED); if (fmgReplicaPtr.p->lcpStatus[lcpNo] == ZVALID && fmgReplicaPtr.p->maxGciStarted[lcpNo] <= coldgcp) fmgReplicaPtr.p->maxGciStarted[lcpNo] < c_newest_restorable_gci) { jam(); keepGci = fmgReplicaPtr.p->maxGciCompleted[lcpNo]; Loading Loading @@ -11077,7 +11081,7 @@ void Dbdih::initCommonData() c_lcpState.clcpDelay = 0; c_lcpState.lcpStart = ZIDLE; c_lcpState.lcpStartGcp = 0; c_lcpState.lcpStopGcp = 0; c_lcpState.setLcpStatus(LCP_STATUS_IDLE, __LINE__); c_lcpState.currentFragment.tableId = 0; c_lcpState.currentFragment.fragmentId = 0; Loading Loading @@ -11113,6 +11117,7 @@ void Dbdih::initCommonData() csystemnodes = 0; c_updateToLock = RNIL; currentgcp = 0; c_newest_restorable_gci = 0; cverifyQueueCounter = 0; cwaitLcpSr = false; Loading Loading @@ -11188,6 +11193,7 @@ void Dbdih::initRestartInfo() currentgcp = 2; cnewgcp = 2; crestartGci = 1; c_newest_restorable_gci = 1; SYSFILE->keepGCI = 1; SYSFILE->oldestRestorableGCI = 1; Loading Loading @@ -13155,9 +13161,9 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal) if (signal->theData[0] == 7001) { infoEvent("c_lcpState.keepGci = %d", c_lcpState.keepGci); infoEvent("c_lcpState.lcpStatus = %d, clcpStartGcp = %d", infoEvent("c_lcpState.lcpStatus = %d, clcpStopGcp = %d", c_lcpState.lcpStatus, c_lcpState.lcpStartGcp); c_lcpState.lcpStopGcp); infoEvent("cgcpStartCounter = %d, cimmediateLcpStart = %d", cgcpStartCounter, c_lcpState.immediateLcpStart); }//if Loading Loading @@ -13338,8 +13344,8 @@ Dbdih::execDUMP_STATE_ORD(Signal* signal) infoEvent("lcpStatus = %d (update place = %d) ", c_lcpState.lcpStatus, c_lcpState.lcpStatusUpdatedPlace); infoEvent ("lcpStart = %d lcpStartGcp = %d keepGci = %d oldestRestorable = %d", c_lcpState.lcpStart, c_lcpState.lcpStartGcp, ("lcpStart = %d lcpStopGcp = %d keepGci = %d oldestRestorable = %d", c_lcpState.lcpStart, c_lcpState.lcpStopGcp, c_lcpState.keepGci, c_lcpState.oldestRestorableGci); infoEvent Loading
ndb/src/kernel/blocks/dblqh/DblqhMain.cpp +25 −3 Original line number Diff line number Diff line Loading @@ -14829,7 +14829,9 @@ void Dblqh::execSr(Signal* signal) signal->theData[4] = logFilePtr.p->currentFilepage; signal->theData[5] = logFilePtr.p->currentMbyte; signal->theData[6] = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX]; sendSignal(cownref, GSN_DEBUG_SIG, signal, 7, JBA); signal->theData[7] = ~0; signal->theData[8] = __LINE__; sendSignal(cownref, GSN_DEBUG_SIG, signal, 9, JBA); return; }//if }//if Loading Loading @@ -14895,7 +14897,8 @@ void Dblqh::execSr(Signal* signal) signal->theData[5] = logFilePtr.p->currentFilepage; signal->theData[6] = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX]; signal->theData[7] = logWord; sendSignal(cownref, GSN_DEBUG_SIG, signal, 8, JBA); signal->theData[8] = __LINE__; sendSignal(cownref, GSN_DEBUG_SIG, signal, 9, JBA); return; break; }//switch Loading Loading @@ -14924,8 +14927,9 @@ void Dblqh::execDEBUG_SIG(Signal* signal) char buf[100]; BaseString::snprintf(buf, 100, "Error while reading REDO log.\n" "Error while reading REDO log. from %d\n" "D=%d, F=%d Mb=%d FP=%d W1=%d W2=%d", signal->theData[8], signal->theData[2], signal->theData[3], signal->theData[4], signal->theData[5], signal->theData[6], signal->theData[7]); Loading Loading @@ -15501,6 +15505,10 @@ void Dblqh::readSrFourthZeroLab(Signal* signal) // to read a page from file. lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_SR_INVALIDATE_PAGES; /** * Make sure we dont release zero page */ seizeLogpage(signal); invalidateLogAfterLastGCI(signal); return; }//Dblqh::readSrFourthZeroLab() Loading Loading @@ -16154,8 +16162,22 @@ void Dblqh::findLogfile(Signal* signal, }//if locLogFilePtr.i = locLogFilePtr.p->nextLogFile; loopCount++; if (loopCount >= flfLogPartPtr.p->noLogFiles && getNodeState().startLevel != NodeState::SL_STARTED) { goto error; } ndbrequire(loopCount < flfLogPartPtr.p->noLogFiles); }//while error: char buf[255]; BaseString::snprintf(buf, sizeof(buf), "Unable to restart, failed while reading redo." " Likely invalid change of configuration"); progError(__LINE__, NDBD_EXIT_INVALID_CONFIG, buf); }//Dblqh::findLogfile() /* ------------------------------------------------------------------------- */