📄 cmvmi.cpp
字号:
jam(); if (i != getOwnNodeId() && getNodeInfo(i).m_type == tData2){ jam();#ifdef ERROR_INSERT if (ERROR_INSERTED(9000) && c_error_9000_nodes_mask.get(i)) continue;#endif globalTransporterRegistry.do_connect(i); globalTransporterRegistry.setIOState(i, HaltIO); signal->theData[0] = NDB_LE_CommunicationOpened; signal->theData[1] = i; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB); } } } if (userRef != 0) { jam(); signal->theData[0] = tStartingNode; signal->theData[1] = tData2; sendSignal(userRef, GSN_OPEN_COMCONF, signal, len - 1,JBA); }}void Cmvmi::execENABLE_COMORD(Signal* signal){ // Enable communication with all our NDB blocks to this node Uint32 tStartingNode = signal->theData[0]; globalTransporterRegistry.setIOState(tStartingNode, NoHalt); setNodeInfo(tStartingNode).m_connected = true; //----------------------------------------------------- // Report that the version of the node //----------------------------------------------------- signal->theData[0] = NDB_LE_ConnectedApiVersion; signal->theData[1] = tStartingNode; signal->theData[2] = getNodeInfo(tStartingNode).m_version; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 3, JBB); //----------------------------------------------------- jamEntry();}void Cmvmi::execDISCONNECT_REP(Signal *signal){ const DisconnectRep * const rep = (DisconnectRep *)&signal->theData[0]; const Uint32 hostId = rep->nodeId; const Uint32 errNo = rep->err; jamEntry(); setNodeInfo(hostId).m_connected = false; setNodeInfo(hostId).m_connectCount++; const NodeInfo::NodeType type = getNodeInfo(hostId).getType(); ndbrequire(type != NodeInfo::INVALID); if(type == NodeInfo::DB || globalData.theStartLevel == NodeState::SL_STARTED){ jam(); DisconnectRep * const rep = (DisconnectRep *)&signal->theData[0]; rep->nodeId = hostId; rep->err = errNo; sendSignal(QMGR_REF, GSN_DISCONNECT_REP, signal, DisconnectRep::SignalLength, JBA); } else if((globalData.theStartLevel == NodeState::SL_CMVMI || globalData.theStartLevel == NodeState::SL_STARTING) && type == NodeInfo::MGM) { /** * Someone disconnected during cmvmi period */ jam(); globalTransporterRegistry.do_connect(hostId); } cancelSubscription(hostId); signal->theData[0] = NDB_LE_Disconnected; signal->theData[1] = hostId; sendSignal(CMVMI_REF, GSN_EVENT_REP, signal, 2, JBB);} void Cmvmi::execCONNECT_REP(Signal *signal){ const Uint32 hostId = signal->theData[0]; jamEntry(); const NodeInfo::NodeType type = (NodeInfo::NodeType)getNodeInfo(hostId).m_type; ndbrequire(type != NodeInfo::INVALID); globalData.m_nodeInfo[hostId].m_version = 0; globalData.m_nodeInfo[hostId].m_signalVersion = 0; if(type == NodeInfo::DB || globalData.theStartLevel >= NodeState::SL_STARTED){ jam(); /** * Inform QMGR that client has connected */ signal->theData[0] = hostId; sendSignal(QMGR_REF, GSN_CONNECT_REP, signal, 1, JBA); } else if(globalData.theStartLevel == NodeState::SL_CMVMI || globalData.theStartLevel == NodeState::SL_STARTING) { jam(); /** * Someone connected before start was finished */ if(type == NodeInfo::MGM){ jam(); } else { /** * Dont allow api nodes to connect */ abort(); globalTransporterRegistry.do_disconnect(hostId); } } /* Automatically subscribe events for MGM nodes. */ if(type == NodeInfo::MGM){ jam(); globalTransporterRegistry.setIOState(hostId, NoHalt); } //------------------------------------------ // Also report this event to the Event handler //------------------------------------------ signal->theData[0] = NDB_LE_Connected; signal->theData[1] = hostId; signal->header.theLength = 2; execEVENT_REP(signal);}#ifdef VM_TRACEvoidmodifySignalLogger(bool allBlocks, BlockNumber bno, TestOrd::Command cmd, TestOrd::SignalLoggerSpecification spec){ SignalLoggerManager::LogMode logMode; /** * Mapping between SignalLoggerManager::LogMode and * TestOrd::SignalLoggerSpecification */ switch(spec){ case TestOrd::InputSignals: logMode = SignalLoggerManager::LogIn; break; case TestOrd::OutputSignals: logMode = SignalLoggerManager::LogOut; break; case TestOrd::InputOutputSignals: logMode = SignalLoggerManager::LogInOut; break; default: return; break; } switch(cmd){ case TestOrd::On: globalSignalLoggers.logOn(allBlocks, bno, logMode); break; case TestOrd::Off: globalSignalLoggers.logOff(allBlocks, bno, logMode); break; case TestOrd::Toggle: globalSignalLoggers.logToggle(allBlocks, bno, logMode); break; case TestOrd::KeepUnchanged: // Do nothing break; } globalSignalLoggers.flushSignalLog();}#endifvoidCmvmi::execTEST_ORD(Signal * signal){ jamEntry(); #ifdef VM_TRACE TestOrd * const testOrd = (TestOrd *)&signal->theData[0]; TestOrd::Command cmd; { /** * Process Trace command */ TestOrd::TraceSpecification traceSpec; testOrd->getTraceCommand(cmd, traceSpec); unsigned long traceVal = traceSpec; unsigned long currentTraceVal = globalSignalLoggers.getTrace(); switch(cmd){ case TestOrd::On: currentTraceVal |= traceVal; break; case TestOrd::Off: currentTraceVal &= (~traceVal); break; case TestOrd::Toggle: currentTraceVal ^= traceVal; break; case TestOrd::KeepUnchanged: // Do nothing break; } globalSignalLoggers.setTrace(currentTraceVal); } { /** * Process Log command */ TestOrd::SignalLoggerSpecification logSpec; BlockNumber bno; unsigned int loggers = testOrd->getNoOfSignalLoggerCommands(); if(loggers == (unsigned)~0){ // Apply command to all blocks testOrd->getSignalLoggerCommand(0, bno, cmd, logSpec); modifySignalLogger(true, bno, cmd, logSpec); } else { for(unsigned int i = 0; i<loggers; i++){ testOrd->getSignalLoggerCommand(i, bno, cmd, logSpec); modifySignalLogger(false, bno, cmd, logSpec); } } } { /** * Process test command */ testOrd->getTestCommand(cmd); switch(cmd){ case TestOrd::On:{ SET_GLOBAL_TEST_ON; } break; case TestOrd::Off:{ SET_GLOBAL_TEST_OFF; } break; case TestOrd::Toggle:{ TOGGLE_GLOBAL_TEST_FLAG; } break; case TestOrd::KeepUnchanged: // Do nothing break; } }#endif}void Cmvmi::execSTATISTICS_REQ(Signal* signal) { // TODO Note ! This is only a test implementation... static int stat1 = 0; jamEntry(); //ndbout << "data 1: " << signal->theData[1]; int x = signal->theData[0]; stat1++; signal->theData[0] = stat1; sendSignal(x, GSN_STATISTICS_CONF, signal, 7, JBB);}//execSTATISTICS_REQ()void Cmvmi::execSTOP_ORD(Signal* signal) { jamEntry(); globalData.theRestartFlag = perform_stop;}//execSTOP_ORD()voidCmvmi::execSTART_ORD(Signal* signal) { StartOrd * const startOrd = (StartOrd *)&signal->theData[0]; jamEntry(); Uint32 tmp = startOrd->restartInfo; if(StopReq::getPerformRestart(tmp)){ jam(); /** * */ NdbRestartType type = NRT_Default; if(StopReq::getNoStart(tmp) && StopReq::getInitialStart(tmp)) type = NRT_NoStart_InitialStart; if(StopReq::getNoStart(tmp) && !StopReq::getInitialStart(tmp)) type = NRT_NoStart_Restart; if(!StopReq::getNoStart(tmp) && StopReq::getInitialStart(tmp)) type = NRT_DoStart_InitialStart; if(!StopReq::getNoStart(tmp)&&!StopReq::getInitialStart(tmp)) type = NRT_DoStart_Restart; NdbShutdown(NST_Restart, type); } if(globalData.theRestartFlag == system_started){ jam() /** * START_ORD received when already started(ignored) */ //ndbout << "START_ORD received when already started(ignored)" << endl; return; } if(globalData.theRestartFlag == perform_stop){ jam() /** * START_ORD received when stopping(ignored) */ //ndbout << "START_ORD received when stopping(ignored)" << endl; return; } if(globalData.theStartLevel == NodeState::SL_NOTHING){ jam(); globalData.theStartLevel = NodeState::SL_CMVMI; /** * Open connections to management servers */ for(unsigned int i = 1; i < MAX_NODES; i++ ){ if (getNodeInfo(i).m_type == NodeInfo::MGM){ if(!globalTransporterRegistry.is_connected(i)){ globalTransporterRegistry.do_connect(i); globalTransporterRegistry.setIOState(i, NoHalt); } } } return ; } if(globalData.theStartLevel == NodeState::SL_CMVMI){ jam(); globalData.theStartLevel = NodeState::SL_STARTING; globalData.theRestartFlag = system_started; /** * StartLevel 1 * * Do Restart */ globalScheduler.clear(); globalTimeQueue.clear(); // Disconnect all nodes as part of the system restart. // We need to ensure that we are starting up // without any connected nodes. for(unsigned int i = 1; i < MAX_NODES; i++ ){ if (i != getOwnNodeId() && getNodeInfo(i).m_type != NodeInfo::MGM){ globalTransporterRegistry.do_disconnect(i); globalTransporterRegistry.setIOState(i, HaltIO); } } /** * Start running startphases */ sendSignal(NDBCNTR_REF, GSN_START_ORD, signal, 1, JBA); return; }}//execSTART_ORD()void Cmvmi::execTAMPER_ORD(Signal* signal) { jamEntry(); // TODO We should maybe introduce a CONF and REF signal // to be able to indicate if we really introduced an error.#ifdef ERROR_INSERT TamperOrd* const tamperOrd = (TamperOrd*)&signal->theData[0]; signal->theData[1] = tamperOrd->errorNo; signal->theData[0] = 5; sendSignal(DBDIH_REF, GSN_DIHNDBTAMPER, signal, 3,JBB);#endif}//execTAMPER_ORD()void Cmvmi::execSET_VAR_REQ(Signal* signal) {#if 0 SetVarReq* const setVarReq = (SetVarReq*)&signal->theData[0]; ConfigParamId var = setVarReq->variable(); jamEntry(); switch (var) { // NDBCNTR_REF // DBTC case TransactionDeadlockDetectionTimeout: case TransactionInactiveTime: case NoOfConcurrentProcessesHandleTakeover: sendSignal(DBTC_REF, GSN_SET_VAR_REQ, signal, 3, JBB); break; // DBDIH case TimeBetweenLocalCheckpoints: case TimeBetweenGlobalCheckpoints: sendSignal(DBDIH_REF, GSN_SET_VAR_REQ, signal, 3, JBB); break; // DBLQH case NoOfConcurrentCheckpointsDuringRestart: case NoOfConcurrentCheckpointsAfterRestart: sendSignal(DBLQH_REF, GSN_SET_VAR_REQ, signal, 3, JBB); break; // DBACC case NoOfDiskPagesToDiskDuringRestartACC: case NoOfDiskPagesToDiskAfterRestartACC: sendSignal(DBACC_REF, GSN_SET_VAR_REQ, signal, 3, JBB); break; // DBTUP case NoOfDiskPagesToDiskDuringRestartTUP: case NoOfDiskPagesToDiskAfterRestartTUP: sendSignal(DBTUP_REF, GSN_SET_VAR_REQ, signal, 3, JBB); break; // DBDICT // NDBCNTR case TimeToWaitAlive: // QMGR case HeartbeatIntervalDbDb: // TODO ev till Ndbcnt ocks
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -