📄 dblqhmain.cpp
字号:
break; case ZRESTART_OPERATIONS_AFTER_STOP: jam(); tcConnectptr.i = data0; ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec); if (tcConnectptr.p->listState != TcConnectionrec::WAIT_QUEUE_LIST) { jam(); return; }//if releaseWaitQueue(signal); linkActiveFrag(signal); restartOperationsAfterStopLab(signal); return; break; case ZCHECK_LCP_STOP_BLOCKED: jam(); c_scanRecordPool.getPtr(scanptr, data0); tcConnectptr.i = scanptr.p->scanTcrec; ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec); fragptr.i = tcConnectptr.p->fragmentptr; ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord); checkLcpStopBlockedLab(signal); return; case ZSCAN_MARKERS: jam(); scanMarkers(signal, data0, data1, data2); return; break; case ZOPERATION_EVENT_REP: jam(); /* --------------------------------------------------------------------- */ // Report information about transaction activity once per second. /* --------------------------------------------------------------------- */ if (signal->theData[1] == 0) { signal->theData[0] = NDB_LE_OperationReportCounters; signal->theData[1] = c_Counters.operations; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); }//if c_Counters.clear(); signal->theData[0] = ZOPERATION_EVENT_REP; signal->theData[1] = 0; sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 5000, 2); break; case ZPREP_DROP_TABLE: jam(); checkDropTab(signal); return; break; default: ndbrequire(false); break; }//switch}//Dblqh::execCONTINUEB()/* *********************************************************> *//* Request from DBDIH to include a new node in the node list *//* and so forth. *//* *********************************************************> */void Dblqh::execINCL_NODEREQ(Signal* signal) { jamEntry(); BlockReference retRef = signal->theData[0]; Uint32 nodeId = signal->theData[1]; cnewestGci = signal->theData[2]; cnewestCompletedGci = signal->theData[2] - 1; ndbrequire(cnoOfNodes < MAX_NDB_NODES); for (Uint32 i = 0; i < cnoOfNodes; i++) { jam(); if (cnodeData[i] == nodeId) { jam(); cnodeStatus[i] = ZNODE_UP; }//if }//for signal->theData[0] = cownref; sendSignal(retRef, GSN_INCL_NODECONF, signal, 1, JBB); return;}//Dblqh::execINCL_NODEREQ()void Dblqh::execTUPSEIZEREF(Signal* signal) { jamEntry(); ndbrequire(false);}//Dblqh::execTUPSEIZEREF()/* ########################################################################## *//* ####### START / RESTART MODULE ####### *//* ########################################################################## *//* ************************************************************************>> *//* This is first signal that arrives in a start / restart. Sender is NDBCNTR_REF. *//* ************************************************************************>> */void Dblqh::execSTTOR(Signal* signal) { UintR tstartPhase; jamEntry(); /* START CASE */ tstartPhase = signal->theData[1]; /* SYSTEM RESTART RANK */ csignalKey = signal->theData[6]; switch (tstartPhase) { case ZSTART_PHASE1: jam(); cstartPhase = tstartPhase; sttorStartphase1Lab(signal); c_tup = (Dbtup*)globalData.getBlock(DBTUP); ndbrequire(c_tup != 0); return; break; default: jam(); /*empty*/; sendsttorryLab(signal); return; break; }//switch}//Dblqh::execSTTOR()/* ***************************************> *//* Restart phases 1 - 6, sender is Ndbcntr *//* ***************************************> */void Dblqh::execNDB_STTOR(Signal* signal) { jamEntry(); Uint32 ownNodeId = signal->theData[1]; /* START PHASE*/ cstartPhase = signal->theData[2]; /* MY NODE ID */ cstartType = signal->theData[3]; /* START TYPE */ switch (cstartPhase) { case ZSTART_PHASE1: jam(); preComputedRequestInfoMask = 0; LqhKeyReq::setKeyLen(preComputedRequestInfoMask, RI_KEYLEN_MASK); LqhKeyReq::setLastReplicaNo(preComputedRequestInfoMask, RI_LAST_REPL_MASK); LqhKeyReq::setLockType(preComputedRequestInfoMask, RI_LOCK_TYPE_MASK); // Dont LqhKeyReq::setApplicationAddressFlag LqhKeyReq::setDirtyFlag(preComputedRequestInfoMask, 1); // Dont LqhKeyReq::setInterpretedFlag LqhKeyReq::setSimpleFlag(preComputedRequestInfoMask, 1); LqhKeyReq::setOperation(preComputedRequestInfoMask, RI_OPERATION_MASK); // Dont setAIInLqhKeyReq // Dont setSeqNoReplica // Dont setSameClientAndTcFlag // Dont setReturnedReadLenAIFlag // Dont setAPIVersion LqhKeyReq::setMarkerFlag(preComputedRequestInfoMask, 1); //preComputedRequestInfoMask = 0x003d7fff; startphase1Lab(signal, /* dummy */ ~0, ownNodeId); signal->theData[0] = ZOPERATION_EVENT_REP; signal->theData[1] = 1; sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 10, 2); return; break; case ZSTART_PHASE2: jam(); startphase2Lab(signal, /* dummy */ ~0); return; break; case ZSTART_PHASE3: jam(); startphase3Lab(signal); return; break; case ZSTART_PHASE4: jam(); startphase4Lab(signal); return; break; case ZSTART_PHASE6: jam(); startphase6Lab(signal); return; break; default: jam(); /*empty*/; sendNdbSttorryLab(signal); return; break; }//switch}//Dblqh::execNDB_STTOR()/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *//* +++++++ START PHASE 1 +++++++ *//* LOAD OUR BLOCK REFERENCE AND OUR PROCESSOR ID *//* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */void Dblqh::sttorStartphase1Lab(Signal* signal) { sendsttorryLab(signal); return;}//Dblqh::sttorStartphase1Lab()/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *//* +++++++ START PHASE 2 +++++++ *//* *//* INITIATE ALL RECORDS WITHIN THE BLOCK *//* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */void Dblqh::startphase1Lab(Signal* signal, Uint32 _dummy, Uint32 ownNodeId) { UintR Ti; HostRecordPtr ThostPtr;/* ------- INITIATE ALL RECORDS ------- */ cownNodeid = ownNodeId; caccBlockref = calcAccBlockRef (cownNodeid); ctupBlockref = calcTupBlockRef (cownNodeid); ctuxBlockref = calcTuxBlockRef (cownNodeid); cownref = calcLqhBlockRef (cownNodeid); for (Ti = 0; Ti < chostFileSize; Ti++) { ThostPtr.i = Ti; ptrCheckGuard(ThostPtr, chostFileSize, hostRecord); ThostPtr.p->hostLqhBlockRef = calcLqhBlockRef(ThostPtr.i); ThostPtr.p->hostTcBlockRef = calcTcBlockRef(ThostPtr.i); ThostPtr.p->inPackedList = false; ThostPtr.p->noOfPackedWordsLqh = 0; ThostPtr.p->noOfPackedWordsTc = 0; }//for cpackedListIndex = 0; sendNdbSttorryLab(signal); return;}//Dblqh::startphase1Lab()/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *//* +++++++ START PHASE 2 +++++++ *//* *//* CONNECT LQH WITH ACC AND TUP. *//* EVERY CONNECTION RECORD IN LQH IS ASSIGNED TO ONE ACC CONNECTION RECORD *//* AND ONE TUP CONNECTION RECORD. *//* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */void Dblqh::startphase2Lab(Signal* signal, Uint32 _dummy) { cmaxWordsAtNodeRec = MAX_NO_WORDS_OUTSTANDING_COPY_FRAGMENT;/* -- ACC AND TUP CONNECTION PROCESS -- */ tcConnectptr.i = 0; ptrAss(tcConnectptr, tcConnectionrec); moreconnectionsLab(signal); return;}//Dblqh::startphase2Lab()void Dblqh::moreconnectionsLab(Signal* signal) { tcConnectptr.p->tcAccBlockref = caccBlockref; // set TUX block here (no operation is seized in TUX) tcConnectptr.p->tcTuxBlockref = ctuxBlockref;/* NO STATE CHECKING IS PERFORMED, ASSUMED TO WORK *//* *************** *//* ACCSEIZEREQ < *//* *************** */ signal->theData[0] = tcConnectptr.i; signal->theData[1] = cownref; sendSignal(caccBlockref, GSN_ACCSEIZEREQ, signal, 2, JBB); return;}//Dblqh::moreconnectionsLab()/* ***************> *//* ACCSEIZECONF > *//* ***************> */void Dblqh::execACCSEIZECONF(Signal* signal) { jamEntry(); tcConnectptr.i = signal->theData[0]; ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec); tcConnectptr.p->accConnectrec = signal->theData[1];/* *************** *//* TUPSEIZEREQ < *//* *************** */ tcConnectptr.p->tcTupBlockref = ctupBlockref; signal->theData[0] = tcConnectptr.i; signal->theData[1] = cownref; sendSignal(ctupBlockref, GSN_TUPSEIZEREQ, signal, 2, JBB); return;}//Dblqh::execACCSEIZECONF()/* ***************> *//* TUPSEIZECONF > *//* ***************> */void Dblqh::execTUPSEIZECONF(Signal* signal) { jamEntry(); tcConnectptr.i = signal->theData[0]; ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec); tcConnectptr.p->tupConnectrec = signal->theData[1];/* ------- CHECK IF THERE ARE MORE CONNECTIONS TO BE CONNECTED ------- */ tcConnectptr.i = tcConnectptr.p->nextTcConnectrec; if (tcConnectptr.i != RNIL) { jam(); ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec); moreconnectionsLab(signal); return; }//if/* ALL LQH_CONNECT RECORDS ARE CONNECTED TO ACC AND TUP ---- */ sendNdbSttorryLab(signal); return;}//Dblqh::execTUPSEIZECONF()/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *//* +++++++ START PHASE 4 +++++++ *//* *//* CONNECT LQH WITH LQH. *//* CONNECT EACH LQH WITH EVERY LQH IN THE DATABASE SYSTEM. *//* IF INITIAL START THEN CREATE THE FRAGMENT LOG FILES *//*IF SYSTEM RESTART OR NODE RESTART THEN OPEN THE FRAGMENT LOG FILES AND *//*FIND THE END OF THE LOG FILES. *//* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ *//* WAIT UNTIL ADD NODE PROCESSES ARE COMPLETED *//* IF INITIAL START ALSO WAIT FOR LOG FILES TO INITIALISED *//*START TIME SUPERVISION OF LOG FILES. WE HAVE TO WRITE LOG PAGES TO DISK *//*EVEN IF THE PAGES ARE NOT FULL TO ENSURE THAT THEY COME TO DISK ASAP. *//* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */void Dblqh::startphase3Lab(Signal* signal) { LogFileRecordPtr prevLogFilePtr; LogFileRecordPtr zeroLogFilePtr; caddNodeState = ZTRUE;/* ***************<< *//* READ_NODESREQ < *//* ***************<< */ cinitialStartOngoing = ZTRUE; ndbrequire(cnoLogFiles != 0); for (logPartPtr.i = 0; logPartPtr.i < 4; logPartPtr.i++) { jam(); ptrAss(logPartPtr, logPartRecord); initLogpart(signal); for (Uint32 fileNo = 0; fileNo < cnoLogFiles; fileNo++) { seizeLogfile(signal); if (fileNo != 0) { jam(); prevLogFilePtr.p->nextLogFile = logFilePtr.i; logFilePtr.p->prevLogFile = prevLogFilePtr.i; } else { jam(); logPartPtr.p->firstLogfile = logFilePtr.i; logPartPtr.p->currentLogfile = logFilePtr.i; zeroLogFilePtr.i = logFilePtr.i; zeroLogFilePtr.p = logFilePtr.p; }//if prevLogFilePtr.i = logFilePtr.i; prevLogFilePtr.p = logFilePtr.p; initLogfile(signal, fileNo); if ((cstartType == NodeState::ST_INITIAL_START) || (cstartType == NodeState::ST_INITIAL_NODE_RESTART)) { if (logFilePtr.i == zeroLogFilePtr.i) { jam();/* ------------------------------------------------------------------------- *//*IN AN INITIAL START WE START BY CREATING ALL LOG FILES AND SETTING THEIR *//*PROPER SIZE AND INITIALISING PAGE ZERO IN ALL FILES. *//*WE START BY CREATING FILE ZERO IN EACH LOG PART AND THEN PROCEED *//*SEQUENTIALLY THROUGH ALL LOG FILES IN THE LOG PART. *//* ------------------------------------------------------------------------- */ openLogfileInit(signal); }//if }//if }//for zeroLogFilePtr.p->prevLogFile = logFilePtr.i; logFilePtr.p->nextLogFile = zeroLogFilePtr.i; }//for if (cstartType != NodeState::ST_INITIAL_START && cstartType != NodeState::ST_INITIAL_NODE_RESTART) { jam(); ndbrequire(cstartType == NodeState::ST_NODE_RESTART || cstartType == NodeState::ST_SYSTEM_RESTART); /** -------------------------------------------------------------------- * THIS CODE KICKS OFF THE SYSTEM RESTART AND NODE RESTART. IT STARTS UP * THE RESTART BY FINDING THE END OF THE LOG AND FROM THERE FINDING THE * INFO ABOUT THE GLOBAL CHECKPOINTS IN THE FRAGMENT LOG. --------------------------------------------------------------------- */ for (logPartPtr.i = 0; logPartPtr.i < 4; logPartPtr.i++) { jam(); LogFileRecordPtr locLogFilePtr; ptrAss(logPartPtr, logPartRecord); locLogFilePtr.i = logPartPtr.p->firstLogfile; ptrCheckGuard(locLogFilePtr, clogFileFileSize, logFileRecord); locLogFilePtr.p->logFileStatus = LogFileRecord::OPEN_SR_FRONTPAGE; openFileRw(signal, locLogFilePtr); }//for }//if signal->theData[0] = cownref; sendSignal(NDBCNTR_REF, GSN_READ_NODESREQ, signal, 1, JBB); return;}//Dblqh::startphase3Lab()/* ****************** *//* READ_NODESCONF > *//* ****************** */void Dblqh::execREAD_NODESCONF(Signal* signal) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -