List:Commits« Previous MessageNext Message »
From:Bernhard Ocklin Date:August 8 2008 3:59pm
Subject:bzr commit into mysql-5.1-telco-6.3 branch (bocklin:2644)
View as plain text  
#At file:///home/ocklin/prg/mysql-5.1-telco-6.3/

 2644 Bernhard Ocklin	2008-08-08
      #38592 ndb_mgmd doesn't start due to epoll error. Jonas' implementation for fallback
to select.
modified:
  storage/ndb/src/common/transporter/TransporterRegistry.cpp

=== modified file 'storage/ndb/src/common/transporter/TransporterRegistry.cpp'
--- a/storage/ndb/src/common/transporter/TransporterRegistry.cpp	2008-06-11 20:28:21 +0000
+++ b/storage/ndb/src/common/transporter/TransporterRegistry.cpp	2008-08-08 13:57:51 +0000
@@ -95,17 +95,21 @@ TransporterRegistry::TransporterRegistry
   ioStates            = new IOState           [maxTransporters]; 
  
 #if defined(HAVE_EPOLL_CREATE)
- m_epoll_fd = 0;
+ m_epoll_fd = -1;
  m_epoll_events       = new struct epoll_event[maxTransporters];
  m_epoll_fd = epoll_create(maxTransporters);
  if (m_epoll_fd == -1 || !m_epoll_events)
  {
    /* Failure to allocate data or get epoll socket, abort */
-   perror("Failed to alloc epoll-array or calling epoll_create...giving up!");
-   abort();
+   perror("Failed to alloc epoll-array or calling epoll_create... falling back to
select!");
+   ndbout_c("Falling back to select");
  }
- memset((char*)m_epoll_events, 0,
-        maxTransporters * sizeof(struct epoll_event));
+ else
+ {
+   memset((char*)m_epoll_events, 0,
+          maxTransporters * sizeof(struct epoll_event));
+ }
+
 #endif
   // Initialize member variables
   nTransporters    = 0;
@@ -163,8 +167,8 @@ TransporterRegistry::~TransporterRegistr
   delete[] ioStates;
 
 #if defined(HAVE_EPOLL_CREATE)
-  delete [] m_epoll_events;
-  close(m_epoll_fd);
+  if (m_epoll_events) delete [] m_epoll_events;
+  if (m_epoll_fd != -1) close(m_epoll_fd);
 #endif
   if (m_mgm_handle)
     ndb_mgm_destroy_handle(&m_mgm_handle);
@@ -704,32 +708,37 @@ TransporterRegistry::pollReceive(Uint32 
 
 #ifdef NDB_TCP_TRANSPORTER
 #if defined(HAVE_EPOLL_CREATE)
-  Uint32 num_trps = nTCPTransporters;
-  /**
-   * If any transporters have left-over data that was not fully executed in
-   * last loop, don't wait and return 'data available' even if nothing new
-   * from epoll.
-   */
-  if (!m_has_data_transporters.isclear())
-  {
-    timeOutMillis = 0;
-    retVal = 1;
-  }
-  
-  if (num_trps)
-  {
-    tcpReadSelectReply = epoll_wait(m_epoll_fd, m_epoll_events,
-                                    num_trps, timeOutMillis);
-    retVal |= tcpReadSelectReply;
-  }
-#else
-  if(nTCPTransporters > 0 || retVal == 0)
+  if (likely(m_epoll_fd != -1))
   {
-    retVal |= poll_TCP(timeOutMillis);
+    Uint32 num_trps = nTCPTransporters;
+    /**
+     * If any transporters have left-over data that was not fully executed in
+     * last loop, don't wait and return 'data available' even if nothing new
+     * from epoll.
+     */
+    if (!m_has_data_transporters.isclear())
+    {
+      timeOutMillis = 0;
+      retVal = 1;
+    }
+    
+    if (num_trps)
+    {
+      tcpReadSelectReply = epoll_wait(m_epoll_fd, m_epoll_events,
+                                      num_trps, timeOutMillis);
+      retVal |= tcpReadSelectReply;
+    }
   }
   else
-    tcpReadSelectReply = 0;
 #endif
+  {
+    if(nTCPTransporters > 0 || retVal == 0)
+    {
+      retVal |= poll_TCP(timeOutMillis);
+    }
+    else
+      tcpReadSelectReply = 0;
+  }
 #endif
 #ifdef NDB_SCI_TRANSPORTER
   if(nSCITransporters > 0)
@@ -925,54 +934,59 @@ TransporterRegistry::performReceive()
 {
 #ifdef NDB_TCP_TRANSPORTER
 #if defined(HAVE_EPOLL_CREATE)
-  int num_socket_events = tcpReadSelectReply;
-  int i;
-
-  if (num_socket_events > 0)
+  if (likely(m_epoll_fd != -1))
   {
-    for (i = 0; i < num_socket_events; i++)
+    int num_socket_events = tcpReadSelectReply;
+    int i;
+    
+    if (num_socket_events > 0)
+    {
+      for (i = 0; i < num_socket_events; i++)
+      {
+        m_has_data_transporters.set(m_epoll_events[i].data.u32);
+      }
+    }
+    else if (num_socket_events < 0)
     {
-      m_has_data_transporters.set(m_epoll_events[i].data.u32);
+      assert(errno == EINTR);
+    }
+    
+    Uint32 id = 0;
+    while ((id = m_has_data_transporters.find(id + 1)) != BitmaskImpl::NotFound)
+    {
+      get_tcp_data((TCP_Transporter*)theTransporters[id]);
     }
   }
-  else if (num_socket_events < 0)
-  {
-    assert(errno == EINTR);
-  }
-  
-  Uint32 id = 0;
-  while ((id = m_has_data_transporters.find(id + 1)) != BitmaskImpl::NotFound)
-  {
-    get_tcp_data((TCP_Transporter*)theTransporters[id]);
-  }
-#else
-  for (int i=0; i<nTCPTransporters; i++) 
+  else
+#endif
   {
-    checkJobBuffer();
-    TCP_Transporter *t = theTCPTransporters[i];
-    const NodeId nodeId = t->getRemoteNodeId();
-    const NDB_SOCKET_TYPE socket    = t->getSocket();
-    if(is_connected(nodeId)){
-      if(t->isConnected())
-      {
-        if (FD_ISSET(socket, &tcpReadset))
-	{
-	  t->doReceive();
-        }
-
-        if (t->hasReceiveData())
+    for (int i=0; i<nTCPTransporters; i++) 
+    {
+      checkJobBuffer();
+      TCP_Transporter *t = theTCPTransporters[i];
+      const NodeId nodeId = t->getRemoteNodeId();
+      const NDB_SOCKET_TYPE socket    = t->getSocket();
+      if(is_connected(nodeId)){
+        if(t->isConnected())
         {
-          Uint32 * ptr;
-          Uint32 sz = t->getReceiveData(&ptr);
-          transporter_recv_from(callbackObj, nodeId);
-          Uint32 szUsed = unpack(ptr, sz, nodeId, ioStates[nodeId]);
-          t->updateReceiveDataPtr(szUsed);
-	}
-      } 
+          if (FD_ISSET(socket, &tcpReadset))
+          {
+            t->doReceive();
+          }
+          
+          if (t->hasReceiveData())
+          {
+            Uint32 * ptr;
+            Uint32 sz = t->getReceiveData(&ptr);
+            transporter_recv_from(callbackObj, nodeId);
+            Uint32 szUsed = unpack(ptr, sz, nodeId, ioStates[nodeId]);
+            t->updateReceiveDataPtr(szUsed);
+          }
+        } 
+      }
     }
   }
 #endif
-#endif
   
 #ifdef NDB_SCI_TRANSPORTER
   //performReceive
@@ -1168,11 +1182,14 @@ TransporterRegistry::report_connect(Node
   DBUG_PRINT("info",("performStates[%d]=CONNECTED",node_id));
   performStates[node_id] = CONNECTED;
 #if defined(HAVE_EPOLL_CREATE)
-  if (change_epoll((TCP_Transporter*)theTransporters[node_id],
-                   TRUE))
+  if (likely(m_epoll_fd != -1))
   {
-    performStates[node_id] = DISCONNECTING;
-    DBUG_VOID_RETURN;
+    if (change_epoll((TCP_Transporter*)theTransporters[node_id],
+                     TRUE))
+    {
+      performStates[node_id] = DISCONNECTING;
+      DBUG_VOID_RETURN;
+    }
   }
 #endif
   reportConnect(callbackObj, node_id);

Thread
bzr commit into mysql-5.1-telco-6.3 branch (bocklin:2644) Bernhard Ocklin8 Aug