📄 backup.cpp
字号:
CRASH_INSERTION((10010)); BackupFragmentConf * conf = (BackupFragmentConf*)signal->getDataPtr(); const Uint32 ptrI = conf->backupPtr; //const Uint32 backupId = conf->backupId; const Uint32 tableId = conf->tableId; const Uint32 fragmentNo = conf->fragmentNo; const Uint32 nodeId = refToNode(signal->senderBlockRef()); const Uint64 noOfBytes = conf->noOfBytesLow + (((Uint64)conf->noOfBytesHigh) << 32); const Uint64 noOfRecords = conf->noOfRecordsLow + (((Uint64)conf->noOfRecordsHigh) << 32); BackupRecordPtr ptr; c_backupPool.getPtr(ptr, ptrI); ptr.p->noOfBytes += noOfBytes; ptr.p->noOfRecords += noOfRecords; ptr.p->masterData.sendCounter--; TablePtr tabPtr; ndbrequire(findTable(ptr, tabPtr, tableId)); tabPtr.p->noOfRecords += noOfRecords; FragmentPtr fragPtr; tabPtr.p->fragments.getPtr(fragPtr, fragmentNo); fragPtr.p->noOfRecords = noOfRecords; ndbrequire(fragPtr.p->scanned == 0); ndbrequire(fragPtr.p->scanning == 1); ndbrequire(fragPtr.p->node == nodeId); fragPtr.p->scanned = 1; fragPtr.p->scanning = 0; if (ERROR_INSERTED(10028)) { ptr.p->errorCode = 328; } if(ptr.p->checkError()) { if(ptr.p->masterData.sendCounter.done()) { jam(); masterAbort(signal, ptr); return; }//if } else { NodeBitmask nodes = ptr.p->nodes; nodes.clear(getOwnNodeId()); if (!nodes.isclear()) { BackupFragmentCompleteRep *rep = (BackupFragmentCompleteRep*)signal->getDataPtrSend(); rep->backupId = ptr.p->backupId; rep->backupPtr = ptr.i; rep->tableId = tableId; rep->fragmentNo = fragmentNo; rep->noOfTableRowsLow = (Uint32)(tabPtr.p->noOfRecords & 0xFFFFFFFF); rep->noOfTableRowsHigh = (Uint32)(tabPtr.p->noOfRecords >> 32); rep->noOfFragmentRowsLow = (Uint32)(noOfRecords & 0xFFFFFFFF); rep->noOfFragmentRowsHigh = (Uint32)(noOfRecords >> 32); NodeReceiverGroup rg(BACKUP, ptr.p->nodes); sendSignal(rg, GSN_BACKUP_FRAGMENT_COMPLETE_REP, signal, BackupFragmentCompleteRep::SignalLength, JBB); } nextFragment(signal, ptr); }}voidBackup::execBACKUP_FRAGMENT_REF(Signal* signal){ jamEntry(); CRASH_INSERTION((10011)); BackupFragmentRef * ref = (BackupFragmentRef*)signal->getDataPtr(); const Uint32 ptrI = ref->backupPtr; //const Uint32 backupId = ref->backupId; const Uint32 nodeId = ref->nodeId; BackupRecordPtr ptr; c_backupPool.getPtr(ptr, ptrI); TablePtr tabPtr; ptr.p->tables.first(tabPtr); for(; tabPtr.i != RNIL; ptr.p->tables.next(tabPtr)) { jam(); FragmentPtr fragPtr; Array<Fragment> & frags = tabPtr.p->fragments; const Uint32 fragCount = frags.getSize(); for(Uint32 i = 0; i<fragCount; i++) { jam(); tabPtr.p->fragments.getPtr(fragPtr, i); if(fragPtr.p->scanning != 0 && nodeId == fragPtr.p->node) { jam(); ndbrequire(fragPtr.p->scanned == 0); fragPtr.p->scanned = 1; fragPtr.p->scanning = 0; goto done; } } } goto err;done: ptr.p->masterData.sendCounter--; ptr.p->setErrorCode(ref->errorCode); if(ptr.p->masterData.sendCounter.done()) { jam(); masterAbort(signal, ptr); return; }//iferr: AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend(); ord->backupId = ptr.p->backupId; ord->backupPtr = ptr.i; ord->requestType = AbortBackupOrd::LogBufferFull; ord->senderData= ptr.i; execABORT_BACKUP_ORD(signal);}voidBackup::execBACKUP_FRAGMENT_COMPLETE_REP(Signal* signal){ jamEntry(); BackupFragmentCompleteRep * rep = (BackupFragmentCompleteRep*)signal->getDataPtr(); BackupRecordPtr ptr; c_backupPool.getPtr(ptr, rep->backupPtr); TablePtr tabPtr; ndbrequire(findTable(ptr, tabPtr, rep->tableId)); tabPtr.p->noOfRecords = rep->noOfTableRowsLow + (((Uint64)rep->noOfTableRowsHigh) << 32); FragmentPtr fragPtr; tabPtr.p->fragments.getPtr(fragPtr, rep->fragmentNo); fragPtr.p->noOfRecords = rep->noOfFragmentRowsLow + (((Uint64)rep->noOfFragmentRowsHigh) << 32);}/***************************************************************************** * * Master functionallity - Drop triggers * *****************************************************************************/voidBackup::sendDropTrig(Signal* signal, BackupRecordPtr ptr){ TablePtr tabPtr; if (ptr.p->masterData.dropTrig.tableId == RNIL) { jam(); ptr.p->tables.first(tabPtr); } else { jam(); ndbrequire(findTable(ptr, tabPtr, ptr.p->masterData.dropTrig.tableId)); ptr.p->tables.next(tabPtr); }//if if (tabPtr.i != RNIL) { jam(); sendDropTrig(signal, ptr, tabPtr); } else { jam(); ptr.p->masterData.dropTrig.tableId = RNIL; sendStopBackup(signal, ptr); }//if}voidBackup::sendDropTrig(Signal* signal, BackupRecordPtr ptr, TablePtr tabPtr){ jam(); DropTrigReq * req = (DropTrigReq *)signal->getDataPtrSend(); ptr.p->masterData.gsn = GSN_DROP_TRIG_REQ; ptr.p->masterData.sendCounter = 0; req->setConnectionPtr(ptr.i); req->setUserRef(reference()); // Sending to myself req->setRequestType(DropTrigReq::RT_USER); req->setIndexId(RNIL); req->setTriggerInfo(0); // not used on DROP via DICT char triggerName[MAX_TAB_NAME_SIZE]; Uint32 nameBuffer[2 + ((MAX_TAB_NAME_SIZE + 3) >> 2)]; // SP string LinearWriter w(nameBuffer, sizeof(nameBuffer) >> 2); LinearSectionPtr lsPtr[3]; ptr.p->masterData.dropTrig.tableId = tabPtr.p->tableId; req->setTableId(tabPtr.p->tableId); for (int i = 0; i < 3; i++) { Uint32 id = tabPtr.p->triggerIds[i]; req->setTriggerId(id); if (id != ILLEGAL_TRIGGER_ID) { sendSignal(DBDICT_REF, GSN_DROP_TRIG_REQ, signal, DropTrigReq::SignalLength, JBB); } else { BaseString::snprintf(triggerName, sizeof(triggerName), triggerNameFormat[i], ptr.p->backupId, tabPtr.p->tableId); w.reset(); w.add(CreateTrigReq::TriggerNameKey, triggerName); lsPtr[0].p = nameBuffer; lsPtr[0].sz = w.getWordsUsed(); sendSignal(DBDICT_REF, GSN_DROP_TRIG_REQ, signal, DropTrigReq::SignalLength, JBB, lsPtr, 1); } ptr.p->masterData.sendCounter ++; }}voidBackup::execDROP_TRIG_REF(Signal* signal){ jamEntry(); DropTrigRef* ref = (DropTrigRef*)signal->getDataPtr(); const Uint32 ptrI = ref->getConnectionPtr(); BackupRecordPtr ptr; c_backupPool.getPtr(ptr, ptrI); //ndbrequire(ref->getErrorCode() == DropTrigRef::NoSuchTrigger); dropTrigReply(signal, ptr);}voidBackup::execDROP_TRIG_CONF(Signal* signal){ jamEntry(); DropTrigConf* conf = (DropTrigConf*)signal->getDataPtr(); const Uint32 ptrI = conf->getConnectionPtr(); BackupRecordPtr ptr; c_backupPool.getPtr(ptr, ptrI); dropTrigReply(signal, ptr);}voidBackup::dropTrigReply(Signal* signal, BackupRecordPtr ptr){ CRASH_INSERTION((10012)); ndbrequire(ptr.p->masterRef == reference()); ndbrequire(ptr.p->masterData.gsn == GSN_DROP_TRIG_REQ); ndbrequire(ptr.p->masterData.sendCounter.done() == false); ptr.p->masterData.sendCounter--; if(ptr.p->masterData.sendCounter.done() == false){ jam(); return; }//if sendDropTrig(signal, ptr); // recursive next}/***************************************************************************** * * Master functionallity - Stop backup * *****************************************************************************/voidBackup::execSTOP_BACKUP_REF(Signal* signal){ jamEntry(); StopBackupRef* ref = (StopBackupRef*)signal->getDataPtr(); const Uint32 ptrI = ref->backupPtr; //const Uint32 backupId = ref->backupId; const Uint32 nodeId = ref->nodeId; BackupRecordPtr ptr; c_backupPool.getPtr(ptr, ptrI); ptr.p->setErrorCode(ref->errorCode); stopBackupReply(signal, ptr, nodeId);}voidBackup::sendStopBackup(Signal* signal, BackupRecordPtr ptr){ jam(); StopBackupReq* stop = (StopBackupReq*)signal->getDataPtrSend(); stop->backupPtr = ptr.i; stop->backupId = ptr.p->backupId; stop->startGCP = ptr.p->startGCP; stop->stopGCP = ptr.p->stopGCP; ptr.p->masterData.gsn = GSN_STOP_BACKUP_REQ; ptr.p->masterData.sendCounter = ptr.p->nodes; NodeReceiverGroup rg(BACKUP, ptr.p->nodes); sendSignal(rg, GSN_STOP_BACKUP_REQ, signal, StopBackupReq::SignalLength, JBB);}voidBackup::execSTOP_BACKUP_CONF(Signal* signal){ jamEntry(); StopBackupConf* conf = (StopBackupConf*)signal->getDataPtr(); const Uint32 ptrI = conf->backupPtr; //const Uint32 backupId = conf->backupId; const Uint32 nodeId = refToNode(signal->senderBlockRef()); BackupRecordPtr ptr; c_backupPool.getPtr(ptr, ptrI); ptr.p->noOfLogBytes += conf->noOfLogBytes; ptr.p->noOfLogRecords += conf->noOfLogRecords; stopBackupReply(signal, ptr, nodeId);}voidBackup::stopBackupReply(Signal* signal, BackupRecordPtr ptr, Uint32 nodeId){ CRASH_INSERTION((10013)); if (!haveAllSignals(ptr, GSN_STOP_BACKUP_REQ, nodeId)) { jam(); return; } sendAbortBackupOrd(signal, ptr, AbortBackupOrd::BackupComplete); if(!ptr.p->checkError()) { if (SEND_BACKUP_COMPLETED_FLAG(ptr.p->flags)) { BackupCompleteRep * rep = (BackupCompleteRep*)signal->getDataPtrSend(); rep->backupId = ptr.p->backupId; rep->senderData = ptr.p->clientData; rep->startGCP = ptr.p->startGCP; rep->stopGCP = ptr.p->stopGCP; rep->noOfBytesLow = (Uint32)(ptr.p->noOfBytes & 0xFFFFFFFF); rep->noOfRecordsLow = (Uint32)(ptr.p->noOfRecords & 0xFFFFFFFF); rep->noOfBytesHigh = (Uint32)(ptr.p->noOfBytes >> 32); rep->noOfRecordsHigh = (Uint32)(ptr.p->noOfRecords >> 32); rep->noOfLogBytes = ptr.p->noOfLogBytes; rep->noOfLogRecords = ptr.p->noOfLogRecords; rep->nodes = ptr.p->nodes; sendSignal(ptr.p->clientRef, GSN_BACKUP_COMPLETE_REP, signal, BackupCompleteRep::SignalLength, JBB); } signal->theData[0] = NDB_LE_BackupCompleted; signal->theData[1] = ptr.p->clientRef; signal->theData[2] = ptr.p->backupId; signal->theData[3] = ptr.p->startGCP; signal->theData[4] = ptr.p->stopGCP; signal->theData[5] = (Uint32)(ptr.p->noOfBytes & 0xFFFFFFFF); signal->theData[6] = (Uint32)(ptr.p->noOfRecords & 0xFFFFFFFF); signal->theData[7] = ptr.p->noOfLogBytes; signal->theData[8] = ptr.p->noOfLogRecords; ptr.p->nodes.copyto(NdbNodeBitmask::Size, signal->theData+9); signal->theData[9+NdbNodeBitmask::Size] = (Uint32)(ptr.p->noOfBytes >> 32); signal->theData[10+NdbNodeBitmask::Size] = (Uint32)(ptr.p->noOfRecords >> 32); sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 11+NdbNodeBitmask::Size, JBB); } else { masterAbort(signal, ptr); }}/***************************************************************************** * * Master functionallity - Abort backup * *****************************************************************************/voidBackup::masterAbort(Signal* signal, BackupRecordPtr ptr){ jam();#ifdef DEBUG_ABORT ndbout_c("************ masterAbort");#endif if(ptr.p->masterData.errorCode != 0) { jam(); return; } if (SEND_BACKUP_COMPLETED_FLAG(ptr.p->flags)) { BackupAbortRep* rep = (BackupAbortRep*)signal->getDataPtrSend(); rep->backupId = ptr.p->backupId; rep->senderData = ptr.p->clientData; rep->reason = ptr.p->errorCode; sendSignal(ptr.p->clientRef, GSN_BACKUP_ABORT_REP, signal, BackupAbortRep::SignalLength, JBB); } signal->theData[0] = NDB_LE_BackupAborted; signal->theData[1] = ptr.p->clientRef; signal->theData[2] = ptr.p->backupId; signal->theData[3] = ptr.p->errorCode; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 4, JBB); ndbrequire(ptr.p->errorCode); ptr.p->masterData.errorCode = ptr.p->errorCode; AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend(); ord->backupId = ptr.p->backupId; ord->backupPtr = ptr.i; ord->senderData= ptr.i; NodeReceiverGroup rg(BACKUP, ptr.p->nodes); switch(ptr.p->masterData.gsn){ case GSN_DEFINE_BACKUP_REQ: ord->requestType = AbortBackupOrd::BackupFailure; sendSignal(rg, GSN_ABORT_BACKUP_ORD, signal, AbortBackupOrd::SignalLength, JBB); return; case GSN_CREATE_TRIG_REQ: case GSN_START_BACKUP_REQ: case GSN_ALTER_TRIG_REQ: case GSN_WAIT_GCP_REQ: case GSN_BACKUP_FRAGMENT_REQ: jam(); ptr.p->stopGCP= ptr.p->startGCP + 1; sendDropTrig(signal, ptr); // dropping due to error return; case GSN_UTIL_SEQUENCE_REQ: case GSN_UTIL_LOCK_REQ: case GSN_DROP_TRIG_REQ: ndbrequire(false); return; case GSN_STOP_BACKUP_REQ: return; }}voidBackup::abort_scan(Signal * signal, BackupRecordPtr ptr){ AbortBackupOrd *ord = (AbortBackupOrd*)signal->getDataPtrSend(); ord->backupId = ptr.p->backupId; ord->backupPtr = ptr.i; ord->senderData= ptr.i; ord->requestType = AbortBackupOrd::AbortScan; TablePtr tabPtr; ptr.p->tables.first(tabPtr); for(; tabPtr.i != RNIL; ptr.p->tables.next(tabPtr)) { jam(); FragmentPtr fragPtr; Array<Fragment> & frags = tabPtr.p->fragments; const Uint32 fragCount = frags.getSize(); for(Uint32 i = 0; i<fragCount; i++) { jam(); tabPtr.p->fragments.getPtr(fragPtr, i); const Uint32 nodeId = fragPtr.p->node; if(fragPtr.p->scanning != 0 && ptr.p->nodes.get(nodeId)) { jam(); const BlockReference ref = numberToRef(BACKUP, nodeId); sendSignal(ref, GSN_ABORT_BACKUP_ORD, signal, AbortBackupOrd::SignalLength, JBB); } } }}/***************************************************************************** * * Slave functionallity: Define B
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -