📄 mgmtsrvr.cpp
字号:
* stopCount = count; return 0;}/***************************************************************************** * Status ****************************************************************************/#include <ClusterMgr.hpp>int MgmtSrvr::status(int nodeId, ndb_mgm_node_status * _status, Uint32 * version, Uint32 * _phase, bool * _system, Uint32 * dynamic, Uint32 * nodegroup, Uint32 * connectCount, const char **address){ if (getNodeType(nodeId) == NDB_MGM_NODE_TYPE_API || getNodeType(nodeId) == NDB_MGM_NODE_TYPE_MGM) { versionNode(nodeId, *version, address); } else { *address= get_connect_address(nodeId); } const ClusterMgr::Node node = theFacade->theClusterMgr->getNodeInfo(nodeId); if(!node.connected){ * _status = NDB_MGM_NODE_STATUS_NO_CONTACT; return 0; } if (getNodeType(nodeId) == NDB_MGM_NODE_TYPE_NDB) { * version = node.m_info.m_version; } * dynamic = node.m_state.dynamicId; * nodegroup = node.m_state.nodeGroup; * connectCount = node.m_info.m_connectCount; switch(node.m_state.startLevel){ case NodeState::SL_CMVMI: * _status = NDB_MGM_NODE_STATUS_NOT_STARTED; * _phase = 0; return 0; break; case NodeState::SL_STARTING: * _status = NDB_MGM_NODE_STATUS_STARTING; * _phase = node.m_state.starting.startPhase; return 0; break; case NodeState::SL_STARTED: * _status = NDB_MGM_NODE_STATUS_STARTED; * _phase = 0; return 0; break; case NodeState::SL_STOPPING_1: * _status = NDB_MGM_NODE_STATUS_SHUTTING_DOWN; * _phase = 1; * _system = node.m_state.stopping.systemShutdown != 0; return 0; break; case NodeState::SL_STOPPING_2: * _status = NDB_MGM_NODE_STATUS_SHUTTING_DOWN; * _phase = 2; * _system = node.m_state.stopping.systemShutdown != 0; return 0; break; case NodeState::SL_STOPPING_3: * _status = NDB_MGM_NODE_STATUS_SHUTTING_DOWN; * _phase = 3; * _system = node.m_state.stopping.systemShutdown != 0; return 0; break; case NodeState::SL_STOPPING_4: * _status = NDB_MGM_NODE_STATUS_SHUTTING_DOWN; * _phase = 4; * _system = node.m_state.stopping.systemShutdown != 0; return 0; break; case NodeState::SL_SINGLEUSER: * _status = NDB_MGM_NODE_STATUS_SINGLEUSER; * _phase = 0; return 0; break; default: * _status = NDB_MGM_NODE_STATUS_UNKNOWN; * _phase = 0; return 0; } return -1;}int MgmtSrvr::setEventReportingLevelImpl(int nodeId, const EventSubscribeReq& ll){ SignalSender ss(theFacade); ss.lock(); SimpleSignal ssig; EventSubscribeReq * dst = CAST_PTR(EventSubscribeReq, ssig.getDataPtrSend()); ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ, EventSubscribeReq::SignalLength); *dst = ll; NodeBitmask nodes; nodes.clear(); Uint32 max = (nodeId == 0) ? (nodeId = 1, MAX_NDB_NODES) : nodeId; for(; nodeId <= max; nodeId++) { if (nodeTypes[nodeId] != NODE_TYPE_DB) continue; if (okToSendTo(nodeId, true)) continue; if (ss.sendSignal(nodeId, &ssig) == SEND_OK) { nodes.set(nodeId); } } int error = 0; while (!nodes.isclear()) { SimpleSignal *signal = ss.waitFor(); int gsn = signal->readSignalNumber(); nodeId = refToNode(signal->header.theSendersBlockRef); switch (gsn) { case GSN_EVENT_SUBSCRIBE_CONF:{ nodes.clear(nodeId); break; } case GSN_EVENT_SUBSCRIBE_REF:{ nodes.clear(nodeId); error = 1; break; } case GSN_NF_COMPLETEREP:{ const NFCompleteRep * const rep = CAST_CONSTPTR(NFCompleteRep, signal->getDataPtr()); nodes.clear(rep->failedNodeId); break; } case GSN_NODE_FAILREP:{ // ignore, NF_COMPLETEREP will arrive later break; } default: report_unknown_signal(signal); return SEND_OR_RECEIVE_FAILED; } } if (error) return SEND_OR_RECEIVE_FAILED; return 0;}//****************************************************************************//****************************************************************************int MgmtSrvr::setNodeLogLevelImpl(int nodeId, const SetLogLevelOrd & ll){ INIT_SIGNAL_SENDER(ss,nodeId); SimpleSignal ssig; ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_SET_LOGLEVELORD, SetLogLevelOrd::SignalLength); SetLogLevelOrd* const dst = CAST_PTR(SetLogLevelOrd, ssig.getDataPtrSend()); *dst = ll; return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}//****************************************************************************//****************************************************************************int MgmtSrvr::insertError(int nodeId, int errorNo) { if (errorNo < 0) { return INVALID_ERROR_NUMBER; } INIT_SIGNAL_SENDER(ss,nodeId); SimpleSignal ssig; ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TAMPER_ORD, TamperOrd::SignalLength); TamperOrd* const tamperOrd = CAST_PTR(TamperOrd, ssig.getDataPtrSend()); tamperOrd->errorNo = errorNo; return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}//****************************************************************************//****************************************************************************int MgmtSrvr::setTraceNo(int nodeId, int traceNo){ if (traceNo < 0) { return INVALID_TRACE_NUMBER; } INIT_SIGNAL_SENDER(ss,nodeId); SimpleSignal ssig; ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength); TestOrd* const testOrd = CAST_PTR(TestOrd, ssig.getDataPtrSend()); testOrd->clear(); // Assume TRACE command causes toggling. Not really defined... ? TODO testOrd->setTraceCommand(TestOrd::Toggle, (TestOrd::TraceSpecification)traceNo); return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}//****************************************************************************//****************************************************************************int MgmtSrvr::getBlockNumber(const BaseString &blockName) { short bno = getBlockNo(blockName.c_str()); if(bno != 0) return bno; return -1;}//****************************************************************************//****************************************************************************int MgmtSrvr::setSignalLoggingMode(int nodeId, LogMode mode, const Vector<BaseString>& blocks){ INIT_SIGNAL_SENDER(ss,nodeId); // Convert from MgmtSrvr format... TestOrd::Command command; if (mode == Off) { command = TestOrd::Off; } else { command = TestOrd::On; } TestOrd::SignalLoggerSpecification logSpec; switch (mode) { case In: logSpec = TestOrd::InputSignals; break; case Out: logSpec = TestOrd::OutputSignals; break; case InOut: logSpec = TestOrd::InputOutputSignals; break; case Off: // In MgmtSrvr interface it's just possible to switch off all logging, both // "in" and "out" (this should probably be changed). logSpec = TestOrd::InputOutputSignals; break; default: ndbout_c("Unexpected value %d, MgmtSrvr::setSignalLoggingMode, line %d", (unsigned)mode, __LINE__); assert(false); return -1; } SimpleSignal ssig; ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength); TestOrd* const testOrd = CAST_PTR(TestOrd, ssig.getDataPtrSend()); testOrd->clear(); if (blocks.size() == 0 || blocks[0] == "ALL") { // Logg command for all blocks testOrd->addSignalLoggerCommand(command, logSpec); } else { for(unsigned i = 0; i < blocks.size(); i++){ int blockNumber = getBlockNumber(blocks[i]); if (blockNumber == -1) { return INVALID_BLOCK_NAME; } testOrd->addSignalLoggerCommand(blockNumber, command, logSpec); } // for } // else return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}/***************************************************************************** * Signal tracing *****************************************************************************/int MgmtSrvr::startSignalTracing(int nodeId){ INIT_SIGNAL_SENDER(ss,nodeId); SimpleSignal ssig; ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength); TestOrd* const testOrd = CAST_PTR(TestOrd, ssig.getDataPtrSend()); testOrd->clear(); testOrd->setTestCommand(TestOrd::On); return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}int MgmtSrvr::stopSignalTracing(int nodeId) { INIT_SIGNAL_SENDER(ss,nodeId); SimpleSignal ssig; ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_TEST_ORD, TestOrd::SignalLength); TestOrd* const testOrd = CAST_PTR(TestOrd, ssig.getDataPtrSend()); testOrd->clear(); testOrd->setTestCommand(TestOrd::Off); return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}/***************************************************************************** * Dump state *****************************************************************************/intMgmtSrvr::dumpState(int nodeId, const char* args){ // Convert the space separeted args // string to an int array Uint32 args_array[25]; Uint32 numArgs = 0; char buf[10]; int b = 0; memset(buf, 0, 10); for (size_t i = 0; i <= strlen(args); i++){ if (args[i] == ' ' || args[i] == 0){ args_array[numArgs] = atoi(buf); numArgs++; memset(buf, 0, 10); b = 0; } else { buf[b] = args[i]; b++; } } return dumpState(nodeId, args_array, numArgs);}intMgmtSrvr::dumpState(int nodeId, const Uint32 args[], Uint32 no){ INIT_SIGNAL_SENDER(ss,nodeId); const Uint32 len = no > 25 ? 25 : no; SimpleSignal ssig; DumpStateOrd * const dumpOrd = CAST_PTR(DumpStateOrd, ssig.getDataPtrSend()); ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_DUMP_STATE_ORD, len); for(Uint32 i = 0; i<25; i++){ if (i < len) dumpOrd->args[i] = args[i]; else dumpOrd->args[i] = 0; } return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;}//****************************************************************************//****************************************************************************const char* MgmtSrvr::getErrorText(int errorCode, char *buf, int buf_sz){ for (int i = 0; i < noOfErrorCodes; ++i) { if (errorCode == errorTable[i]._errorCode) { BaseString::snprintf(buf, buf_sz, errorTable[i]._errorText); buf[buf_sz-1]= 0; return buf; } } ndb_error_string(errorCode, buf, buf_sz); buf[buf_sz-1]= 0; return buf;}void MgmtSrvr::handleReceivedSignal(NdbApiSignal* signal){ // The way of handling a received signal is taken from the Ndb class. int gsn = signal->readSignalNumber(); switch (gsn) { case GSN_EVENT_SUBSCRIBE_CONF: break; case GSN_EVENT_SUBSCRIBE_REF: break; case GSN_EVENT_REP: { EventReport *rep = (EventReport*) signal->getDataPtr(); if (rep->getNodeId() == 0) rep->setNodeId(refToNode(signal->theSendersBlockRef)); eventReport(signal->getDataPtr()); break; } case GSN_NF_COMPLETEREP: break; case GSN_NODE_FAILREP: break; default: g_eventLogger.error("Unknown signal received. SignalNumber: " "%i from (%d, %x)", gsn, refToNode(signal->theSendersBlockRef), refToBlock(signal->theSendersBlockRef)); } if (theWaitState == NO_WAIT) { NdbCondition_Signal(theMgmtWaitForResponseCondPtr); }}voidMgmtSrvr::handleStatus(NodeId nodeId, bool alive, bool nfComplete){ DBUG_ENTER("MgmtSrvr::handleStatus"); Uint32 theData[25]; EventReport *rep = (EventReport *)theData; theData[1] = nodeId; if (alive) { m_started_nodes.push_back(nodeId); rep->setEventType(NDB_LE_Connected); } else { rep->setEventType(NDB_LE_Connected); if(nfComplete) { DBUG_VOID_RETURN; } } rep->setNodeId(_ownNodeId); eventReport(theData); DBUG_VOID_RETURN;}//****************************************************************************//****************************************************************************void MgmtSrvr::signalReceivedNotification(void* mgmtSrvr, NdbApiSignal* signal, LinearSectionPtr ptr[3]) { ((MgmtSrvr*)mgmtSrvr)->handleReceivedSignal(signal);}//****************************************************************************//****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -