Commit 09a73ff5 authored by unknown's avatar unknown
Browse files

BUG#20575 If the stopped node ids are transmitted to ndbd,

          the following start, stop and restart operations aren't execute correctly


ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp:
  Adding some source codes check node list whether or not stopped for STOP_REQ signal.
  If all of these nodes have stopped, then STOP_CONF signal will return.
ndb/src/mgmclient/CommandInterpreter.cpp:
  Ensure ndb_mgm can only transmit the valid range node id to management server.
  if the node id is greater than MAX_NODES, management server will exit abnormally.
ndb/src/mgmsrv/MgmtSrvr.cpp:
  Ensure management server can only transmit the data node id to data node process.
parent fd1b3e91
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -2273,7 +2273,33 @@ Ndbcntr::StopRecord::checkNodeFail(Signal* signal){
  {
    NdbNodeBitmask tmp;
    tmp.assign(NdbNodeBitmask::Size, stopReq.nodes);

    NdbNodeBitmask ndbStopNodes;
    ndbStopNodes.assign(NdbNodeBitmask::Size, stopReq.nodes);
    ndbStopNodes.bitAND(ndbMask);
    ndbStopNodes.copyto(NdbNodeBitmask::Size, stopReq.nodes);

    ndbMask.bitANDC(tmp);

    bool allNodesStopped = true;
    int i ;
    for( i = 0; i<  NdbNodeBitmask::Size; i++ ){
      if ( stopReq.nodes[i] != 0 ){
        allNodesStopped = false;
        break;
      }
    }
  
    if ( allNodesStopped ) {
      StopConf * const stopConf = (StopConf *)&signal->theData[0];
      stopConf->senderData = stopReq.senderData;
      stopConf->nodeState  = (Uint32) NodeState::SL_NOTHING;
      cntr.sendSignal(stopReq.senderRef, GSN_STOP_CONF, signal,
                       StopConf::SignalLength, JBB);
      stopReq.senderRef = 0;
      return false;
    }

  }
  else
  {
+1 −1
Original line number Diff line number Diff line
@@ -1091,7 +1091,7 @@ CommandInterpreter::execute_impl(const char *_line, bool interactive)
      int node_id;
      if (convert(command_list[pos].c_str(), node_id))
      {
        if (node_id <= 0) {
        if (node_id <= 0 || node_id > MAX_NODES) {
          ndbout << "Invalid node ID: " << command_list[pos].c_str()
                 << "." << endl;
          DBUG_RETURN(true);
+5 −0
Original line number Diff line number Diff line
@@ -1014,6 +1014,11 @@ int MgmtSrvr::sendSTOP_REQ(const Vector<NodeId> &node_ids,
    {
      nodeId= node_ids[i];
      ndbout << "asked to stop " << nodeId << endl;

      if ((getNodeType(nodeId) != NDB_MGM_NODE_TYPE_MGM)
          &&(getNodeType(nodeId) != NDB_MGM_NODE_TYPE_NDB))
          return WRONG_PROCESS_TYPE;

      if (getNodeType(nodeId) != NDB_MGM_NODE_TYPE_MGM)
        nodes_to_stop.set(nodeId);
      else if (nodeId != getOwnNodeId())