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#38592 | Jonas Oreland | 13 Aug |