📄 backup.cpp
字号:
{ 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);}/***************************************************************************** * * 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->noOfBytes = ptr.p->noOfBytes; rep->noOfRecords = ptr.p->noOfRecords; 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] = ptr.p->noOfBytes; signal->theData[6] = ptr.p->noOfRecords; signal->theData[7] = ptr.p->noOfLogBytes; signal->theData[8] = ptr.p->noOfLogRecords; ptr.p->nodes.copyto(NdbNodeBitmask::Size, signal->theData+9); sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 9+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 Backup * *****************************************************************************/voidBackup::defineBackupRef(Signal* signal, BackupRecordPtr ptr, Uint32 errCode){ ptr.p->m_gsn = GSN_DEFINE_BACKUP_REF; ptr.p->setErrorCode(errCode); ndbrequire(ptr.p->errorCode != 0); DefineBackupRef* ref = (DefineBackupRef*)signal->getDataPtrSend(); ref->backupId = ptr.p->backupId; ref->backupPtr = ptr.i; ref->errorCode = ptr.p->errorCode; ref->nodeId = getOwnNodeId(); sendSignal(ptr.p->masterRef, GSN_DEFINE_BACKUP_REF, signal, DefineBackupRef::SignalLength, JBB);}voidBackup::execDEFINE_BACKUP_REQ(Signal* signal){ jamEntry(); DefineBackupReq* req = (DefineBackupReq*)signal->getDataPtr(); BackupRecordPtr ptr; const Uint32 ptrI = req->backupPtr; const Uint32 backupId = req->backupId; const BlockReference senderRef = req->senderRef; if(senderRef == reference()){ /** * Signal sent from myself -> record already seized */ jam(); c_backupPool.getPtr(ptr, ptrI); } else { // from other node jam();#ifdef DEBUG_ABORT dumpUsedResources();#endif if(!c_backups.seizeId(ptr, ptrI)) { jam(); ndbrequire(false); // If master has succeeded slave should succed }//if }//if CRASH_INSERTION((10014)); ptr.p->m_gsn = GSN_DEFINE_BACKUP_REQ; ptr.p->slaveState.forceState(INITIAL); ptr.p->slaveState.setState(DEFINING); ptr.p->errorCode = 0; ptr.p->clientRef = req->clientRef; ptr.p->clientData = req->clientData; if(senderRef == reference()) ptr.p->flags = req->flags; else ptr.p->flags = req->flags & ~((Uint32)0x3); /* remove waitCompleted flags * as non master should never * reply */ ptr.p->masterRef = senderRef; ptr.p->nodes = req->nodes; ptr.p->backupId = backupId; ptr.p->backupKey[0] = req->backupKey[0]; ptr.p->backupKey[1] = req->backupKey[1]; ptr.p->backupDataLen = req->backupDataLen; ptr.p->masterData.dropTrig.tableId = RNIL; ptr.p->masterData.alterTrig.tableId = RNIL; ptr.p->masterData.errorCode = 0; ptr.p->noOfBytes = 0; ptr.p->noOfRecords = 0; ptr.p->noOfLogBytes = 0; ptr.p->noOfLogRecords = 0; ptr.p->currGCP = 0; /** * Allocate files */ BackupFilePtr files[3]; Uint32 noOfPages[] = { NO_OF_PAGES_META_FILE, 2, // 32k 0 // 3M }; const Uint32 maxInsert[] = { 2048, // Temporarily to solve TR515 4096, // 4k 16*3000, // Max 16 tuples }; Uint32 minWrite[] = { 8192, 8192, 32768 }; Uint32 maxWrite[] = { 8192, 8192, 32768 }; minWrite[1] = c_defaults.m_minWriteSize; maxWrite[1] = c_defaults.m_maxWriteSize; noOfPages[1] = (c_defaults.m_logBufferSize + sizeof(Page32) - 1) / sizeof(Page32); minWrite[2] = c_defaults.m_minWriteSize; maxWrite[2] = c_defaults.m_maxWriteSize; noOfPages[2] = (c_defaults.m_dataBufferSize + sizeof(Page32) - 1) / sizeof(Page32); for(Uint32 i = 0; i<3; i++) { jam(); if(!ptr.p->files.seize(files[i])) { jam(); defineBackupRef(signal, ptr, DefineBackupRef::FailedToAllocateFileRecord); return; }//if files[i].p->tableId = RNIL; files[i].p->backupPtr = ptr.i; files[i].p->filePointer = RNIL; files[i].p->fileClosing = 0; files[i].p->fileOpened = 0; files[i].p->fileRunning = 0; files[i].p->scanRunning = 0; files[i].p->errorCode = 0; if(files[i].p->pages.seize(noOfPages[i]) == false) { jam(); DEBUG_OUT("Failed to seize " << noOfPages[i] << " pages"); defineBackupRef(signal, ptr, DefineBackupRef::FailedToAllocateBuffers); return; }//if Page32Ptr pagePtr; files[i].p->pages.getPtr(pagePtr, 0); const char * msg = files[i].p-> operation.dataBuffer.setup((Uint32*)pagePtr.p, noOfPages[i] * (sizeof(Page32) >> 2), 128, minWrite[i] >> 2, maxWrite[i] >> 2, maxInsert[i]); if(msg != 0) { jam(); defineBackupRef(signal, ptr, DefineBackupRef::FailedToSetupFsBuffers); return; }//if
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -