📄 mgmtsrvr.cpp
字号:
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){ INIT_SIGNAL_SENDER(ss,nodeId); SimpleSignal ssig; EventSubscribeReq * dst = CAST_PTR(EventSubscribeReq, ssig.getDataPtrSend()); ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ, EventSubscribeReq::SignalLength); *dst = ll; send(ss,ssig,nodeId,NODE_TYPE_DB);#if 0 while (1) { SimpleSignal *signal = ss.waitFor(); int gsn = signal->readSignalNumber(); switch (gsn) { case GSN_EVENT_SUBSCRIBE_CONF:{ break; } case GSN_EVENT_SUBSCRIBE_REF:{ return SEND_OR_RECEIVE_FAILED; } case GSN_NF_COMPLETEREP:{ const NFCompleteRep * const rep = CAST_CONSTPTR(NFCompleteRep, signal->getDataPtr()); if (rep->failedNodeId == nodeId) return SEND_OR_RECEIVE_FAILED; break; } case GSN_NODE_FAILREP:{ const NodeFailRep * const rep = CAST_CONSTPTR(NodeFailRep, signal->getDataPtr()); if (NodeBitmask::get(rep->theNodes,nodeId)) return SEND_OR_RECEIVE_FAILED; break; } default: report_unknown_signal(signal); return SEND_OR_RECEIVE_FAILED; } }#endif 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;}intMgmtSrvr::send(SignalSender &ss, SimpleSignal &ssig, Uint32 node, Uint32 node_type){ Uint32 max = (node == 0) ? MAX_NODES : node + 1; for(; node < max; node++){ while(nodeTypes[node] != (int)node_type && node < max) node++; if(nodeTypes[node] != (int)node_type) break; ss.sendSignal(node, &ssig); } return 0;}//****************************************************************************//****************************************************************************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 = CAST_PTR(EventReport, signal->getDataPtrSend()); 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);}//****************************************************************************//****************************************************************************void MgmtSrvr::nodeStatusNotification(void* mgmSrv, Uint32 nodeId, bool alive, bool nfComplete){ DBUG_ENTER("MgmtSrvr::nodeStatusNotification"); DBUG_PRINT("enter",("nodeid= %d, alive= %d, nfComplete= %d", nodeId, alive, nfComplete)); ((MgmtSrvr*)mgmSrv)->handleStatus(nodeId, alive, nfComplete); DBUG_VOID_RETURN;}enum ndb_mgm_node_type MgmtSrvr::getNodeType(NodeId nodeId) const { if(nodeId >= MAX_NODES) return (enum ndb_mgm_node_type)-1; return nodeTypes[nodeId];}const char *MgmtSrvr::get_connect_address(Uint32 node_id){ if (m_connect_address[node_id].s_addr == 0 && theFacade && theFacade->theTransporterRegistry && theFacade->theClusterMgr && getNodeType(node_id) == NDB_MGM_NODE_TYPE_NDB) { const ClusterMgr::Node &node= theFacade->theClusterMgr->getNodeInfo(node_id); if (node.connected) { m_connect_address[node_id]= theFacade->theTransporterRegistry->get_connect_address(node_id); } } return inet_ntoa(m_connect_address[node_id]); }voidMgmtSrvr::get_connected_nodes(NodeBitmask &connected_nodes) const{ if (theFacade && theFacade->theClusterMgr) { for(Uint32 i = 0; i < MAX_NODES; i++) { if (getNodeType(i) == NDB_MGM_NODE_TYPE_NDB) { const ClusterMgr::Node &node= theFacade->theClusterMgr->getNodeInfo(i); connected_nodes.bitOR(node.m_state.m_connected_nodes); } } }}boolMgmtSrvr::alloc_node_id(NodeId * nodeId, enum ndb_mgm_node_type type, struct sockaddr *client_addr, SOCKET_SIZE_TYPE *client_addr_len, BaseString &error_string){ DBUG_ENTER("MgmtSrvr::alloc_node_id"); DBUG_PRINT("enter", ("nodeid=%d, type=%d, client_addr=%d", *nodeId, type, client_addr)); if (g_no_nodeid_checks) { if (*nodeId == 0) { error_string.appfmt("no-nodeid-checks set in management server.\n" "node id must be set explicitly in connectstring"); DBUG_RETURN(false); } DBUG_RETURN(true); } Guard g(m_node_id_mutex); int no_mgm= 0; NodeBitmask connected_nodes(m_reserved_nodes);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -