List:Commits« Previous MessageNext Message »
From:Jonas Oreland Date:August 13 2008 10:28pm
Subject:bzr push into mysql-5.1 branch (jonas:2667 to 2668) Bug#38592
View as plain text  
 2668 Jonas Oreland	2008-08-13 [merge]
      merge 6.2 to 6.3
modified:
  storage/ndb/src/ndbapi/NdbScanOperation.cpp

 2667 Jonas Oreland	2008-08-13
      ndb - bug#38592 - handle epoll_create returning ENOSYS
        by falling back on 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-13 19:47:08 +0000
@@ -95,17 +95,31 @@ 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");
+   if (m_epoll_fd != -1)
+   {
+     close(m_epoll_fd);
+     m_epoll_fd = -1;
+   }
+   if (m_epoll_events)
+   {
+     delete [] m_epoll_events;
+     m_epoll_events = 0;
+   }
  }
- 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 +177,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 +718,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 +944,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 +1192,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);

=== modified file 'storage/ndb/src/ndbapi/NdbScanOperation.cpp'
--- a/storage/ndb/src/ndbapi/NdbScanOperation.cpp	2008-08-11 12:46:21 +0000
+++ b/storage/ndb/src/ndbapi/NdbScanOperation.cpp	2008-08-13 20:04:48 +0000
@@ -2115,7 +2115,7 @@ NdbScanOperation::takeOverScanOp(Operati
    */
   Uint32 infoword= 0;
   Uint32 len= 0;
-  const Uint32 *src= NULL;
+  const char *src= NULL;
 
   Uint32 idx= m_current_api_receiver;
   if (idx >= m_api_receivers_count)
@@ -2123,7 +2123,7 @@ NdbScanOperation::takeOverScanOp(Operati
   const NdbReceiver *receiver= m_api_receivers[m_current_api_receiver];
 
   /* Get this row's KeyInfo data */
-  int res= receiver->get_keyinfo20(infoword, len, (const char*&) src);
+  int res= receiver->get_keyinfo20(infoword, len, src);
   if (res == -1)
     return NULL;
 
@@ -2163,11 +2163,10 @@ NdbScanOperation::takeOverScanOp(Operati
   
   // Copy the first 8 words of key info from KEYINF20 into TCKEYREQ
   TcKeyReq * tcKeyReq = CAST_PTR(TcKeyReq,newOp->theTCREQ->getDataPtrSend());
-  Uint32 i = 0;
-  for (i = 0; i < TcKeyReq::MaxKeyInfo && i < len; i++) {
-    tcKeyReq->keyInfo[i] = * src++;
-  }
-  
+  Uint32 i = MIN(TcKeyReq::MaxKeyInfo, len);
+  memcpy(tcKeyReq->keyInfo, src, 4*i);
+  src += i * 4;
+
   if(i < len){
     NdbApiSignal* tSignal = theNdb->getSignal();
     newOp->theTCREQ->next(tSignal); 
@@ -2177,7 +2176,7 @@ NdbScanOperation::takeOverScanOp(Operati
       tSignal->setSignal(GSN_KEYINFO);
       KeyInfo * keyInfo = CAST_PTR(KeyInfo, tSignal->getDataPtrSend());
       memcpy(keyInfo->keyData, src, 4 * KeyInfo::DataLength);
-      src += KeyInfo::DataLength;
+      src += 4 * KeyInfo::DataLength;
       left -= KeyInfo::DataLength;
       
       tSignal->next(theNdb->getSignal());

Thread
bzr push into mysql-5.1 branch (jonas:2667 to 2668) Bug#38592Jonas Oreland13 Aug