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

📄 ndbrestarter.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <NdbRestarter.hpp>#include <NdbOut.hpp>#include <NdbSleep.h>#include <NdbTick.h>#include <mgmapi_debug.h>#include <NDBT_Output.hpp>#include <random.h>#include <kernel/ndb_limits.h>#include <ndb_version.h>#define MGMERR(h) \  ndbout << "latest_error="<<ndb_mgm_get_latest_error(h) \	 << ", line="<<ndb_mgm_get_latest_error_line(h) \	 << endl;NdbRestarter::NdbRestarter(const char* _addr):   connected(false),  handle(NULL),  m_config(0){  if (_addr == NULL){    addr.assign("");  } else {    addr.assign(_addr);  }}NdbRestarter::~NdbRestarter(){  disconnect();}int NdbRestarter::getDbNodeId(int _i){  if (!isConnected())    return -1;  if (getStatus() != 0)    return -1;  for(size_t i = 0; i < ndbNodes.size(); i++){         if (i == (unsigned)_i){      return ndbNodes[i].node_id;    }  }  return -1;}intNdbRestarter::restartOneDbNode(int _nodeId,			       bool inital,			       bool nostart,			       bool abort){  if (!isConnected())    return -1;  int ret = 0;    if ((ret = ndb_mgm_restart2(handle, 1, &_nodeId,			      inital, nostart, abort)) <= 0) {    /**     * ndb_mgm_restart2 returned error, one reason could     * be that the node have not stopped fast enough!     * Check status of the node to see if it's on the      * way down. If that's the case ignore the error     */     if (getStatus() != 0)      return -1;    g_info << "ndb_mgm_restart2 returned with error, checking node state" << endl;    for(size_t i = 0; i < ndbNodes.size(); i++){      if(ndbNodes[i].node_id == _nodeId){	g_info <<_nodeId<<": status="<<ndbNodes[i].node_status<<endl;	/* Node found check state */	switch(ndbNodes[i].node_status){	case NDB_MGM_NODE_STATUS_RESTARTING:	case NDB_MGM_NODE_STATUS_SHUTTING_DOWN:	  return 0;	default:	  break;	}      }    }        MGMERR(handle);    g_err  << "Could not stop node with id = "<< _nodeId << endl;    return -1;  }  return 0;}intNdbRestarter::getMasterNodeId(){  if (!isConnected())    return -1;    if (getStatus() != 0)    return -1;    int min = 0;  int node = -1;  for(size_t i = 0; i < ndbNodes.size(); i++){    if(min == 0 || ndbNodes[i].dynamic_id < min){      min = ndbNodes[i].dynamic_id;      node = ndbNodes[i].node_id;    }  }  return node;}intNdbRestarter::getRandomNotMasterNodeId(int rand){  int master = getMasterNodeId();  if(master == -1)    return -1;  Uint32 counter = 0;  rand = rand % ndbNodes.size();  while(counter++ < ndbNodes.size() && ndbNodes[rand].node_id == master)    rand = (rand + 1) % ndbNodes.size();    if(ndbNodes[rand].node_id != master)    return ndbNodes[rand].node_id;  return -1;}intNdbRestarter::getRandomNodeOtherNodeGroup(int nodeId, int rand){  if (!isConnected())    return -1;    if (getStatus() != 0)    return -1;    int node_group = -1;  for(size_t i = 0; i < ndbNodes.size(); i++){    if(ndbNodes[i].node_id == nodeId){      node_group = ndbNodes[i].node_group;      break;    }  }  if(node_group == -1){    return -1;  }  Uint32 counter = 0;  rand = rand % ndbNodes.size();  while(counter++ < ndbNodes.size() && ndbNodes[rand].node_group == node_group)    rand = (rand + 1) % ndbNodes.size();    if(ndbNodes[rand].node_group != node_group)    return ndbNodes[rand].node_id;  return -1;}intNdbRestarter::getRandomNodeSameNodeGroup(int nodeId, int rand){  if (!isConnected())    return -1;    if (getStatus() != 0)    return -1;    int node_group = -1;  for(size_t i = 0; i < ndbNodes.size(); i++){    if(ndbNodes[i].node_id == nodeId){      node_group = ndbNodes[i].node_group;      break;    }  }  if(node_group == -1){    return -1;  }  Uint32 counter = 0;  rand = rand % ndbNodes.size();  while(counter++ < ndbNodes.size() && 	(ndbNodes[rand].node_id == nodeId || 	 ndbNodes[rand].node_group != node_group))    rand = (rand + 1) % ndbNodes.size();    if(ndbNodes[rand].node_group == node_group &&     ndbNodes[rand].node_id != nodeId)    return ndbNodes[rand].node_id;    return -1;}int NdbRestarter::waitClusterStarted(unsigned int _timeout){  return waitClusterState(NDB_MGM_NODE_STATUS_STARTED, _timeout);}int NdbRestarter::waitClusterStartPhase(int _startphase, unsigned int _timeout){  return waitClusterState(NDB_MGM_NODE_STATUS_STARTING, _timeout, _startphase);}int NdbRestarter::waitClusterSingleUser(unsigned int _timeout){  return waitClusterState(NDB_MGM_NODE_STATUS_SINGLEUSER, _timeout);}int NdbRestarter::waitClusterNoStart(unsigned int _timeout){  return waitClusterState(NDB_MGM_NODE_STATUS_NOT_STARTED, _timeout);}int NdbRestarter::waitClusterState(ndb_mgm_node_status _status,			       unsigned int _timeout,			       int _startphase){  int nodes[MAX_NDB_NODES];  int numNodes = 0;  if (getStatus() != 0)    return -1;    // Collect all nodes into nodes  for (size_t i = 0; i < ndbNodes.size(); i++){    nodes[i] = ndbNodes[i].node_id;    numNodes++;  }  return waitNodesState(nodes, numNodes, _status, _timeout, _startphase);} int NdbRestarter::waitNodesState(int * _nodes, int _num_nodes,			     ndb_mgm_node_status _status,			     unsigned int _timeout,			     int _startphase){    if (!isConnected()){    g_err << "!isConnected"<<endl;    return -1;  }  unsigned int attempts = 0;  unsigned int resetAttempts = 0;  const unsigned int MAX_RESET_ATTEMPTS = 10;  bool allInState = false;      while (allInState == false){    if (_timeout > 0 && attempts > _timeout){      /**       * Timeout has expired waiting for the nodes to enter       * the state we want       */      bool waitMore = false;      /**        * Make special check if we are waiting for        * cluster to become started       */      if(_status == NDB_MGM_NODE_STATUS_STARTED){	waitMore = true;	/**	 * First check if any node is not starting	 * then it's no idea to wait anymore	 */	for (size_t n = 0; n < ndbNodes.size(); n++){	  if (ndbNodes[n].node_status != NDB_MGM_NODE_STATUS_STARTED &&	      ndbNodes[n].node_status != NDB_MGM_NODE_STATUS_STARTING)	    waitMore = false;	}      }       if (!waitMore || resetAttempts > MAX_RESET_ATTEMPTS){	g_err << "waitNodeState("	      << ndb_mgm_get_node_status_string(_status)	      <<", "<<_startphase<<")"	      << " timeout after " << attempts <<" attemps" << endl;	return -1;      }       g_err << "waitNodeState("	    << ndb_mgm_get_node_status_string(_status)	    <<", "<<_startphase<<")"	    << " resetting number of attempts "	    << resetAttempts << endl;      attempts = 0;      resetAttempts++;          }    allInState = true;    if (getStatus() != 0){      g_err << "getStatus != 0" << endl;      return -1;    }    // ndbout << "waitNodeState; _num_nodes = " << _num_nodes << endl;    // for (int i = 0; i < _num_nodes; i++)    //   ndbout << " node["<<i<<"] =" <<_nodes[i] << endl;    for (int i = 0; i < _num_nodes; i++){      ndb_mgm_node_state* ndbNode = NULL;      for (size_t n = 0; n < ndbNodes.size(); n++){	if (ndbNodes[n].node_id == _nodes[i])	  ndbNode = &ndbNodes[n];      }      if(ndbNode == NULL){	allInState = false;	continue;      }      g_info << "State node " << ndbNode->node_id << " "	     << ndb_mgm_get_node_status_string(ndbNode->node_status)<< endl;      assert(ndbNode != NULL);      if(_status == NDB_MGM_NODE_STATUS_STARTING && 	 ((ndbNode->node_status == NDB_MGM_NODE_STATUS_STARTING && 	   ndbNode->start_phase >= _startphase) ||	  (ndbNode->node_status == NDB_MGM_NODE_STATUS_STARTED)))	continue;      if (_status == NDB_MGM_NODE_STATUS_STARTING){	g_info << "status = "  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -