📄 backup.cpp
字号:
p = 'G'; break; default: p = 0; } char str[2]; str[0] = p; str[1] = 0; Uint32 tmp = (val.val + (loop >> 1)) / loop;#if 1 if(p > 0) out << tmp << str; else out << tmp;#else out << val.val;#endif return out;}voidBackup::execBACKUP_CONF(Signal* signal){ jamEntry(); BackupConf * conf = (BackupConf*)signal->getDataPtr(); ndbout_c("Backup %d has started", conf->backupId);}voidBackup::execBACKUP_REF(Signal* signal){ jamEntry(); BackupRef * ref = (BackupRef*)signal->getDataPtr(); ndbout_c("Backup (%d) has NOT started %d", ref->senderData, ref->errorCode);}voidBackup::execBACKUP_COMPLETE_REP(Signal* signal){ jamEntry(); BackupCompleteRep* rep = (BackupCompleteRep*)signal->getDataPtr(); startTime = NdbTick_CurrentMillisecond() - startTime; ndbout_c("Backup %d has completed", rep->backupId); const Uint32 bytes = rep->noOfBytes; const Uint32 records = rep->noOfRecords; Number rps = xps(records, startTime); Number bps = xps(bytes, startTime); ndbout << " Data [ " << Number(records) << " rows " << Number(bytes) << " bytes " << startTime << " ms ] " << " => " << rps << " row/s & " << bps << "b/s" << endl; bps = xps(rep->noOfLogBytes, startTime); rps = xps(rep->noOfLogRecords, startTime); ndbout << " Log [ " << Number(rep->noOfLogRecords) << " log records " << Number(rep->noOfLogBytes) << " bytes " << startTime << " ms ] " << " => " << rps << " records/s & " << bps << "b/s" << endl;}voidBackup::execBACKUP_ABORT_REP(Signal* signal){ jamEntry(); BackupAbortRep* rep = (BackupAbortRep*)signal->getDataPtr(); ndbout_c("Backup %d has been aborted %d", rep->backupId, rep->reason);}const TriggerEvent::Value triggerEventValues[] = { TriggerEvent::TE_INSERT, TriggerEvent::TE_UPDATE, TriggerEvent::TE_DELETE};const char* triggerNameFormat[] = { "NDB$BACKUP_%d_%d_INSERT", "NDB$BACKUP_%d_%d_UPDATE", "NDB$BACKUP_%d_%d_DELETE"};const Backup::State Backup::validSlaveTransitions[] = { INITIAL, DEFINING, DEFINING, DEFINED, DEFINED, STARTED, STARTED, STARTED, // Several START_BACKUP_REQ is sent STARTED, SCANNING, SCANNING, STARTED, STARTED, STOPPING, STOPPING, CLEANING, CLEANING, INITIAL, INITIAL, ABORTING, // Node fail DEFINING, ABORTING, DEFINED, ABORTING, STARTED, ABORTING, SCANNING, ABORTING, STOPPING, ABORTING, CLEANING, ABORTING, // Node fail w/ master takeover ABORTING, ABORTING, // Slave who initiates ABORT should have this transition ABORTING, INITIAL, INITIAL, INITIAL};const Uint32Backup::validSlaveTransitionsCount = sizeof(Backup::validSlaveTransitions) / sizeof(Backup::State);voidBackup::CompoundState::setState(State newState){ bool found = false; const State currState = state; for(unsigned i = 0; i<noOfValidTransitions; i+= 2) { jam(); if(validTransitions[i] == currState && validTransitions[i+1] == newState){ jam(); found = true; break; } } //ndbrequire(found); if (newState == INITIAL) abortState = INITIAL; if(newState == ABORTING && currState != ABORTING) { jam(); abortState = currState; } state = newState;#ifdef DEBUG_ABORT if (newState != currState) { ndbout_c("%u: Old state = %u, new state = %u, abort state = %u", id, currState, newState, abortState); }#endif}voidBackup::CompoundState::forceState(State newState){ const State currState = state; if (newState == INITIAL) abortState = INITIAL; if(newState == ABORTING && currState != ABORTING) { jam(); abortState = currState; } state = newState;#ifdef DEBUG_ABORT if (newState != currState) { ndbout_c("%u: FORCE: Old state = %u, new state = %u, abort state = %u", id, currState, newState, abortState); }#endif}Backup::Table::Table(ArrayPool<Attribute> & ah, ArrayPool<Fragment> & fh) : attributes(ah), fragments(fh){ triggerIds[0] = ILLEGAL_TRIGGER_ID; triggerIds[1] = ILLEGAL_TRIGGER_ID; triggerIds[2] = ILLEGAL_TRIGGER_ID; triggerAllocated[0] = false; triggerAllocated[1] = false; triggerAllocated[2] = false;}/***************************************************************************** * * Node state handling * *****************************************************************************/voidBackup::execNODE_FAILREP(Signal* signal){ jamEntry(); NodeFailRep * rep = (NodeFailRep*)signal->getDataPtr(); bool doStuff = false; /* Start by saving important signal data which will be destroyed before the process is completed. */ NodeId new_master_node_id = rep->masterNodeId; Uint32 theFailedNodes[NodeBitmask::Size]; for (Uint32 i = 0; i < NodeBitmask::Size; i++) theFailedNodes[i] = rep->theNodes[i]; c_masterNodeId = new_master_node_id; NodePtr nodePtr; for(c_nodes.first(nodePtr); nodePtr.i != RNIL; c_nodes.next(nodePtr)) { jam(); if(NodeBitmask::get(theFailedNodes, nodePtr.p->nodeId)){ if(nodePtr.p->alive){ jam(); ndbrequire(c_aliveNodes.get(nodePtr.p->nodeId)); doStuff = true; } else { jam(); ndbrequire(!c_aliveNodes.get(nodePtr.p->nodeId)); }//if nodePtr.p->alive = 0; c_aliveNodes.clear(nodePtr.p->nodeId); }//if }//for if(!doStuff){ jam(); return; }//if #ifdef DEBUG_ABORT ndbout_c("****************** Node fail rep ******************");#endif NodeId newCoordinator = c_masterNodeId; BackupRecordPtr ptr; for(c_backups.first(ptr); ptr.i != RNIL; c_backups.next(ptr)) { jam(); checkNodeFail(signal, ptr, newCoordinator, theFailedNodes); }}boolBackup::verifyNodesAlive(BackupRecordPtr ptr, const NdbNodeBitmask& aNodeBitMask){ Uint32 version = getNodeInfo(getOwnNodeId()).m_version; for (Uint32 i = 0; i < MAX_NDB_NODES; i++) { jam(); if(aNodeBitMask.get(i)) { if(!c_aliveNodes.get(i)){ jam(); ptr.p->setErrorCode(AbortBackupOrd::BackupFailureDueToNodeFail); return false; }//if if(getNodeInfo(i).m_version != version) { jam(); ptr.p->setErrorCode(AbortBackupOrd::IncompatibleVersions); return false; } }//if }//for return true;}voidBackup::checkNodeFail(Signal* signal, BackupRecordPtr ptr, NodeId newCoord, Uint32 theFailedNodes[NodeBitmask::Size]){ NdbNodeBitmask mask; mask.assign(2, theFailedNodes); /* Update ptr.p->nodes to be up to date with current alive nodes */ NodePtr nodePtr; bool found = false; for(c_nodes.first(nodePtr); nodePtr.i != RNIL; c_nodes.next(nodePtr)) { jam(); if(NodeBitmask::get(theFailedNodes, nodePtr.p->nodeId)) { jam(); if (ptr.p->nodes.get(nodePtr.p->nodeId)) { jam(); ptr.p->nodes.clear(nodePtr.p->nodeId); found = true; } }//if }//for if(!found) { jam(); return; // failed node is not part of backup process, safe to continue } if(mask.get(refToNode(ptr.p->masterRef))) { /** * Master died...abort */ ptr.p->masterRef = reference(); ptr.p->nodes.clear(); ptr.p->nodes.set(getOwnNodeId()); ptr.p->setErrorCode(AbortBackupOrd::BackupFailureDueToNodeFail); switch(ptr.p->m_gsn){ case GSN_DEFINE_BACKUP_REQ: case GSN_START_BACKUP_REQ: case GSN_BACKUP_FRAGMENT_REQ: case GSN_STOP_BACKUP_REQ: // I'm currently processing...reply to self and abort... ptr.p->masterData.gsn = ptr.p->m_gsn; ptr.p->masterData.sendCounter = ptr.p->nodes; return; case GSN_DEFINE_BACKUP_REF: case GSN_DEFINE_BACKUP_CONF: case GSN_START_BACKUP_REF: case GSN_START_BACKUP_CONF: case GSN_BACKUP_FRAGMENT_REF: case GSN_BACKUP_FRAGMENT_CONF: case GSN_STOP_BACKUP_REF: case GSN_STOP_BACKUP_CONF: ptr.p->masterData.gsn = GSN_DEFINE_BACKUP_REQ; masterAbort(signal, ptr); return; case GSN_ABORT_BACKUP_ORD: // Already aborting return; } } else if (newCoord == getOwnNodeId()) { /** * I'm master for this backup */ jam(); CRASH_INSERTION((10001));#ifdef DEBUG_ABORT ndbout_c("**** Master: Node failed: Master id = %u", refToNode(ptr.p->masterRef));#endif Uint32 gsn, len, pos; ptr.p->nodes.bitANDC(mask); switch(ptr.p->masterData.gsn){ case GSN_DEFINE_BACKUP_REQ: { DefineBackupRef * ref = (DefineBackupRef*)signal->getDataPtr(); ref->backupPtr = ptr.i; ref->backupId = ptr.p->backupId; ref->errorCode = AbortBackupOrd::BackupFailureDueToNodeFail; gsn= GSN_DEFINE_BACKUP_REF; len= DefineBackupRef::SignalLength; pos= &ref->nodeId - signal->getDataPtr(); break; } case GSN_START_BACKUP_REQ: { StartBackupRef * ref = (StartBackupRef*)signal->getDataPtr(); ref->backupPtr = ptr.i; ref->backupId = ptr.p->backupId; ref->errorCode = AbortBackupOrd::BackupFailureDueToNodeFail; ref->signalNo = ptr.p->masterData.startBackup.signalNo; gsn= GSN_START_BACKUP_REF; len= StartBackupRef::SignalLength; pos= &ref->nodeId - signal->getDataPtr(); break; } case GSN_BACKUP_FRAGMENT_REQ: { BackupFragmentRef * ref = (BackupFragmentRef*)signal->getDataPtr(); ref->backupPtr = ptr.i; ref->backupId = ptr.p->backupId; ref->errorCode = AbortBackupOrd::BackupFailureDueToNodeFail; gsn= GSN_BACKUP_FRAGMENT_REF; len= BackupFragmentRef::SignalLength; pos= &ref->nodeId - signal->getDataPtr(); break; } case GSN_STOP_BACKUP_REQ: { StopBackupRef * ref = (StopBackupRef*)signal->getDataPtr(); ref->backupPtr = ptr.i; ref->backupId = ptr.p->backupId; ref->errorCode = AbortBackupOrd::BackupFailureDueToNodeFail; gsn= GSN_STOP_BACKUP_REF; len= StopBackupRef::SignalLength; pos= &ref->nodeId - signal->getDataPtr(); break; } case GSN_WAIT_GCP_REQ: case GSN_DROP_TRIG_REQ: case GSN_CREATE_TRIG_REQ: case GSN_ALTER_TRIG_REQ: ptr.p->setErrorCode(AbortBackupOrd::BackupFailureDueToNodeFail); return; case GSN_UTIL_SEQUENCE_REQ: case GSN_UTIL_LOCK_REQ: return; default: ndbrequire(false); } for(Uint32 i = 0; (i = mask.find(i+1)) != NdbNodeBitmask::NotFound; ) { signal->theData[pos] = i; sendSignal(reference(), gsn, signal, len, JBB);#ifdef DEBUG_ABORT ndbout_c("sending %d to self from %d", gsn, i);#endif } return; }//if /** * I abort myself as slave if not master */ CRASH_INSERTION((10021));} voidBackup::execINCL_NODEREQ(Signal* signal){ jamEntry(); const Uint32 senderRef = signal->theData[0]; const Uint32 inclNode = signal->theData[1]; NodePtr node; for(c_nodes.first(node); node.i != RNIL; c_nodes.next(node)) { jam(); const Uint32 nodeId = node.p->nodeId; if(inclNode == nodeId){ jam(); ndbrequire(node.p->alive == 0); ndbrequire(!c_aliveNodes.get(nodeId)); node.p->alive = 1; c_aliveNodes.set(nodeId); break; }//if }//for signal->theData[0] = reference(); sendSignal(senderRef, GSN_INCL_NODECONF, signal, 1, JBB);}/***************************************************************************** * * Master functionallity - Define backup * *****************************************************************************/voidBackup::execBACKUP_REQ(Signal* signal){ jamEntry(); BackupReq * req = (BackupReq*)signal->getDataPtr(); const Uint32 senderData = req->senderData; const BlockReference senderRef = signal->senderBlockRef(); const Uint32 dataLen32 = req->backupDataLen; // In 32 bit words const Uint32 flags = signal->getLength() > 2 ? req->flags : 2; if(getOwnNodeId() != getMasterNodeId()) { jam(); sendBackupRef(senderRef, flags, signal, senderData, BackupRef::IAmNotMaster); return; }//if if (m_diskless) { sendBackupRef(senderRef, flags, signal, senderData, BackupRef::CannotBackupDiskless); return; } if(dataLen32 != 0) { jam(); sendBackupRef(senderRef, flags, signal, senderData, BackupRef::BackupDefinitionNotImplemented); return; }//if #ifdef DEBUG_ABORT dumpUsedResources();#endif /** * Seize a backup record */ BackupRecordPtr ptr; c_backups.seize(ptr); if(ptr.i == RNIL) { jam(); sendBackupRef(senderRef, flags, signal, senderData, BackupRef::OutOfBackupRecord); return; }//if
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -