Commit 5258da2a authored by tomas@whalegate.ndb.mysql.com's avatar tomas@whalegate.ndb.mysql.com
Browse files

Bug#29621 - ndb_mgmd can timeout logevent request, making it to fail

parent 2b489b89
Loading
Loading
Loading
Loading
+52 −30
Original line number Diff line number Diff line
@@ -119,7 +119,11 @@ operator<<(NdbOut& out, const LogLevel & ll)
void
MgmtSrvr::logLevelThreadRun() 
{
  while (!_isStopThread) {
  while (!_isStopThread) 
  {
    Vector<NodeId> failed_started_nodes;
    Vector<EventSubscribeReq> failed_log_level_requests;

    /**
     * Handle started nodes
     */
@@ -145,13 +149,14 @@ MgmtSrvr::logLevelThreadRun()

        if (setEventReportingLevelImpl(node, req))
        {
	  ndbout_c("setEventReportingLevelImpl(%d): failed", node);
          failed_started_nodes.push_back(node);
        }
	
        else
        {
          SetLogLevelOrd ord;
          ord = m_nodeLogLevel[node];
          setNodeLogLevelImpl(node, ord);

        }
        m_started_nodes.lock();
      }
    }
@@ -169,14 +174,17 @@ MgmtSrvr::logLevelThreadRun()
        req.blockRef = _ownReference;
        if (setEventReportingLevelImpl(0, req))
        {
	  ndbout_c("setEventReportingLevelImpl: failed 2!");
          failed_log_level_requests.push_back(req);
        }
      } 
      else 
      {
        SetLogLevelOrd ord;
        ord = req;
	setNodeLogLevelImpl(req.blockRef, ord);
        if (setNodeLogLevelImpl(req.blockRef, ord))
        {
          failed_log_level_requests.push_back(req);
        }
      }
      m_log_level_requests.lock();
    }      
@@ -185,7 +193,28 @@ MgmtSrvr::logLevelThreadRun()
    if(!ERROR_INSERTED(10000))
      m_event_listner.check_listeners();

    NdbSleep_MilliSleep(_logLevelThreadSleep);  
    Uint32 sleeptime = _logLevelThreadSleep;
    if (failed_started_nodes.size())
    {
      m_started_nodes.lock();
      for (Uint32 i = 0; i<failed_started_nodes.size(); i++)
        m_started_nodes.push_back(failed_started_nodes[i], false);
      m_started_nodes.unlock();
      failed_started_nodes.clear();
      sleeptime = 100;
    }

    if (failed_log_level_requests.size())
    {
      m_log_level_requests.lock();
      for (Uint32 i = 0; i<failed_log_level_requests.size(); i++)
        m_log_level_requests.push_back(failed_log_level_requests[i], false);
      m_log_level_requests.unlock();
      failed_log_level_requests.clear();
      sleeptime = 100;
    }

    NdbSleep_MilliSleep(sleeptime);
  }
}

@@ -1535,7 +1564,6 @@ MgmtSrvr::setEventReportingLevelImpl(int nodeId_arg,
{
  SignalSender ss(theFacade);
  NdbNodeBitmask nodes;
  int retries = 30;
  nodes.clear();
  while (1)
  {
@@ -1572,19 +1600,9 @@ MgmtSrvr::setEventReportingLevelImpl(int nodeId_arg,
          continue;
        }
        // api_reg_conf not recevied yet, need to retry
        break;
      }
    }
    if (nodeId <= max)
    {
      if (--retries)
      {
        ss.unlock();
        NdbSleep_MilliSleep(100);  
        continue;
      }
        return SEND_OR_RECEIVE_FAILED;
      }
    }

    if (nodeId_arg == 0)
    {
@@ -1607,6 +1625,10 @@ MgmtSrvr::setEventReportingLevelImpl(int nodeId_arg,
        continue; // node is not connected, skip
      if (ss.sendSignal(nodeId, &ssig) == SEND_OK)
        nodes.set(nodeId);
      else if (max == nodeId)
      {
        return SEND_OR_RECEIVE_FAILED;
      }
    }
    break;
  }
@@ -2988,8 +3010,8 @@ int MgmtSrvr::connect_to_self(void)
  return 0;
}



template class Vector<unsigned short>;
template class MutexVector<unsigned short>;
template class MutexVector<Ndb_mgmd_event_service::Event_listener>;
template class Vector<EventSubscribeReq>;
template class MutexVector<EventSubscribeReq>;