Commit 96fe14dd authored by unknown's avatar unknown
Browse files

Bug #20336 CLUSTERLOG commands have no effect


ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp:
  Bug #20336 CLUSTERLOG commands have no effect
  - with signal sender the clock issuing the command and the revceiver of the events are not the same
ndb/src/mgmsrv/MgmtSrvr.cpp:
  Bug #20336 CLUSTERLOG commands have no effect
  - make sure to actually send the update to ndb nodes, and wait for the reply
ndb/src/mgmsrv/Services.cpp:
  Bug #20336 CLUSTERLOG commands have no effect
  - make sure to compute max every time for log level
parent a2f26487
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -226,6 +226,7 @@ void Cmvmi::execEVENT_REP(Signal* signal)
void
Cmvmi::execEVENT_SUBSCRIBE_REQ(Signal * signal){
  EventSubscribeReq * subReq = (EventSubscribeReq *)&signal->theData[0];
  Uint32 senderRef = signal->getSendersBlockRef();
  SubscriberPtr ptr;
  jamEntry();
  DBUG_ENTER("Cmvmi::execEVENT_SUBSCRIBE_REQ");
@@ -243,7 +244,7 @@ Cmvmi::execEVENT_SUBSCRIBE_REQ(Signal * signal){
     * Create a new one
     */
    if(subscribers.seize(ptr) == false){
      sendSignal(subReq->blockRef, GSN_EVENT_SUBSCRIBE_REF, signal, 1, JBB);
      sendSignal(senderRef, GSN_EVENT_SUBSCRIBE_REF, signal, 1, JBB);
      return;
    }
    ptr.p->logLevel.clear();
@@ -270,7 +271,7 @@ Cmvmi::execEVENT_SUBSCRIBE_REQ(Signal * signal){
  }
  
  signal->theData[0] = ptr.i;
  sendSignal(ptr.p->blockRef, GSN_EVENT_SUBSCRIBE_CONF, signal, 1, JBB);
  sendSignal(senderRef, GSN_EVENT_SUBSCRIBE_CONF, signal, 1, JBB);
  DBUG_VOID_RETURN;
}

+28 −27
Original line number Diff line number Diff line
@@ -1274,7 +1274,8 @@ int
MgmtSrvr::setEventReportingLevelImpl(int nodeId, 
				     const EventSubscribeReq& ll)
{
  INIT_SIGNAL_SENDER(ss,nodeId);
  SignalSender ss(theFacade);
  ss.lock();

  SimpleSignal ssig;
  EventSubscribeReq * dst = 
@@ -1283,41 +1284,54 @@ MgmtSrvr::setEventReportingLevelImpl(int nodeId,
	   EventSubscribeReq::SignalLength);
  *dst = ll;

  send(ss,ssig,nodeId,NODE_TYPE_DB);
  NodeBitmask nodes;
  nodes.clear();
  Uint32 max = (nodeId == 0) ? (nodeId = 1, MAX_NDB_NODES) : nodeId;
  for(; nodeId <= max; nodeId++)
  {
    if (nodeTypes[nodeId] != NODE_TYPE_DB)
      continue;
    if (okToSendTo(nodeId, false))
      continue;
    if (ss.sendSignal(nodeId, &ssig) == SEND_OK)
    {
      nodes.set(nodeId);
    }
  }

#if 0
  while (1)
  int error = 0;
  while (!nodes.isclear())
  {
    SimpleSignal *signal = ss.waitFor();
    int gsn = signal->readSignalNumber();
    nodeId = refToNode(signal->header.theSendersBlockRef);
    switch (gsn) {
    case GSN_EVENT_SUBSCRIBE_CONF:{
      nodes.clear(nodeId);
      break;
    }
    case GSN_EVENT_SUBSCRIBE_REF:{
      return SEND_OR_RECEIVE_FAILED;
      nodes.clear(nodeId);
      error = 1;
      break;
    }
    case GSN_NF_COMPLETEREP:{
      const NFCompleteRep * const rep =
	CAST_CONSTPTR(NFCompleteRep, signal->getDataPtr());
      if (rep->failedNodeId == nodeId)
	return SEND_OR_RECEIVE_FAILED;
      nodes.clear(rep->failedNodeId);
      break;
    }
    case GSN_NODE_FAILREP:{
      const NodeFailRep * const rep =
	CAST_CONSTPTR(NodeFailRep, signal->getDataPtr());
      if (NodeBitmask::get(rep->theNodes,nodeId))
	return SEND_OR_RECEIVE_FAILED;
      // ignore, NF_COMPLETEREP will arrive later
      break;
    }
    default:
      report_unknown_signal(signal);
      return SEND_OR_RECEIVE_FAILED;
    }

  }
#endif
  if (error)
    return SEND_OR_RECEIVE_FAILED;
  return 0;
}

@@ -1337,19 +1351,6 @@ MgmtSrvr::setNodeLogLevelImpl(int nodeId, const SetLogLevelOrd & ll)
  return ss.sendSignal(nodeId, &ssig) == SEND_OK ? 0 : SEND_OR_RECEIVE_FAILED;
}

int
MgmtSrvr::send(SignalSender &ss, SimpleSignal &ssig, Uint32 node, Uint32 node_type){
  Uint32 max = (node == 0) ? MAX_NODES : node + 1;
  
  for(; node < max; node++){
    while(nodeTypes[node] != (int)node_type && node < max) node++;
    if(nodeTypes[node] != (int)node_type)
      break;
    ss.sendSignal(node, &ssig);
  }
  return 0;
}

//****************************************************************************
//****************************************************************************

+0 −2
Original line number Diff line number Diff line
@@ -472,8 +472,6 @@ public:
private:
  //**************************************************************************

  int send(SignalSender &ss, SimpleSignal &ssig, Uint32 node, Uint32 node_type);

  int sendSTOP_REQ(NodeId nodeId,
		   NodeBitmask &stoppedNodes,
		   Uint32 singleUserNodeId,
+7 −5
Original line number Diff line number Diff line
@@ -763,9 +763,8 @@ MgmApiSession::setClusterLogLevel(Parser<MgmApiSession>::Context &,
  m_mgmsrv.m_event_listner.unlock();

  {
    LogLevel ll;
    ll.setLogLevel(category,level);
    m_mgmsrv.m_event_listner.update_max_log_level(ll);
    LogLevel tmp;
    m_mgmsrv.m_event_listner.update_max_log_level(tmp);
  }

  m_output->println(reply);
@@ -1248,8 +1247,11 @@ Ndb_mgmd_event_service::log(int eventType, const Uint32* theData, NodeId nodeId)
void
Ndb_mgmd_event_service::update_max_log_level(const LogLevel &log_level)
{
  LogLevel tmp= m_logLevel;
  tmp.set_max(log_level);
  LogLevel tmp = log_level;
  m_clients.lock();
  for(int i = m_clients.size() - 1; i >= 0; i--)
    tmp.set_max(m_clients[i].m_logLevel);
  m_clients.unlock();
  update_log_level(tmp);
}