===== storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp 1.43 vs edited =====
--- 1.43/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp	2007-02-06 04:13:43 +07:00
+++ edited/storage/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp	2007-02-13 11:42:18 +07:00
@@ -924,7 +924,7 @@
   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);
@@ -1132,6 +1132,24 @@
     }
   }
   
+  if (arg == 2604)
+  {
+    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(),
===== storage/ndb/src/mgmsrv/MgmtSrvr.cpp 1.119 vs edited =====
--- 1.119/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2007-02-06 04:13:44 +07:00
+++ edited/storage/ndb/src/mgmsrv/MgmtSrvr.cpp	2007-02-13 11:19:33 +07:00
@@ -1593,32 +1593,62 @@
 }
 
 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;
-
   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++)
+    {
+      if (nodeTypes[nodeId] != NODE_TYPE_DB)
+        continue;
+      if (theFacade->theClusterMgr->getNodeInfo(nodeId).m_api_reg_conf  == false)
+      {
+        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++)
     {
-      nodes.set(nodeId);
+      if (nodeTypes[nodeId] != NODE_TYPE_DB)
+        continue;
+      if (ss.sendSignal(nodeId, &ssig) == SEND_OK)
+        nodes.set(nodeId);
     }
+    break;
   }
 
   if (nodes.isclear())
@@ -1629,6 +1659,7 @@
   int error = 0;
   while (!nodes.isclear())
   {
+    Uint32 nodeId;
     SimpleSignal *signal = ss.waitFor();
     int gsn = signal->readSignalNumber();
     nodeId = refToNode(signal->header.theSendersBlockRef);
===== storage/ndb/src/ndbapi/ClusterMgr.cpp 1.35 vs edited =====
--- 1.35/storage/ndb/src/ndbapi/ClusterMgr.cpp	2007-02-08 03:04:53 +07:00
+++ edited/storage/ndb/src/ndbapi/ClusterMgr.cpp	2007-02-13 10:39:23 +07:00
@@ -314,7 +314,7 @@
 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();
 }
 
@@ -402,6 +402,8 @@
      */
     memcpy(&node.m_state, &apiRegConf->nodeState, sizeof(node.m_state) - 24);
   }
+
+  node.m_api_reg_conf = true;
   
   if (node.compatible && (node.m_state.startLevel == NodeState::SL_STARTED  ||
 			  node.m_state.startLevel == NodeState::SL_SINGLEUSER)){
@@ -518,6 +520,7 @@
 
   noOfConnectedNodes--;
   theNodes[nodeId].connected = false;
+  theNodes[nodeId].m_api_reg_conf = false;
   theNodes[nodeId].m_state.m_connected_nodes.clear();
 
   reportNodeFailed(nodeId, true);
===== storage/ndb/src/ndbapi/ClusterMgr.hpp 1.17 vs edited =====
--- 1.17/storage/ndb/src/ndbapi/ClusterMgr.hpp	2007-02-08 03:04:53 +07:00
+++ edited/storage/ndb/src/ndbapi/ClusterMgr.hpp	2007-02-13 10:14:25 +07:00
@@ -70,6 +70,7 @@
     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;
