📄 mgmtsrvr.cpp
字号:
} // send the signals NodeBitmask nodes; if (nodeId) { if(nodeId==getOwnNodeId()) { if(restart) g_RestartServer= true; g_StopServer= true; return 0; } if(getNodeType(nodeId) == NDB_MGM_NODE_TYPE_NDB) { int r; if((r= okToSendTo(nodeId, true)) != 0) return r; if (ss.sendSignal(nodeId, &ssig) != SEND_OK) return SEND_OR_RECEIVE_FAILED; } else if(getNodeType(nodeId) == NDB_MGM_NODE_TYPE_MGM) { error= sendStopMgmd(nodeId, abort, stop, restart, nostart, initialStart); if(error==0) stoppedNodes.set(nodeId); return error; } else return WRONG_PROCESS_TYPE; nodes.set(nodeId); } else { while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) { if(okToSendTo(nodeId, true) == 0) { SendStatus result = ss.sendSignal(nodeId, &ssig); if (result == SEND_OK) nodes.set(nodeId); } } nodeId= 0; while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_MGM)) { if(nodeId==getOwnNodeId()) continue; if(sendStopMgmd(nodeId, abort, stop, restart, nostart, initialStart)==0) stoppedNodes.set(nodeId); } } // now wait for the replies while (!nodes.isclear()) { SimpleSignal *signal = ss.waitFor(); int gsn = signal->readSignalNumber(); switch (gsn) { case GSN_STOP_REF:{ const StopRef * const ref = CAST_CONSTPTR(StopRef, signal->getDataPtr()); const NodeId nodeId = refToNode(signal->header.theSendersBlockRef);#ifdef VM_TRACE ndbout_c("Node %d refused stop", nodeId);#endif assert(nodes.get(nodeId)); nodes.clear(nodeId); error = translateStopRef(ref->errorCode); break; } case GSN_STOP_CONF:{ const StopConf * const ref = CAST_CONSTPTR(StopConf, signal->getDataPtr()); const NodeId nodeId = refToNode(signal->header.theSendersBlockRef);#ifdef VM_TRACE ndbout_c("Node %d single user mode", nodeId);#endif assert(nodes.get(nodeId)); assert(singleUserNodeId != 0); nodes.clear(nodeId); stoppedNodes.set(nodeId); break; } case GSN_NF_COMPLETEREP:{ const NFCompleteRep * const rep = CAST_CONSTPTR(NFCompleteRep, signal->getDataPtr());#ifdef VM_TRACE ndbout_c("Node %d fail completed", rep->failedNodeId);#endif break; } case GSN_NODE_FAILREP:{ const NodeFailRep * const rep = CAST_CONSTPTR(NodeFailRep, signal->getDataPtr()); NodeBitmask failedNodes; failedNodes.assign(NodeBitmask::Size, rep->theNodes);#ifdef VM_TRACE { ndbout << "Failed nodes:"; for (unsigned i = 0; i < 32*NodeBitmask::Size; i++) if(failedNodes.get(i)) ndbout << " " << i; ndbout << endl; }#endif failedNodes.bitAND(nodes); if (!failedNodes.isclear()) { nodes.bitANDC(failedNodes); // clear the failed nodes if (singleUserNodeId == 0) stoppedNodes.bitOR(failedNodes); } break; } default: report_unknown_signal(signal);#ifdef VM_TRACE ndbout_c("Unknown signal %d", gsn);#endif return SEND_OR_RECEIVE_FAILED; } } return error;}/* * Stop one node */int MgmtSrvr::stopNode(int nodeId, bool abort){ if (!abort) { NodeId nodeId = 0; ClusterMgr::Node node; while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) { node = theFacade->theClusterMgr->getNodeInfo(nodeId); if((node.m_state.startLevel != NodeState::SL_STARTED) && (node.m_state.startLevel != NodeState::SL_NOTHING)) return OPERATION_NOT_ALLOWED_START_STOP; } } NodeBitmask nodes; return sendSTOP_REQ(nodeId, nodes, 0, abort, false, false, false, false);}/* * Perform system shutdown */int MgmtSrvr::stop(int * stopCount, bool abort){ NodeBitmask nodes; int ret = sendSTOP_REQ(0, nodes, 0, abort, true, false, false, false); if (stopCount) *stopCount = nodes.count(); return ret;}/* * Enter single user mode on all live nodes */int MgmtSrvr::enterSingleUser(int * stopCount, Uint32 singleUserNodeId){ if (getNodeType(singleUserNodeId) != NDB_MGM_NODE_TYPE_API) return NODE_NOT_API_NODE; NodeId nodeId = 0; ClusterMgr::Node node; while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) { node = theFacade->theClusterMgr->getNodeInfo(nodeId); if((node.m_state.startLevel != NodeState::SL_STARTED) && (node.m_state.startLevel != NodeState::SL_NOTHING)) return OPERATION_NOT_ALLOWED_START_STOP; } NodeBitmask nodes; int ret = sendSTOP_REQ(0, nodes, singleUserNodeId, false, false, false, false, false); if (stopCount) *stopCount = nodes.count(); return ret;}/* * Perform node restart */int MgmtSrvr::restartNode(int nodeId, bool nostart, bool initialStart, bool abort){ NodeBitmask nodes; return sendSTOP_REQ(nodeId, nodes, 0, abort, false, true, nostart, initialStart);}/* * Perform system restart */int MgmtSrvr::restart(bool nostart, bool initialStart, bool abort, int * stopCount ){ NodeBitmask nodes; int ret = sendSTOP_REQ(0, nodes, 0, abort, true, true, true, initialStart); if (ret) return ret; if (stopCount) *stopCount = nodes.count();#ifdef VM_TRACE ndbout_c("Stopped %d nodes", nodes.count());#endif /** * Here all nodes were correctly stopped, * so we wait for all nodes to be contactable */ int waitTime = 12000; NodeId nodeId = 0; NDB_TICKS maxTime = NdbTick_CurrentMillisecond() + waitTime; ndbout_c(" %d", nodes.get(1)); ndbout_c(" %d", nodes.get(2)); while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) { if (!nodes.get(nodeId)) continue; enum ndb_mgm_node_status s; s = NDB_MGM_NODE_STATUS_NO_CONTACT;#ifdef VM_TRACE ndbout_c("Waiting for %d not started", nodeId);#endif while (s != NDB_MGM_NODE_STATUS_NOT_STARTED && waitTime > 0) { Uint32 startPhase = 0, version = 0, dynamicId = 0, nodeGroup = 0; Uint32 connectCount = 0; bool system; const char *address; status(nodeId, &s, &version, &startPhase, &system, &dynamicId, &nodeGroup, &connectCount, &address); NdbSleep_MilliSleep(100); waitTime = (maxTime - NdbTick_CurrentMillisecond()); } } if(nostart) return 0; /** * Now we start all database nodes (i.e. we make them non-idle) * We ignore the result we get from the start command. */ nodeId = 0; while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) { if (!nodes.get(nodeId)) continue; int result; result = start(nodeId); DEBUG("Starting node " << nodeId << " with result " << result); /** * Errors from this call are deliberately ignored. * Maybe the user only wanted to restart a subset of the nodes. * It is also easy for the user to check which nodes have * started and which nodes have not. */ } return 0;}intMgmtSrvr::exitSingleUser(int * stopCount, bool abort){ NodeId nodeId = 0; int count = 0; SignalSender ss(theFacade); ss.lock(); // lock will be released on exit SimpleSignal ssig; ResumeReq* const resumeReq = CAST_PTR(ResumeReq, ssig.getDataPtrSend()); ssig.set(ss,TestOrd::TraceAPI, NDBCNTR, GSN_RESUME_REQ, ResumeReq::SignalLength); resumeReq->senderData = 12; resumeReq->senderRef = ss.getOwnRef(); while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)){ if(okToSendTo(nodeId, true) == 0){ SendStatus result = ss.sendSignal(nodeId, &ssig); if (result == SEND_OK) count++; } } if(stopCount != 0) * 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){ 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -