⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mgmtsrvr.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  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 + -