===== 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-13 12:58:15 +07:00
@@ -897,7 +897,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);
@@ -1105,6 +1105,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(),
===== 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-13 13:30:52 +07:00
@@ -70,7 +70,7 @@
   SignalSender ss(theFacade); \
   ss.lock(); /* lock will be released on exit */ \
   {\
-    int result = okToSendTo(nodeId, true);\
+    int result = okToSendTo(nodeId, false);\
     if (result != 0) {\
       return result;\
     }\
@@ -707,7 +707,7 @@
     if(theFacade->theClusterMgr->getNodeInfo(nodeId).connected)
       return 0;
   }
-  else if (theFacade->get_node_alive(nodeId) == true)
+  else if (theFacade->theClusterMgr->getNodeInfo(nodeId).m_api_reg_conf == true)
     return 0;
   return NO_CONTACT_WITH_PROCESS;
 }
@@ -1067,7 +1067,7 @@
     nodeId= 0;
     while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB))
     {
-      if(okToSendTo(nodeId, true) == 0)
+      if(okToSendTo(nodeId, false) == 0)
       {
 	SendStatus result = ss.sendSignal(nodeId, &ssig);
 	if (result == SEND_OK)
@@ -1085,14 +1085,14 @@
       assert(nodes.count() == 0);
       if (use_master_node)
         nodeId= m_master_node;
-      if ((r= okToSendTo(nodeId, true)) != 0)
+      if ((r= okToSendTo(nodeId, false)) != 0)
       {
         bool next;
         if (!use_master_node)
           DBUG_RETURN(r);
         m_master_node= nodeId= 0;
         while((next= getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)) == true &&
-              (r= okToSendTo(nodeId, true)) != 0);
+              (r= okToSendTo(nodeId, false)) != 0);
         if (!next)
           DBUG_RETURN(NO_CONTACT_WITH_DB_NODES);
       }
@@ -1448,7 +1448,7 @@
   resumeReq->senderRef = ss.getOwnRef();
 
   while(getNextNodeId(&nodeId, NDB_MGM_NODE_TYPE_NDB)){
-    if(okToSendTo(nodeId, true) == 0){
+    if(okToSendTo(nodeId, false) == 0){
       SendStatus result = ss.sendSignal(nodeId, &ssig);
       if (result == SEND_OK)
 	count++;
@@ -1562,32 +1562,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;
-
-  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, 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++)
+    {
+      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 @@
   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::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 @@
 					      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 @@
 
   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-13 12:58:18 +07:00
@@ -65,6 +65,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;
