📄 dbtupgen.cpp
字号:
{ AttrbufrecPtr attrBufPtr; for (attrBufPtr.i = 0; attrBufPtr.i < cnoOfAttrbufrec; attrBufPtr.i++) { refresh_watch_dog(); ptrAss(attrBufPtr, attrbufrec); attrBufPtr.p->attrbuf[ZBUF_NEXT] = attrBufPtr.i + 1; }//for attrBufPtr.i = cnoOfAttrbufrec - 1; ptrAss(attrBufPtr, attrbufrec); attrBufPtr.p->attrbuf[ZBUF_NEXT] = RNIL; cfirstfreeAttrbufrec = 0; cnoFreeAttrbufrec = cnoOfAttrbufrec;}//Dbtup::initializeAttrbufrec()void Dbtup::initializeCheckpointInfoRec() { CheckpointInfoPtr checkpointInfoPtr; for (checkpointInfoPtr.i = 0; checkpointInfoPtr.i < cnoOfLcpRec; checkpointInfoPtr.i++) { ptrAss(checkpointInfoPtr, checkpointInfo); checkpointInfoPtr.p->lcpNextRec = checkpointInfoPtr.i + 1; }//for checkpointInfoPtr.i = cnoOfLcpRec - 1; ptrAss(checkpointInfoPtr, checkpointInfo); checkpointInfoPtr.p->lcpNextRec = RNIL; cfirstfreeLcp = 0;}//Dbtup::initializeCheckpointInfoRec()void Dbtup::initializeDiskBufferSegmentRecord() { DiskBufferSegmentInfoPtr diskBufferSegmentPtr; for (diskBufferSegmentPtr.i = 0; diskBufferSegmentPtr.i < cnoOfConcurrentWriteOp; diskBufferSegmentPtr.i++) { ptrAss(diskBufferSegmentPtr, diskBufferSegmentInfo); diskBufferSegmentPtr.p->pdxNextRec = diskBufferSegmentPtr.i + 1; diskBufferSegmentPtr.p->pdxBuffertype = NOT_INITIALIZED; }//for diskBufferSegmentPtr.i = cnoOfConcurrentWriteOp - 1; ptrAss(diskBufferSegmentPtr, diskBufferSegmentInfo); diskBufferSegmentPtr.p->pdxNextRec = RNIL; cfirstfreePdx = 0;}//Dbtup::initializeDiskBufferSegmentRecord()void Dbtup::initializeFragoperrec() { FragoperrecPtr fragoperPtr; for (fragoperPtr.i = 0; fragoperPtr.i < cnoOfFragoprec; fragoperPtr.i++) { ptrAss(fragoperPtr, fragoperrec); fragoperPtr.p->nextFragoprec = fragoperPtr.i + 1; }//for fragoperPtr.i = cnoOfFragoprec - 1; ptrAss(fragoperPtr, fragoperrec); fragoperPtr.p->nextFragoprec = RNIL; cfirstfreeFragopr = 0;}//Dbtup::initializeFragoperrec()void Dbtup::initializeFragrecord() { FragrecordPtr regFragPtr; for (regFragPtr.i = 0; regFragPtr.i < cnoOfFragrec; regFragPtr.i++) { refresh_watch_dog(); ptrAss(regFragPtr, fragrecord); regFragPtr.p->nextfreefrag = regFragPtr.i + 1; regFragPtr.p->checkpointVersion = RNIL; regFragPtr.p->firstusedOprec = RNIL; regFragPtr.p->lastusedOprec = RNIL; regFragPtr.p->fragStatus = IDLE; }//for regFragPtr.i = cnoOfFragrec - 1; ptrAss(regFragPtr, fragrecord); regFragPtr.p->nextfreefrag = RNIL; cfirstfreefrag = 0;}//Dbtup::initializeFragrecord()void Dbtup::initializeHostBuffer() { Uint32 hostId; cpackedListIndex = 0; for (hostId = 0; hostId < MAX_NODES; hostId++) { hostBuffer[hostId].inPackedList = false; hostBuffer[hostId].noOfPacketsTA = 0; hostBuffer[hostId].packetLenTA = 0; }//for}//Dbtup::initializeHostBuffer()void Dbtup::initializeLocalLogInfo() { LocalLogInfoPtr localLogInfoPtr; for (localLogInfoPtr.i = 0; localLogInfoPtr.i < cnoOfParallellUndoFiles; localLogInfoPtr.i++) { ptrAss(localLogInfoPtr, localLogInfo); localLogInfoPtr.p->lliActiveLcp = 0; localLogInfoPtr.p->lliUndoFileHandle = RNIL; }//for}//Dbtup::initializeLocalLogInfo()void Dbtup::initializeOperationrec() { OperationrecPtr regOpPtr; for (regOpPtr.i = 0; regOpPtr.i < cnoOfOprec; regOpPtr.i++) { refresh_watch_dog(); ptrAss(regOpPtr, operationrec); regOpPtr.p->firstAttrinbufrec = RNIL; regOpPtr.p->lastAttrinbufrec = RNIL; regOpPtr.p->prevOprecInList = RNIL; regOpPtr.p->nextOprecInList = regOpPtr.i + 1; regOpPtr.p->optype = ZREAD; regOpPtr.p->inFragList = ZFALSE; regOpPtr.p->inActiveOpList = ZFALSE;/* FOR ABORT HANDLING BEFORE ANY SUCCESSFUL OPERATION */ regOpPtr.p->transstate = DISCONNECTED; regOpPtr.p->storedProcedureId = ZNIL; regOpPtr.p->prevActiveOp = RNIL; regOpPtr.p->nextActiveOp = RNIL; regOpPtr.p->tupVersion = ZNIL; regOpPtr.p->deleteInsertFlag = 0; }//for regOpPtr.i = cnoOfOprec - 1; ptrAss(regOpPtr, operationrec); regOpPtr.p->nextOprecInList = RNIL; cfirstfreeOprec = 0;}//Dbtup::initializeOperationrec()void Dbtup::initializePendingFileOpenInfoRecord() { PendingFileOpenInfoPtr pendingFileOpenInfoPtr; for (pendingFileOpenInfoPtr.i = 0; pendingFileOpenInfoPtr.i < cnoOfConcurrentOpenOp; pendingFileOpenInfoPtr.i++) { ptrAss(pendingFileOpenInfoPtr, pendingFileOpenInfo); pendingFileOpenInfoPtr.p->pfoNextRec = pendingFileOpenInfoPtr.i + 1; }//for pendingFileOpenInfoPtr.i = cnoOfConcurrentOpenOp - 1; ptrAss(pendingFileOpenInfoPtr, pendingFileOpenInfo); pendingFileOpenInfoPtr.p->pfoNextRec = RNIL; cfirstfreePfo = 0;}//Dbtup::initializePendingFileOpenInfoRecord()void Dbtup::initializeRestartInfoRec() { RestartInfoRecordPtr restartInfoPtr; for (restartInfoPtr.i = 0; restartInfoPtr.i < cnoOfRestartInfoRec; restartInfoPtr.i++) { ptrAss(restartInfoPtr, restartInfoRecord); restartInfoPtr.p->sriNextRec = restartInfoPtr.i + 1; }//for restartInfoPtr.i = cnoOfRestartInfoRec - 1; ptrAss(restartInfoPtr, restartInfoRecord); restartInfoPtr.p->sriNextRec = RNIL; cfirstfreeSri = 0;}//Dbtup::initializeRestartInfoRec()void Dbtup::initializeTablerec() { TablerecPtr regTabPtr; for (regTabPtr.i = 0; regTabPtr.i < cnoOfTablerec; regTabPtr.i++) { ljam(); refresh_watch_dog(); ptrAss(regTabPtr, tablerec); initTab(regTabPtr.p); }//for}//Dbtup::initializeTablerec()voidDbtup::initTab(Tablerec* const regTabPtr){ for (Uint32 i = 0; i < (2 * MAX_FRAG_PER_NODE); i++) { regTabPtr->fragid[i] = RNIL; regTabPtr->fragrec[i] = RNIL; }//for regTabPtr->readFunctionArray = NULL; regTabPtr->updateFunctionArray = NULL; regTabPtr->charsetArray = NULL; regTabPtr->tabDescriptor = RNIL; regTabPtr->attributeGroupDescriptor = RNIL; regTabPtr->readKeyArray = RNIL; regTabPtr->checksumIndicator = false; regTabPtr->GCPIndicator = false; regTabPtr->noOfAttr = 0; regTabPtr->noOfKeyAttr = 0; regTabPtr->noOfNewAttr = 0; regTabPtr->noOfAttributeGroups = 0; regTabPtr->tupheadsize = 0; regTabPtr->tupNullIndex = 0; regTabPtr->tupNullWords = 0; regTabPtr->tupChecksumIndex = 0; regTabPtr->tupGCPIndex = 0; regTabPtr->m_dropTable.tabUserPtr = RNIL; regTabPtr->m_dropTable.tabUserRef = 0; regTabPtr->tableStatus = NOT_DEFINED; // Clear trigger data if (!regTabPtr->afterInsertTriggers.isEmpty()) regTabPtr->afterInsertTriggers.release(); if (!regTabPtr->afterDeleteTriggers.isEmpty()) regTabPtr->afterDeleteTriggers.release(); if (!regTabPtr->afterUpdateTriggers.isEmpty()) regTabPtr->afterUpdateTriggers.release(); if (!regTabPtr->subscriptionInsertTriggers.isEmpty()) regTabPtr->subscriptionInsertTriggers.release(); if (!regTabPtr->subscriptionDeleteTriggers.isEmpty()) regTabPtr->subscriptionDeleteTriggers.release(); if (!regTabPtr->subscriptionUpdateTriggers.isEmpty()) regTabPtr->subscriptionUpdateTriggers.release(); if (!regTabPtr->constraintUpdateTriggers.isEmpty()) regTabPtr->constraintUpdateTriggers.release(); if (!regTabPtr->tuxCustomTriggers.isEmpty()) regTabPtr->tuxCustomTriggers.release();}//Dbtup::initTab()void Dbtup::initializeTabDescr() { TableDescriptorPtr regTabDesPtr; for (Uint32 i = 0; i < 16; i++) { cfreeTdList[i] = RNIL; }//for for (regTabDesPtr.i = 0; regTabDesPtr.i < cnoOfTabDescrRec; regTabDesPtr.i++) { refresh_watch_dog(); ptrAss(regTabDesPtr, tableDescriptor); regTabDesPtr.p->tabDescr = RNIL; }//for freeTabDescr(0, cnoOfTabDescrRec);}//Dbtup::initializeTabDescr()void Dbtup::initializeUndoPage() { UndoPagePtr undoPagep; for (undoPagep.i = 0; undoPagep.i < cnoOfUndoPage; undoPagep.i = undoPagep.i + ZUB_SEGMENT_SIZE) { refresh_watch_dog(); ptrAss(undoPagep, undoPage); undoPagep.p->undoPageWord[ZPAGE_NEXT_POS] = undoPagep.i + ZUB_SEGMENT_SIZE; cnoFreeUndoSeg++; }//for undoPagep.i = cnoOfUndoPage - ZUB_SEGMENT_SIZE; ptrAss(undoPagep, undoPage); undoPagep.p->undoPageWord[ZPAGE_NEXT_POS] = RNIL; cfirstfreeUndoSeg = 0;}//Dbtup::initializeUndoPage()/* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- *//* --------------- CONNECT/DISCONNECT MODULE ---------------------- *//* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- */void Dbtup::execTUPSEIZEREQ(Signal* signal){ OperationrecPtr regOperPtr; ljamEntry(); Uint32 userPtr = signal->theData[0]; BlockReference userRef = signal->theData[1]; if (cfirstfreeOprec != RNIL) { ljam(); seizeOpRec(regOperPtr); } else { ljam(); signal->theData[0] = userPtr; signal->theData[1] = ZGET_OPREC_ERROR; sendSignal(userRef, GSN_TUPSEIZEREF, signal, 2, JBB); return; }//if regOperPtr.p->optype = ZREAD; initOpConnection(regOperPtr.p, 0); regOperPtr.p->userpointer = userPtr; regOperPtr.p->userblockref = userRef; signal->theData[0] = regOperPtr.p->userpointer; signal->theData[1] = regOperPtr.i; sendSignal(userRef, GSN_TUPSEIZECONF, signal, 2, JBB); return;}//Dbtup::execTUPSEIZEREQ()#define printFragment(t){ for(Uint32 i = 0; i < (2 * MAX_FRAG_PER_NODE);i++){\ ndbout_c("table = %d fragid[%d] = %d fragrec[%d] = %d", \ t.i, t.p->fragid[i], i, t.p->fragrec[i]); }}void Dbtup::execTUPRELEASEREQ(Signal* signal) { OperationrecPtr regOperPtr; ljamEntry(); regOperPtr.i = signal->theData[0]; ptrCheckGuard(regOperPtr, cnoOfOprec, operationrec); regOperPtr.p->transstate = DISCONNECTED; regOperPtr.p->nextOprecInList = cfirstfreeOprec; cfirstfreeOprec = regOperPtr.i; signal->theData[0] = regOperPtr.p->userpointer; sendSignal(regOperPtr.p->userblockref, GSN_TUPRELEASECONF, signal, 1, JBB); return;}//Dbtup::execTUPRELEASEREQ()/* ---------------------------------------------------------------- *//* ---------------- FREE_DISK_BUFFER_SEGMENT_RECORD --------------- *//* ---------------------------------------------------------------- *//* *//* THIS ROUTINE DEALLOCATES A DISK SEGMENT AND ITS DATA PAGES *//* *//* INPUT: DISK_BUFFER_SEGMENT_PTR THE DISK SEGMENT *//* *//* -----------------------------------------------------------------*/void Dbtup::freeDiskBufferSegmentRecord(Signal* signal, DiskBufferSegmentInfoPtr dbsiPtr) { switch (dbsiPtr.p->pdxBuffertype) { case UNDO_PAGES: case COMMON_AREA_PAGES: ljam(); freeUndoBufferPages(signal, dbsiPtr); break; case UNDO_RESTART_PAGES: ljam(); dbsiPtr.p->pdxDataPage[0] = dbsiPtr.p->pdxUndoBufferSet[0]; freeUndoBufferPages(signal, dbsiPtr); dbsiPtr.p->pdxDataPage[0] = dbsiPtr.p->pdxUndoBufferSet[1]; freeUndoBufferPages(signal, dbsiPtr); break; default: ndbrequire(false); break; }//switch releaseDiskBufferSegmentRecord(dbsiPtr);}//Dbtup::freeDiskBufferSegmentRecord()/* ---------------------------------------------------------------- *//* -------------------- FREE_UNDO_BUFFER_PAGES -------------------- *//* ---------------------------------------------------------------- *//* *//* THIS ROUTINE DEALLOCATES A SEGMENT OF UNDO PAGES *//* *//* INPUT: UNDO_PAGEP POINTER TO FIRST PAGE IN SEGMENT *//* *//* -----------------------------------------------------------------*/void Dbtup::freeUndoBufferPages(Signal* signal, DiskBufferSegmentInfoPtr dbsiPtr) { UndoPagePtr undoPagePtr; undoPagePtr.i = dbsiPtr.p->pdxDataPage[0]; ptrCheckGuard(undoPagePtr, cnoOfUndoPage, undoPage); undoPagePtr.p->undoPageWord[ZPAGE_NEXT_POS] = cfirstfreeUndoSeg; cfirstfreeUndoSeg = undoPagePtr.i; cnoFreeUndoSeg++; if (cnoFreeUndoSeg == ZMIN_PAGE_LIMIT_TUP_COMMITREQ) { EXECUTE_DIRECT(DBLQH, GSN_TUP_COM_UNBLOCK, signal, 1); ljamEntry(); }//if}//Dbtup::freeUndoBufferPages()void Dbtup::releaseCheckpointInfoRecord(CheckpointInfoPtr ciPtr) { ciPtr.p->lcpNextRec = cfirstfreeLcp; cfirstfreeLcp = ciPtr.i;}//Dbtup::releaseCheckpointInfoRecord()void Dbtup::releaseDiskBufferSegmentRecord(DiskBufferSegmentInfoPtr dbsiPtr) { dbsiPtr.p->pdxNextRec = cfirstfreePdx; cfirstfreePdx = dbsiPtr.i;}//Dbtup::releaseDiskBufferSegmentRecord()void Dbtup::releaseFragrec(FragrecordPtr regFragPtr) { regFragPtr.p->nextfreefrag = cfirstfreefrag; cfirstfreefrag = regFragPtr.i;}//Dbtup::releaseFragrec()void Dbtup::releasePendingFileOpenInfoRecord(PendingFileOpenInfoPtr pfoPtr) { pfoPtr.p->pfoNextRec = cfirstfreePfo; cfirstfreePfo = pfoPtr.i;}//Dbtup::releasePendingFileOpenInfoRecord()void Dbtup::releaseRestartInfoRecord(RestartInfoRecordPtr riPtr) { riPtr.p->sriNextRec = cfirstfreeSri; cfirstfreeSri = riPtr.i;}//Dbtup::releaseRestartInfoRecord()void Dbtup::seizeCheckpointInfoRecord(CheckpointInfoPtr& ciPtr) { ciPtr.i = cfirstfreeLcp; ptrCheckGuard(ciPtr, cnoOfLcpRec, checkpointInfo); cfirstfreeLcp = ciPtr.p->lcpNextRec; ciPtr.p->lcpNextRec = RNIL;}//Dbtup::seizeCheckpointInfoRecord()void Dbtup::seizeDiskBufferSegmentRecord(DiskBufferSegmentInfoPtr& dbsiPtr) { dbsiPtr.i = cfirstfreePdx; ptrCheckGuard(dbsiPtr, cnoOfConcurrentWriteOp, diskBufferSegmentInfo); cfirstfreePdx = dbsiPtr.p->pdxNextRec; dbsiPtr.p->pdxNextRec = RNIL; for (Uint32 i = 0; i < 16; i++) { dbsiPtr.p->pdxDataPage[i] = RNIL; }//for dbsiPtr.p->pdxCheckpointInfoP = RNIL; dbsiPtr.p->pdxRestartInfoP = RNIL; dbsiPtr.p->pdxLocalLogInfoP = RNIL; dbsiPtr.p->pdxFilePage = 0; dbsiPtr.p->pdxNumDataPages = 0;}//Dbtup::seizeDiskBufferSegmentRecord()void Dbtup::seizeOpRec(OperationrecPtr& regOperPtr) { regOperPtr.i = cfirstfreeOprec; ptrCheckGuard(regOperPtr, cnoOfOprec, operationrec); cfirstfreeOprec = regOperPtr.p->nextOprecInList;}//Dbtup::seizeOpRec()void Dbtup::seizePendingFileOpenInfoRecord(PendingFileOpenInfoPtr& pfoiPtr) { pfoiPtr.i = cfirstfreePfo; ptrCheckGuard(pfoiPtr, cnoOfConcurrentOpenOp, pendingFileOpenInfo); cfirstfreePfo = pfoiPtr.p->pfoNextRec; pfoiPtr.p->pfoNextRec = RNIL;}//Dbtup::seizePendingFileOpenInfoRecord()void Dbtup::execSET_VAR_REQ(Signal* signal) {#if 0 SetVarReq* const setVarReq = (SetVarReq*)signal->getDataPtrSend(); ConfigParamId var = setVarReq->variable(); int val = setVarReq->value(); switch (var) { case NoOfDiskPagesToDiskAfterRestartTUP: clblPagesPerTick = val; sendSignal(CMVMI_REF, GSN_SET_VAR_CONF, signal, 1, JBB); break; case NoOfDiskPagesToDiskDuringRestartTUP: // Valid only during start so value not set. sendSignal(CMVMI_REF, GSN_SET_VAR_CONF, signal, 1, JBB); break; default: sendSignal(CMVMI_REF, GSN_SET_VAR_REF, signal, 1, JBB); } // switch#endif}//execSET_VAR_REQ()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -