Commit cfee84be authored by unknown's avatar unknown
Browse files

multi node shutdown adabtions for restart of management servers

parent 1de7807d
Loading
Loading
Loading
Loading
+31 −22
Original line number Diff line number Diff line
@@ -987,35 +987,37 @@ int MgmtSrvr::sendSTOP_REQ(const Vector<NodeId> &node_ids,

  // send the signals
  NodeBitmask nodes;
  NodeId nodeId;
  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++)
      nodes_to_stop.set(node_ids[i]);
  }
  if (node_ids.size())
  {
    do_send= 1;
    if (node_ids.size() == 1)
    {
      nodeId= node_ids[0];
      if (nodeId == getOwnNodeId())
    {
        if (restart)
          g_RestartServer= true;
        g_StopServer= true;
        DBUG_RETURN(0);
      }
      else if (getNodeType(nodeId) == NDB_MGM_NODE_TYPE_MGM)
      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);
        DBUG_RETURN(error);
      }
      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
      {
@@ -1024,6 +1026,7 @@ int MgmtSrvr::sendSTOP_REQ(const Vector<NodeId> &node_ids,
        StopReq::setStopNodes(stopReq->requestInfo, 1);
      }
    }
  }
  else
  {
    nodeId= 0;
@@ -1105,7 +1108,7 @@ int MgmtSrvr::sendSTOP_REQ(const Vector<NodeId> &node_ids,
      }
      else
      {
        assert(node_ids.size() > 1);
        assert(no_of_nodes_to_stop > 1);
        stoppedNodes.bitOR(nodes_to_stop);
      }
      nodes.clear(nodeId);
@@ -1150,6 +1153,12 @@ int MgmtSrvr::sendSTOP_REQ(const Vector<NodeId> &node_ids,
      DBUG_RETURN(SEND_OR_RECEIVE_FAILED);
    }
  }
  if (!error && do_stop_self)
  {
    if (restart)
      g_RestartServer= true;
    g_StopServer= true;
  }
  DBUG_RETURN(error);
}

+0 −23
Original line number Diff line number Diff line
@@ -1010,22 +1010,6 @@ MgmApiSession::stop(Parser<MgmApiSession>::Context &,
    nodes.push_back(atoi(p));
  }

  int stop_self= 0;
  size_t i;
  for(i=0; i < nodes.size(); i++) {
    if (nodes[i] == m_mgmsrv.getOwnNodeId()) {
      stop_self= 1;
      if (i != nodes.size()-1) {
	m_output->println("stop reply");
	m_output->println("result: server must be stopped last");
	m_output->println("");
	return;
      }
      nodes.erase(i);
      break;
    }
  }

  int stopped= 0;
  int result= 0;
  if (nodes.size())
@@ -1035,16 +1019,9 @@ MgmApiSession::stop(Parser<MgmApiSession>::Context &,
  if(result != 0)
    m_output->println("result: %s", get_error_text(result));
  else
  {
    m_output->println("result: Ok");
    if (stop_self)
      stopped++;
  }
  m_output->println("stopped: %d", stopped);
  m_output->println("");

  if (stop_self)
    g_StopServer= true;
}