===== ndb/include/kernel/signaldata/DumpStateOrd.hpp 1.10 vs edited =====
--- 1.10/ndb/include/kernel/signaldata/DumpStateOrd.hpp	2007-01-12 03:12:09 +07:00
+++ edited/ndb/include/kernel/signaldata/DumpStateOrd.hpp	2007-02-14 08:01:26 +07:00
@@ -107,6 +107,10 @@ public:
     CmvmiDumpLongSignalMemory = 2601,
     CmvmiSetRestartOnErrorInsert = 2602,
     CmvmiTestLongSigWithDelay = 2603,
+    CmvmiDumpSubscriptions = 2604, /* note: done to respective outfile
+                                      to be able to debug if events
+                                      for some reason does not end up
+                                      in clusterlog */
     // 7000 DIH
     // 7001 DIH
     // 7002 DIH
===== ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 1.30 vs edited =====
--- 1.30/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp	2007-01-18 03:18:46 +07:00
+++ edited/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp	2007-02-14 09:18:00 +07:00
@@ -897,7 +897,7 @@ void Cmvmi::execSET_VAR_REQ(Signal* sign
   case TimeToWaitAlive:
 
     // QMGR
-  case HeartbeatIntervalDbDb: // TODO ev till Ndbcnt också
+  case HeartbeatIntervalDbDb: // TODO possibly Ndbcnt too
   case HeartbeatIntervalDbApi:
   case ArbitTimeout:
     sendSignal(QMGR_REF, GSN_SET_VAR_REQ, signal, 3, JBB);
@@ -1105,6 +1105,24 @@ Cmvmi::execDUMP_STATE_ORD(Signal* signal
     }
   }
   
