📄 mgmtsrvr.cpp
字号:
stopReq->senderRef = ss.getOwnRef(); if (singleUserNodeId) { stopReq->singleuser = 1; stopReq->singleUserApi = singleUserNodeId; StopReq::setSystemStop(stopReq->requestInfo, false); StopReq::setPerformRestart(stopReq->requestInfo, false); StopReq::setStopAbort(stopReq->requestInfo, false); } else { stopReq->singleuser = 0; StopReq::setSystemStop(stopReq->requestInfo, stop); StopReq::setPerformRestart(stopReq->requestInfo, restart); StopReq::setStopAbort(stopReq->requestInfo, abort); StopReq::setNoStart(stopReq->requestInfo, nostart); StopReq::setInitialStart(stopReq->requestInfo, initialStart); } // send the signals NodeBitmask nodes; NodeId nodeId= 0; int use_master_node= 0; int do_send= 0; int do_stop_self= 0; NdbNodeBitmask nodes_to_stop; { for (unsigned i= 0; i < node_ids.size(); i++) { nodeId= node_ids[i]; if (getNodeType(nodeId) != NDB_MGM_NODE_TYPE_MGM) nodes_to_stop.set(nodeId); else if (nodeId != getOwnNodeId()) { error= sendStopMgmd(nodeId, abort, stop, restart, nostart, initialStart); if (error == 0) stoppedNodes.set(nodeId); } else do_stop_self= 1;; } } int no_of_nodes_to_stop= nodes_to_stop.count(); if (node_ids.size()) { if (no_of_nodes_to_stop) { do_send= 1; if (no_of_nodes_to_stop == 1) { nodeId= nodes_to_stop.find(0); } else // multi node stop, send to master { use_master_node= 1; nodes_to_stop.copyto(NdbNodeBitmask::Size, stopReq->nodes); StopReq::setStopNodes(stopReq->requestInfo, 1); } } } else { nodeId= 0; 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() || do_send) { if (do_send) { int r; assert(nodes.count() == 0); if (use_master_node) nodeId= m_master_node; if ((r= okToSendTo(nodeId, true)) != 0) { bool next; if (!use_master_node) DBUG_RETURN(r); m_master_node= nodeId= 0; while((next= getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) == true && (r= okToSendTo(nodeId, true)) != 0); if (!next) DBUG_RETURN(NO_CONTACT_WITH_DB_NODES); } if (ss.sendSignal(nodeId, &ssig) != SEND_OK) DBUG_RETURN(SEND_OR_RECEIVE_FAILED); nodes.set(nodeId); do_send= 0; } 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); if (ref->errorCode == StopRef::MultiNodeShutdownNotMaster) { assert(use_master_node); m_master_node= ref->masterNodeId; do_send= 1; continue; } 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)); if (singleUserNodeId != 0) { stoppedNodes.set(nodeId); } else { assert(no_of_nodes_to_stop > 1); stoppedNodes.bitOR(nodes_to_stop); } nodes.clear(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 DBUG_RETURN(SEND_OR_RECEIVE_FAILED); } } if (!error && do_stop_self) { if (restart) g_RestartServer= true; g_StopServer= true; } DBUG_RETURN(error);}/* * Stop one nodes */int MgmtSrvr::stopNodes(const Vector<NodeId> &node_ids, int *stopCount, 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; int ret= sendSTOP_REQ(node_ids, nodes, 0, abort, false, false, false, false); if (stopCount) *stopCount= nodes.count(); return ret;}/* * Perform system shutdown */int MgmtSrvr::stop(int * stopCount, bool abort){ NodeBitmask nodes; Vector<NodeId> node_ids; int ret = sendSTOP_REQ(node_ids, 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; Vector<NodeId> node_ids; int ret = sendSTOP_REQ(node_ids, nodes, singleUserNodeId, false, false, false, false, false); if (stopCount) *stopCount = nodes.count(); return ret;}/* * Perform node restart */int MgmtSrvr::restartNodes(const Vector<NodeId> &node_ids, int * stopCount, bool nostart, bool initialStart, bool abort){ NodeBitmask nodes; int ret= sendSTOP_REQ(node_ids, nodes, 0, abort, false, true, nostart, initialStart); if (stopCount) *stopCount = nodes.count(); return ret;}/* * Perform system restart */int MgmtSrvr::restart(bool nostart, bool initialStart, bool abort, int * stopCount ){ NodeBitmask nodes; Vector<NodeId> node_ids; int ret = sendSTOP_REQ(node_ids, 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -