=== modified file 'storage/ndb/src/common/transporter/TransporterRegistry.cpp' --- storage/ndb/src/common/transporter/TransporterRegistry.cpp 2008-06-11 20:28:21 +0000 +++ storage/ndb/src/common/transporter/TransporterRegistry.cpp 2008-08-06 07:19:39 +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...!"); + g_eventLogger->warning("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; 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 +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);