+  if (arg == DumpStateOrd::CmvmiDumpSubscriptions)
+  {
+    SubscriberPtr ptr;
+    subscribers.first(ptr);  
+    g_eventLogger.info("List subscriptions:");
+    while(ptr.i != RNIL)
+    {
+      g_eventLogger.info("Subscription: %u, nodeId: %u, ref: 0x%x",
+                         ptr.i,  refToNode(ptr.p->blockRef), ptr.p->blockRef);
+      for(Uint32 i = 0; i < LogLevel::LOGLEVEL_CATEGORIES; i++)
+      {
+        Uint32 level = ptr.p->logLevel.getLogLevel((LogLevel::EventCategory)i);
+        g_eventLogger.info("Category %u Level %u", i, level);
+      }
+      subscribers.next(ptr);
+    }
+  }
+
   if (arg == DumpStateOrd::CmvmiDumpLongSignalMemory){
     infoEvent("Cmvmi: g_sectionSegmentPool size: %d free: %d",
 	      g_sectionSegmentPool.getSize(),
===== ndb/src/mgmsrv/MgmtSrvr.cpp 1.111 vs edited =====
--- 1.111/ndb/src/mgmsrv/MgmtSrvr.cpp	2007-01-23 11:44:36 +07:00
+++ edited/ndb/src/mgmsrv/MgmtSrvr.cpp	2007-02-14 07:57:31 +07:00
@@ -704,7 +704,7 @@ int MgmtSrvr::okToSendTo(NodeId nodeId, 
     return WRONG_PROCESS_TYPE;
   // Check if we have contact with it
   if(unCond){
-    if(theFacade->theClusterMgr->getNodeInfo(nodeId).connected)
+    if(theFacade->theClusterMgr->getNodeInfo(nodeId).m_api_reg_conf)
       return 0;
   }
   else if (theFacade->get_node_alive(nodeId) == true)
@@ -1562,32 +1562,62 @@ MgmtSrvr::status(int nodeId, 
 }
 
 int 
-MgmtSrvr::setEventReportingLevelImpl(int nodeId, 
+MgmtSrvr::setEventReportingLevelImpl(int nodeId_arg, 
 				     const EventSubscribeReq& ll)
 {
   SignalSender ss(theFacade);
-  ss.lock();
-
-  SimpleSignal ssig;
-  EventSubscribeReq * dst = 
-    CAST_PTR(EventSubscribeReq, ssig.getDataPtrSend());
-  ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ,
-	   EventSubscribeReq::SignalLength);
-  *dst = ll;
-
-  NodeBitmask nodes;
+  NdbNodeBitmask nodes;
+  int retries = 30;
   nodes.clear();
-  Uint32 max = (nodeId == 0) ? (nodeId = 1, MAX_NDB_NODES) : nodeId;
-  for(; (Uint32) nodeId <= max; nodeId++)
+  while (1)
   {
-    if (nodeTypes[nodeId] != NODE_TYPE_DB)
-      continue;
-    if (okToSendTo(nodeId, true))
-      continue;
-    if (ss.sendSignal(nodeId, &ssig) == SEND_OK)
+    Uint32 nodeId, max;
+    ss.lock();
+    SimpleSignal ssig;
+    EventSubscribeReq * dst = 
+      CAST_PTR(EventSubscribeReq, ssig.getDataPtrSend());
+    ssig.set(ss,TestOrd::TraceAPI, CMVMI, GSN_EVENT_SUBSCRIBE_REQ,
+             EventSubscribeReq::SignalLength);
+    *dst = ll;
+
+    nodeId = nodeId_arg;
+    max = (nodeId == 0) ? (nodeId = 1, MAX_NDB_NODES) : nodeId;
+    for(; nodeId <= max; nodeId++)
     {
-      nodes.set(nodeId);
+      if (nodeTypes[nodeId] != NODE_TYPE_DB)
+        continue;
+      if (okToSendTo(nodeId, true))
+      {
+        if (theFacade->theClusterMgr->getNodeInfo(nodeId).connected  == false)
+        {
+          // node not connected we can safely skip this one
+          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;
+    }
+
+    nodeId = nodeId_arg;
+    max = (nodeId == 0) ? (nodeId = 1, MAX_NDB_NODES) : nodeId;
+    for(; (Uint32) nodeId <= max; nodeId++)
+    {
+      if (nodeTypes[nodeId] != NODE_TYPE_DB)
+        continue;
+      if (ss.sendSignal(nodeId, &ssig) == SEND_OK)
+        nodes.set(nodeId);
+    }
+    break;
   }
 
   if (nodes.isclear())
@@ -1598,6 +1628,7 @@ MgmtSrvr::setEventReportingLevelImpl(int
   int error = 0;
   while (!nodes.isclear())
   {
+    Uint32 nodeId;
     SimpleSignal *signal = ss.waitFor();
     int gsn = signal->readSignalNumber();
     nodeId = refToNode(signal->header.theSendersBlockRef);
===== ndb/src/ndbapi/ClusterMgr.cpp 1.31 vs edited =====
--- 1.31/ndb/src/ndbapi/ClusterMgr.cpp	2007-01-23 11:44:36 +07:00
+++ edited/ndb/src/ndbapi/ClusterMgr.cpp	2007-02-13 12:58:18 +07:00
@@ -327,7 +327,7 @@ ClusterMgr::showState(NodeId nodeId){
 ClusterMgr::Node::Node()
   : m_state(NodeState::SL_NOTHING) { 
   compatible = nfCompleteRep = true;
-  connected = defined = m_alive = false; 
+  connected = defined = m_alive = m_api_reg_conf = false; 
   m_state.m_connected_nodes.clear();
 }
 
@@ -401,6 +401,8 @@ ClusterMgr::execAPI_REGCONF(const Uint32
 					      node.m_info.m_version);
   }
 
+  node.m_api_reg_conf = true;
+
   node.m_state = apiRegConf->nodeState;
   if (node.compatible && (node.m_state.startLevel == NodeState::SL_STARTED  ||
 			  node.m_state.startLevel == NodeState::SL_SINGLEUSER)){
@@ -519,6 +521,7 @@ ClusterMgr::reportDisconnected(NodeId no
 
   noOfConnectedNodes--;
   theNodes[nodeId].connected = false;
+  theNodes[nodeId].m_api_reg_conf = false;
   theNodes[nodeId].m_state.m_connected_nodes.clear();
 
   reportNodeFailed(nodeId, true);
===== ndb/src/ndbapi/ClusterMgr.hpp 1.13 vs edited =====
--- 1.13/ndb/src/ndbapi/ClusterMgr.hpp	2007-01-23 11:44:36 +07:00
+++ edited/ndb/src/ndbapi/ClusterMgr.hpp	2007-02-14 07:55:12 +07:00
@@ -65,6 +65,7 @@ public:
     bool compatible;    // Version is compatible
     bool nfCompleteRep; // NF Complete Rep has arrived
     bool m_alive;       // Node is alive
+    bool m_api_reg_conf;// API_REGCONF has arrived
     
     NodeInfo  m_info;
     NodeState m_state;
===== ndb/src/ndbapi/TransporterFacade.cpp 1.44 vs edited =====
--- 1.44/ndb/src/ndbapi/TransporterFacade.cpp	2006-12-24 02:04:18 +07:00
+++ edited/ndb/src/ndbapi/TransporterFacade.cpp	2007-02-14 07:52:04 +07:00
@@ -805,6 +805,8 @@ TransporterFacade::sendSignal(NdbApiSign
   Uint32 Tlen = aSignal->theLength;
   Uint32 TBno = aSignal->theReceiversBlockNumber;
   if(getIsNodeSendable(aNode) == true){
+    assert(theClusterMgr->getNodeInfo(aNode).m_api_reg_conf == true ||
+           aSignal->theVerId_signalNumber == GSN_API_REGREQ);
 #ifdef API_TRACE
     if(setSignalLog() && TRACE_GSN(aSignal->theVerId_signalNumber)){
       Uint32 tmp = aSignal->theSendersBlockRef;
