📄 dblqhmain.cpp
字号:
void Dblqh::fragrefLab(Signal* signal, BlockReference fragBlockRef, Uint32 fragConPtr, Uint32 errorCode) { LqhFragRef * ref = (LqhFragRef*)signal->getDataPtrSend(); ref->senderData = fragConPtr; ref->errorCode = errorCode; sendSignal(fragBlockRef, GSN_LQHFRAGREF, signal, LqhFragRef::SignalLength, JBB); return;}//Dblqh::fragrefLab()/* * Abort on-going ops. */void Dblqh::abortAddFragOps(Signal* signal){ fragptr.i = addfragptr.p->fragmentPtr; ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord); signal->theData[0] = (Uint32)-1; if (addfragptr.p->tup1Connectptr != RNIL) { jam(); signal->theData[1] = addfragptr.p->tup1Connectptr; sendSignal(fragptr.p->tupBlockref, GSN_TUPFRAGREQ, signal, 2, JBB); addfragptr.p->tup1Connectptr = RNIL; } if (addfragptr.p->tup2Connectptr != RNIL) { jam(); signal->theData[1] = addfragptr.p->tup2Connectptr; sendSignal(fragptr.p->tupBlockref, GSN_TUPFRAGREQ, signal, 2, JBB); addfragptr.p->tup2Connectptr = RNIL; } if (addfragptr.p->tux1Connectptr != RNIL) { jam(); signal->theData[1] = addfragptr.p->tux1Connectptr; sendSignal(fragptr.p->tuxBlockref, GSN_TUXFRAGREQ, signal, 2, JBB); addfragptr.p->tux1Connectptr = RNIL; } if (addfragptr.p->tux2Connectptr != RNIL) { jam(); signal->theData[1] = addfragptr.p->tux2Connectptr; sendSignal(fragptr.p->tuxBlockref, GSN_TUXFRAGREQ, signal, 2, JBB); addfragptr.p->tux2Connectptr = RNIL; }}/* ************>> *//* ACCFRAGREF > *//* ************>> */void Dblqh::execACCFRAGREF(Signal* signal) { jamEntry(); addfragptr.i = signal->theData[0]; ptrCheckGuard(addfragptr, caddfragrecFileSize, addFragRecord); terrorCode = signal->theData[1]; ndbrequire(addfragptr.p->addfragStatus == AddFragRecord::ACC_ADDFRAG); addfragptr.p->addfragErrorCode = terrorCode; const Uint32 ref = addfragptr.p->dictBlockref; const Uint32 senderData = addfragptr.p->dictConnectptr; const Uint32 errorCode = addfragptr.p->addfragErrorCode; releaseAddfragrec(signal); fragrefLab(signal, ref, senderData, errorCode); return;}//Dblqh::execACCFRAGREF()/* ************>> *//* TUPFRAGREF > *//* ************>> */void Dblqh::execTUPFRAGREF(Signal* signal) { jamEntry(); addfragptr.i = signal->theData[0]; ptrCheckGuard(addfragptr, caddfragrecFileSize, addFragRecord); terrorCode = signal->theData[1]; fragptr.i = addfragptr.p->fragmentPtr; ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord); addfragptr.p->addfragErrorCode = terrorCode; // no operation to release, just add some jams switch (addfragptr.p->addfragStatus) { case AddFragRecord::WAIT_TWO_TUP: jam(); break; case AddFragRecord::WAIT_ONE_TUP: jam(); break; case AddFragRecord::WAIT_TWO_TUX: jam(); break; case AddFragRecord::WAIT_ONE_TUX: jam(); break; default: ndbrequire(false); break; } abortAddFragOps(signal); const Uint32 ref = addfragptr.p->dictBlockref; const Uint32 senderData = addfragptr.p->dictConnectptr; const Uint32 errorCode = addfragptr.p->addfragErrorCode; releaseAddfragrec(signal); fragrefLab(signal, ref, senderData, errorCode);}//Dblqh::execTUPFRAGREF()/* ************>> *//* TUXFRAGREF > *//* ************>> */void Dblqh::execTUXFRAGREF(Signal* signal) { jamEntry(); execTUPFRAGREF(signal);}//Dblqh::execTUXFRAGREF/* *********************> *//* TUP_ADD_ATTREF > *//* *********************> */void Dblqh::execTUP_ADD_ATTRREF(Signal* signal) { jamEntry(); addfragptr.i = signal->theData[0]; ptrCheckGuard(addfragptr, caddfragrecFileSize, addFragRecord); terrorCode = signal->theData[1]; addfragptr.p->addfragErrorCode = terrorCode; // operation was released on the other side switch (addfragptr.p->addfragStatus) { case AddFragRecord::TUP_ATTR_WAIT1: jam(); ndbrequire(addfragptr.p->tup1Connectptr != RNIL); addfragptr.p->tup1Connectptr = RNIL; break; case AddFragRecord::TUP_ATTR_WAIT2: jam(); ndbrequire(addfragptr.p->tup2Connectptr != RNIL); addfragptr.p->tup2Connectptr = RNIL; break; case AddFragRecord::TUX_ATTR_WAIT1: jam(); ndbrequire(addfragptr.p->tux1Connectptr != RNIL); addfragptr.p->tux1Connectptr = RNIL; break; case AddFragRecord::TUX_ATTR_WAIT2: jam(); ndbrequire(addfragptr.p->tux2Connectptr != RNIL); addfragptr.p->tux2Connectptr = RNIL; break; default: ndbrequire(false); break; } abortAddFragOps(signal); const Uint32 Ref = addfragptr.p->dictBlockref; const Uint32 senderData = addfragptr.p->dictConnectptr; const Uint32 errorCode = addfragptr.p->addfragErrorCode; releaseAddfragrec(signal); LqhAddAttrRef *const ref = (LqhAddAttrRef*)signal->getDataPtrSend(); ref->senderData = senderData; ref->errorCode = errorCode; sendSignal(Ref, GSN_LQHADDATTREF, signal, LqhAddAttrRef::SignalLength, JBB); }//Dblqh::execTUP_ADD_ATTRREF()/* **********************> *//* TUX_ADD_ATTRREF > *//* **********************> */void Dblqh::execTUX_ADD_ATTRREF(Signal* signal) { jamEntry(); execTUP_ADD_ATTRREF(signal);}//Dblqh::execTUX_ADD_ATTRREFvoidDblqh::execPREP_DROP_TAB_REQ(Signal* signal){ jamEntry(); PrepDropTabReq* req = (PrepDropTabReq*)signal->getDataPtr(); Uint32 senderRef = req->senderRef; Uint32 senderData = req->senderData; TablerecPtr tabPtr; tabPtr.i = req->tableId; ptrCheckGuard(tabPtr, ctabrecFileSize, tablerec); Uint32 errCode = 0; errCode = checkDropTabState(tabPtr.p->tableStatus, GSN_PREP_DROP_TAB_REQ); if(errCode != 0){ jam(); PrepDropTabRef* ref = (PrepDropTabRef*)signal->getDataPtrSend(); ref->senderRef = reference(); ref->senderData = senderData; ref->tableId = tabPtr.i; ref->errorCode = errCode; sendSignal(senderRef, GSN_PREP_DROP_TAB_REF, signal, PrepDropTabRef::SignalLength, JBB); return; } tabPtr.p->tableStatus = Tablerec::PREP_DROP_TABLE_ONGOING; tabPtr.p->waitingTC.clear(); tabPtr.p->waitingDIH.clear(); PrepDropTabConf * conf = (PrepDropTabConf*)signal->getDataPtrSend(); conf->tableId = tabPtr.i; conf->senderRef = reference(); conf->senderData = senderData; sendSignal(senderRef, GSN_PREP_DROP_TAB_CONF, signal, PrepDropTabConf::SignalLength, JBB); signal->theData[0] = ZPREP_DROP_TABLE; signal->theData[1] = tabPtr.i; signal->theData[2] = senderRef; signal->theData[3] = senderData; checkDropTab(signal);}voidDblqh::checkDropTab(Signal* signal){ TablerecPtr tabPtr; tabPtr.i = signal->theData[1]; ptrCheckGuard(tabPtr, ctabrecFileSize, tablerec); ndbrequire(tabPtr.p->tableStatus == Tablerec::PREP_DROP_TABLE_ONGOING); if(tabPtr.p->usageCount > 0){ jam(); sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 4); return; } bool lcpDone = true; lcpPtr.i = 0; ptrAss(lcpPtr, lcpRecord); if(lcpPtr.p->lcpState != LcpRecord::LCP_IDLE){ jam(); if(lcpPtr.p->currentFragment.lcpFragOrd.tableId == tabPtr.i){ jam(); lcpDone = false; } if(lcpPtr.p->lcpQueued && lcpPtr.p->queuedFragment.lcpFragOrd.tableId == tabPtr.i){ jam(); lcpDone = false; } } if(!lcpDone){ jam(); sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 100, 4); return; } tabPtr.p->tableStatus = Tablerec::PREP_DROP_TABLE_DONE; WaitDropTabConf * conf = (WaitDropTabConf*)signal->getDataPtrSend(); conf->tableId = tabPtr.i; conf->senderRef = reference(); for(Uint32 i = 1; i<MAX_NDB_NODES; i++){ if(tabPtr.p->waitingTC.get(i)){ tabPtr.p->waitingTC.clear(i); sendSignal(calcTcBlockRef(i), GSN_WAIT_DROP_TAB_CONF, signal, WaitDropTabConf::SignalLength, JBB); } if(tabPtr.p->waitingDIH.get(i)){ tabPtr.p->waitingDIH.clear(i); sendSignal(calcDihBlockRef(i), GSN_WAIT_DROP_TAB_CONF, signal, WaitDropTabConf::SignalLength, JBB); } }}voidDblqh::execWAIT_DROP_TAB_REQ(Signal* signal){ jamEntry(); WaitDropTabReq * req = (WaitDropTabReq*)signal->getDataPtr(); TablerecPtr tabPtr; tabPtr.i = req->tableId; ptrCheckGuard(tabPtr, ctabrecFileSize, tablerec); Uint32 senderRef = req->senderRef; Uint32 nodeId = refToNode(senderRef); Uint32 blockNo = refToBlock(senderRef); if(tabPtr.p->tableStatus == Tablerec::PREP_DROP_TABLE_ONGOING){ jam(); switch(blockNo){ case DBTC: tabPtr.p->waitingTC.set(nodeId); break; case DBDIH: tabPtr.p->waitingDIH.set(nodeId); break; default: ndbrequire(false); } return; } if(tabPtr.p->tableStatus == Tablerec::PREP_DROP_TABLE_DONE){ jam(); WaitDropTabConf * conf = (WaitDropTabConf*)signal->getDataPtrSend(); conf->tableId = tabPtr.i; conf->senderRef = reference(); sendSignal(senderRef, GSN_WAIT_DROP_TAB_CONF, signal, WaitDropTabConf::SignalLength, JBB); return; } WaitDropTabRef * ref = (WaitDropTabRef*)signal->getDataPtrSend(); ref->tableId = tabPtr.i; ref->senderRef = reference(); bool ok = false; switch(tabPtr.p->tableStatus){ case Tablerec::TABLE_DEFINED: ok = true; ref->errorCode = WaitDropTabRef::IllegalTableState; break; case Tablerec::NOT_DEFINED: ok = true; ref->errorCode = WaitDropTabRef::NoSuchTable; break; case Tablerec::ADD_TABLE_ONGOING: ok = true; ref->errorCode = WaitDropTabRef::IllegalTableState; break; case Tablerec::PREP_DROP_TABLE_ONGOING: case Tablerec::PREP_DROP_TABLE_DONE: // Should have been take care of above ndbrequire(false); } ndbrequire(ok); ref->tableStatus = tabPtr.p->tableStatus; sendSignal(senderRef, GSN_WAIT_DROP_TAB_REF, signal, WaitDropTabRef::SignalLength, JBB); return;}voidDblqh::execDROP_TAB_REQ(Signal* signal){ jamEntry(); DropTabReq* req = (DropTabReq*)signal->getDataPtr(); Uint32 senderRef = req->senderRef; Uint32 senderData = req->senderData; TablerecPtr tabPtr; tabPtr.i = req->tableId; ptrCheckGuard(tabPtr, ctabrecFileSize, tablerec); do { if(req->requestType == DropTabReq::RestartDropTab){ jam(); break; } if(req->requestType == DropTabReq::OnlineDropTab){ jam(); Uint32 errCode = 0; errCode = checkDropTabState(tabPtr.p->tableStatus, GSN_DROP_TAB_REQ); if(errCode != 0){ jam(); DropTabRef* ref = (DropTabRef*)signal->getDataPtrSend(); ref->senderRef = reference(); ref->senderData = senderData; ref->tableId = tabPtr.i; ref->errorCode = errCode; sendSignal(senderRef, GSN_DROP_TAB_REF, signal, DropTabRef::SignalL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -