📄 mgmtsrvr.cpp
字号:
"nostart: %d initialStart: %d", node_ids.size(), singleUserNodeId, abort, stop, restart, nostart, initialStart)); stoppedNodes.clear(); SignalSender ss(theFacade); ss.lock(); // lock will be released on exit SimpleSignal ssig; StopReq* const stopReq = CAST_PTR(StopReq, ssig.getDataPtrSend()); ssig.set(ss, TestOrd::TraceAPI, NDBCNTR, GSN_STOP_REQ, StopReq::SignalLength); stopReq->requestInfo = 0; stopReq->apiTimeout = 5000; stopReq->transactionTimeout = 1000; stopReq->readOperationTimeout = 1000; stopReq->operationTimeout = 1000; stopReq->senderData = 12; 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; *stopSelf= 0; NdbNodeBitmask nodes_to_stop; { for (unsigned i= 0; i < node_ids.size(); i++) { nodeId= node_ids[i]; ndbout << "asked to stop " << nodeId << endl; 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 { ndbout << "which is me" << endl; *stopSelf= (restart)? -1 : 1; stoppedNodes.set(nodeId); } } } 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); } } } // 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("sendSTOP_REQ Node %d fail completed", rep->failedNodeId);#endif nodes.clear(rep->failedNodeId); // clear the failed node if (singleUserNodeId == 0) stoppedNodes.set(rep->failedNodeId); break; } case GSN_NODE_FAILREP:{ const NodeFailRep * const rep = CAST_CONSTPTR(NodeFailRep, signal->getDataPtr()); break; } default: report_unknown_signal(signal);#ifdef VM_TRACE ndbout_c("Unknown signal %d", gsn);#endif DBUG_RETURN(SEND_OR_RECEIVE_FAILED); } } if (error && *stopSelf) { *stopSelf= 0; } DBUG_RETURN(error);}/* * Stop one nodes */int MgmtSrvr::stopNodes(const Vector<NodeId> &node_ids, int *stopCount, bool abort, int* stopSelf){ 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, stopSelf); if (stopCount) *stopCount= nodes.count(); return ret;}int MgmtSrvr::shutdownMGM(int *stopCount, bool abort, int *stopSelf){ NodeId nodeId = 0; int error; while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_MGM)) { if(nodeId==getOwnNodeId()) continue; error= sendStopMgmd(nodeId, abort, true, false, false, false); if (error == 0) *stopCount++; } *stopSelf= 1; *stopCount++; return 0;}/* * Perform DB nodes shutdown. * MGM servers are left in their current state */int MgmtSrvr::shutdownDB(int * stopCount, bool abort){ NodeBitmask nodes; Vector<NodeId> node_ids; int tmp; int ret = sendSTOP_REQ(node_ids, nodes, 0, abort, true, false, false, false, &tmp); 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 stopSelf; int ret = sendSTOP_REQ(node_ids, nodes, singleUserNodeId, false, false, false, false, false, &stopSelf); 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, int *stopSelf){ NodeBitmask nodes; int ret= sendSTOP_REQ(node_ids, nodes, 0, abort, false, true, true, initialStart, stopSelf); if (ret) return ret; if (stopCount) *stopCount = nodes.count(); // start up the nodes again int waitTime = 12000; NDB_TICKS maxTime = NdbTick_CurrentMillisecond() + waitTime; for (unsigned i = 0; i < node_ids.size(); i++) { NodeId nodeId= node_ids[i]; 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; for (unsigned i = 0; i < node_ids.size(); i++) { int result = start(node_ids[i]); } return 0;}/* * Perform restart of all DB nodes */int MgmtSrvr::restartDB(bool nostart, bool initialStart, bool abort, int * stopCount){ NodeBitmask nodes; Vector<NodeId> node_ids; int tmp; int ret = sendSTOP_REQ(node_ids, nodes, 0, abort, true, true, true, initialStart, &tmp); 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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -