From: Date: August 13 2008 10:28pm Subject: bzr push into mysql-5.1 branch (jonas:2667 to 2668) Bug#38592 List-Archive: http://lists.mysql.com/commits/51573 X-Bug: 38592 Message-Id: <20080813202852.70E76917AEC@perch.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 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; igetRemoteNodeId(); - 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; igetRemoteNodeId(); + 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());