Commit 0879be78 authored by unknown's avatar unknown

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.1-new-ndb

into  whalegate.ndb.mysql.com:/home/tomas/mysql-5.1-single-user

parents 43da7989 51e7c800
...@@ -20,7 +20,12 @@ ...@@ -20,7 +20,12 @@
#include <TransporterCallback.hpp> #include <TransporterCallback.hpp>
#include <RefConvert.hpp> #include <RefConvert.hpp>
#ifdef ERROR_INSERT
Uint32 MAX_RECEIVED_SIGNALS = 1024;
#else
#define MAX_RECEIVED_SIGNALS 1024 #define MAX_RECEIVED_SIGNALS 1024
#endif
Uint32 Uint32
TransporterRegistry::unpack(Uint32 * readPtr, TransporterRegistry::unpack(Uint32 * readPtr,
Uint32 sizeOfData, Uint32 sizeOfData,
......
...@@ -102,6 +102,10 @@ private: ...@@ -102,6 +102,10 @@ private:
virtual void updateReceiveDataPtr(Uint32 bytesRead); virtual void updateReceiveDataPtr(Uint32 bytesRead);
virtual Uint32 get_free_buffer() const; virtual Uint32 get_free_buffer() const;
inline bool hasReceiveData () const {
return receiveBuffer.sizeOfData > 0;
}
protected: protected:
/** /**
* Setup client/server and perform connect/accept * Setup client/server and perform connect/accept
......
...@@ -739,16 +739,13 @@ TransporterRegistry::poll_SHM(Uint32 timeOutMillis) ...@@ -739,16 +739,13 @@ TransporterRegistry::poll_SHM(Uint32 timeOutMillis)
Uint32 Uint32
TransporterRegistry::poll_TCP(Uint32 timeOutMillis) TransporterRegistry::poll_TCP(Uint32 timeOutMillis)
{ {
bool hasdata = false;
if (false && nTCPTransporters == 0) if (false && nTCPTransporters == 0)
{ {
tcpReadSelectReply = 0; tcpReadSelectReply = 0;
return 0; return 0;
} }
struct timeval timeout;
timeout.tv_sec = timeOutMillis / 1000;
timeout.tv_usec = (timeOutMillis % 1000) * 1000;
NDB_SOCKET_TYPE maxSocketValue = -1; NDB_SOCKET_TYPE maxSocketValue = -1;
// Needed for TCP/IP connections // Needed for TCP/IP connections
...@@ -771,8 +768,15 @@ TransporterRegistry::poll_TCP(Uint32 timeOutMillis) ...@@ -771,8 +768,15 @@ TransporterRegistry::poll_TCP(Uint32 timeOutMillis)
// Put the connected transporters in the socket read-set // Put the connected transporters in the socket read-set
FD_SET(socket, &tcpReadset); FD_SET(socket, &tcpReadset);
} }
hasdata |= t->hasReceiveData();
} }
timeOutMillis = hasdata ? 0 : timeOutMillis;
struct timeval timeout;
timeout.tv_sec = timeOutMillis / 1000;
timeout.tv_usec = (timeOutMillis % 1000) * 1000;
// The highest socket value plus one // The highest socket value plus one
maxSocketValue++; maxSocketValue++;
...@@ -787,7 +791,7 @@ TransporterRegistry::poll_TCP(Uint32 timeOutMillis) ...@@ -787,7 +791,7 @@ TransporterRegistry::poll_TCP(Uint32 timeOutMillis)
} }
#endif #endif
return tcpReadSelectReply; return tcpReadSelectReply || hasdata;
} }
#endif #endif
...@@ -796,26 +800,26 @@ void ...@@ -796,26 +800,26 @@ void
TransporterRegistry::performReceive() TransporterRegistry::performReceive()
{ {
#ifdef NDB_TCP_TRANSPORTER #ifdef NDB_TCP_TRANSPORTER
if(tcpReadSelectReply > 0) for (int i=0; i<nTCPTransporters; i++)
{ {
for (int i=0; i<nTCPTransporters; i++) checkJobBuffer();
{ TCP_Transporter *t = theTCPTransporters[i];
checkJobBuffer(); const NodeId nodeId = t->getRemoteNodeId();
TCP_Transporter *t = theTCPTransporters[i]; const NDB_SOCKET_TYPE socket = t->getSocket();
const NodeId nodeId = t->getRemoteNodeId(); if(is_connected(nodeId)){
const NDB_SOCKET_TYPE socket = t->getSocket(); if(t->isConnected())
if(is_connected(nodeId)){ {
if(t->isConnected() && FD_ISSET(socket, &tcpReadset)) if (FD_ISSET(socket, &tcpReadset))
{ {
const int receiveSize = t->doReceive(); t->doReceive();
if(receiveSize > 0) }
{
Uint32 * ptr; if (t->hasReceiveData())
Uint32 sz = t->getReceiveData(&ptr); {
transporter_recv_from(callbackObj, nodeId); Uint32 * ptr;
Uint32 szUsed = unpack(ptr, sz, nodeId, ioStates[nodeId]); Uint32 sz = t->getReceiveData(&ptr);
t->updateReceiveDataPtr(szUsed); Uint32 szUsed = unpack(ptr, sz, nodeId, ioStates[nodeId]);
} t->updateReceiveDataPtr(szUsed);
} }
} }
} }
......
...@@ -133,6 +133,7 @@ Cmvmi::~Cmvmi() ...@@ -133,6 +133,7 @@ Cmvmi::~Cmvmi()
#ifdef ERROR_INSERT #ifdef ERROR_INSERT
NodeBitmask c_error_9000_nodes_mask; NodeBitmask c_error_9000_nodes_mask;
extern Uint32 MAX_RECEIVED_SIGNALS;
#endif #endif
void Cmvmi::execNDB_TAMPER(Signal* signal) void Cmvmi::execNDB_TAMPER(Signal* signal)
...@@ -162,6 +163,22 @@ void Cmvmi::execNDB_TAMPER(Signal* signal) ...@@ -162,6 +163,22 @@ void Cmvmi::execNDB_TAMPER(Signal* signal)
kill(getpid(), SIGABRT); kill(getpid(), SIGABRT);
} }
#endif #endif
#ifdef ERROR_INSERT
if (signal->theData[0] == 9003)
{
if (MAX_RECEIVED_SIGNALS < 1024)
{
MAX_RECEIVED_SIGNALS = 1024;
}
else
{
MAX_RECEIVED_SIGNALS = 1 + (rand() % 128);
}
ndbout_c("MAX_RECEIVED_SIGNALS: %d", MAX_RECEIVED_SIGNALS);
CLEAR_ERROR_INSERT_VALUE;
}
#endif
}//execNDB_TAMPER() }//execNDB_TAMPER()
void Cmvmi::execSET_LOGLEVELORD(Signal* signal) void Cmvmi::execSET_LOGLEVELORD(Signal* signal)
......
...@@ -5200,9 +5200,9 @@ void Dbacc::execEXPANDCHECK2(Signal* signal) ...@@ -5200,9 +5200,9 @@ void Dbacc::execEXPANDCHECK2(Signal* signal)
{ {
jamEntry(); jamEntry();
if(refToBlock(signal->getSendersBlockRef()) == DBLQH){ if(refToBlock(signal->getSendersBlockRef()) == DBLQH)
{
jam(); jam();
reenable_expand_after_redo_log_exection_complete(signal);
return; return;
} }
......
...@@ -1588,6 +1588,36 @@ int runTestExecuteAsynch(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -1588,6 +1588,36 @@ int runTestExecuteAsynch(NDBT_Context* ctx, NDBT_Step* step){
template class Vector<NdbScanOperation*>; template class Vector<NdbScanOperation*>;
int
runBug28443(NDBT_Context* ctx, NDBT_Step* step)
{
int result = NDBT_OK;
int records = ctx->getNumRecords();
NdbRestarter restarter;
restarter.insertErrorInAllNodes(9003);
for (Uint32 i = 0; i<ctx->getNumLoops(); i++)
{
HugoTransactions hugoTrans(*ctx->getTab());
if (hugoTrans.loadTable(GETNDB(step), records, 2048) != 0)
{
result = NDBT_FAILED;
goto done;
}
if (runClearTable(ctx, step) != 0)
{
result = NDBT_FAILED;
goto done;
}
}
done:
restarter.insertErrorInAllNodes(9003);
return result;
}
NDBT_TESTSUITE(testNdbApi); NDBT_TESTSUITE(testNdbApi);
TESTCASE("MaxNdb", TESTCASE("MaxNdb",
...@@ -1689,6 +1719,10 @@ TESTCASE("ExecuteAsynch", ...@@ -1689,6 +1719,10 @@ TESTCASE("ExecuteAsynch",
"Check that executeAsync() works (BUG#27495)\n"){ "Check that executeAsync() works (BUG#27495)\n"){
INITIALIZER(runTestExecuteAsynch); INITIALIZER(runTestExecuteAsynch);
} }
TESTCASE("Bug28443",
""){
INITIALIZER(runBug28443);
}
NDBT_TESTSUITE_END(testNdbApi); NDBT_TESTSUITE_END(testNdbApi);
int main(int argc, const char** argv){ int main(int argc, const char** argv){
......
...@@ -704,6 +704,10 @@ max-time: 500 ...@@ -704,6 +704,10 @@ max-time: 500
cmd: testNdbApi cmd: testNdbApi
args: -n ExecuteAsynch T1 args: -n ExecuteAsynch T1
max-time: 1000
cmd: testNdbApi
args: -n BugBug28443
#max-time: 500 #max-time: 500
#cmd: testInterpreter #cmd: testInterpreter
#args: T1 #args: T1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment