Commit e08993f0 authored by tulin@dl145c.mysql.com's avatar tulin@dl145c.mysql.com

Merge tulin@bk-internal.mysql.com:/home/bk/mysql-4.1

into dl145c.mysql.com:/home/ndbdev/tomas/mysql-4.1
parents 36ff6744 57ddf522
...@@ -177,6 +177,7 @@ mysqldev@melody.local ...@@ -177,6 +177,7 @@ mysqldev@melody.local
mysqldev@mysql.com mysqldev@mysql.com
mysqldev@o2k.irixworld.net mysqldev@o2k.irixworld.net
ndbdev@dl145b.mysql.com ndbdev@dl145b.mysql.com
ndbdev@dl145c.mysql.com
ndbdev@eel.hemma.oreland.se ndbdev@eel.hemma.oreland.se
ndbdev@ndbmaster.mysql.com ndbdev@ndbmaster.mysql.com
nick@mysql.com nick@mysql.com
......
...@@ -722,11 +722,14 @@ Dbtc::set_timeout_value(Uint32 timeOut) ...@@ -722,11 +722,14 @@ Dbtc::set_timeout_value(Uint32 timeOut)
void void
Dbtc::set_appl_timeout_value(Uint32 timeOut) Dbtc::set_appl_timeout_value(Uint32 timeOut)
{ {
timeOut /= 10; if (timeOut)
if (timeOut < ctimeOutValue) { {
jam(); timeOut /= 10;
c_appl_timeout_value = ctimeOutValue; if (timeOut < ctimeOutValue) {
}//if jam();
c_appl_timeout_value = ctimeOutValue;
}//if
}
c_appl_timeout_value = timeOut; c_appl_timeout_value = timeOut;
} }
...@@ -6133,7 +6136,8 @@ void Dbtc::timeOutFoundLab(Signal* signal, Uint32 TapiConPtr) ...@@ -6133,7 +6136,8 @@ void Dbtc::timeOutFoundLab(Signal* signal, Uint32 TapiConPtr)
particular state we will use the application timeout parameter rather particular state we will use the application timeout parameter rather
than the shorter Deadlock detection timeout. than the shorter Deadlock detection timeout.
*/ */
if ((ctcTimer - getApiConTimer(apiConnectptr.i)) <= c_appl_timeout_value) { if (c_appl_timeout_value == 0 ||
(ctcTimer - getApiConTimer(apiConnectptr.i)) <= c_appl_timeout_value) {
jam(); jam();
return; return;
}//if }//if
......
...@@ -22,14 +22,14 @@ ...@@ -22,14 +22,14 @@
#include <NdbConfig.hpp> #include <NdbConfig.hpp>
#include <signaldata/DumpStateOrd.hpp> #include <signaldata/DumpStateOrd.hpp>
#define TIMEOUT 3000 #define TIMEOUT (Uint32)3000
Uint32 g_org_timeout = 3000; Uint32 g_org_timeout = 3000;
int int
setTransactionTimeout(NDBT_Context* ctx, NDBT_Step* step){ setTransactionTimeout(NDBT_Context* ctx, NDBT_Step* step){
NdbRestarter restarter; NdbRestarter restarter;
int timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT);
NdbConfig conf(GETNDB(step)->getNodeId()+1); NdbConfig conf(GETNDB(step)->getNodeId()+1);
unsigned int nodeId = conf.getMasterNodeId(); unsigned int nodeId = conf.getMasterNodeId();
if (!conf.getProperty(nodeId, if (!conf.getProperty(nodeId,
...@@ -39,7 +39,7 @@ setTransactionTimeout(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -39,7 +39,7 @@ setTransactionTimeout(NDBT_Context* ctx, NDBT_Step* step){
return NDBT_FAILED; return NDBT_FAILED;
} }
int val[] = { DumpStateOrd::TcSetApplTransactionTimeout, TIMEOUT }; int val[] = { DumpStateOrd::TcSetApplTransactionTimeout, timeout };
if(restarter.dumpStateAllNodes(val, 2) != 0){ if(restarter.dumpStateAllNodes(val, 2) != 0){
return NDBT_FAILED; return NDBT_FAILED;
} }
...@@ -94,9 +94,11 @@ int runTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -94,9 +94,11 @@ int runTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){
unsigned int nodeId = conf.getMasterNodeId(); unsigned int nodeId = conf.getMasterNodeId();
int stepNo = step->getStepNo(); int stepNo = step->getStepNo();
int minSleep = (int)(TIMEOUT * 1.5); int timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT);
int maxSleep = TIMEOUT * 2;
ndbout << "TransactionInactiveTimeout="<< TIMEOUT int minSleep = (int)(timeout * 1.5);
int maxSleep = timeout * 2;
ndbout << "TransactionInactiveTimeout="<< timeout
<< ", minSleep="<<minSleep << ", minSleep="<<minSleep
<< ", maxSleep="<<maxSleep<<endl; << ", maxSleep="<<maxSleep<<endl;
...@@ -134,8 +136,10 @@ int runTimeoutTrans2(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -134,8 +136,10 @@ int runTimeoutTrans2(NDBT_Context* ctx, NDBT_Step* step){
int mul2 = ctx->getProperty("Op2", (Uint32)0); int mul2 = ctx->getProperty("Op2", (Uint32)0);
int records = ctx->getNumRecords(); int records = ctx->getNumRecords();
int minSleep = (int)(TIMEOUT * 1.5); int timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT);
int maxSleep = TIMEOUT * 2;
int minSleep = (int)(timeout * 1.5);
int maxSleep = timeout * 2;
HugoOperations hugoOps(*ctx->getTab()); HugoOperations hugoOps(*ctx->getTab());
Ndb* pNdb = GETNDB(step); Ndb* pNdb = GETNDB(step);
...@@ -148,7 +152,7 @@ int runTimeoutTrans2(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -148,7 +152,7 @@ int runTimeoutTrans2(NDBT_Context* ctx, NDBT_Step* step){
op1 = (op1 % 5); op1 = (op1 % 5);
op2 = (op2 % 5); op2 = (op2 % 5);
ndbout << stepNo << ": TransactionInactiveTimeout="<< TIMEOUT ndbout << stepNo << ": TransactionInactiveTimeout="<< timeout
<< ", minSleep="<<minSleep << ", minSleep="<<minSleep
<< ", maxSleep="<<maxSleep << ", maxSleep="<<maxSleep
<< ", op1=" << op1 << ", op1=" << op1
...@@ -250,8 +254,10 @@ int runDontTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -250,8 +254,10 @@ int runDontTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){
int loops = ctx->getNumLoops(); int loops = ctx->getNumLoops();
int stepNo = step->getStepNo(); int stepNo = step->getStepNo();
int maxSleep = (int)(TIMEOUT * 0.5); int timeout = ctx->getProperty("TransactionInactiveTimeout",TIMEOUT);
ndbout << "TransactionInactiveTimeout="<< TIMEOUT
int maxSleep = (int)(timeout * 0.5);
ndbout << "TransactionInactiveTimeout="<< timeout
<< ", maxSleep="<<maxSleep<<endl; << ", maxSleep="<<maxSleep<<endl;
...@@ -281,6 +287,51 @@ int runDontTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -281,6 +287,51 @@ int runDontTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){
return result; return result;
} }
int runDeadlockTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){
int result = NDBT_OK;
int loops = ctx->getNumLoops();
int stepNo = step->getStepNo();
Uint32 deadlock_timeout;
NdbConfig conf(GETNDB(step)->getNodeId()+1);
unsigned int nodeId = conf.getMasterNodeId();
if (!conf.getProperty(nodeId,
NODE_TYPE_DB,
CFG_DB_TRANSACTION_DEADLOCK_TIMEOUT,
&deadlock_timeout)){
return NDBT_FAILED;
}
int do_sleep = (int)(deadlock_timeout * 0.5);
HugoOperations hugoOps(*ctx->getTab());
Ndb* pNdb = GETNDB(step);
for (int l = 0; l < loops && result == NDBT_OK; l++){
do{
// Commit transaction
CHECK(hugoOps.startTransaction(pNdb) == 0);
CHECK(hugoOps.pkReadRecord(pNdb, stepNo) == 0);
CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
int sleep = deadlock_timeout * 1.5 + myRandom48(do_sleep);
ndbout << "Sleeping for " << sleep << " milliseconds" << endl;
NdbSleep_MilliSleep(sleep);
// Expect that transaction has NOT timed-out
CHECK(hugoOps.execute_Commit(pNdb) == 0);
} while(false);
hugoOps.closeTransaction(pNdb);
}
return result;
}
int runBuddyTransNoTimeout(NDBT_Context* ctx, NDBT_Step* step){ int runBuddyTransNoTimeout(NDBT_Context* ctx, NDBT_Step* step){
int result = NDBT_OK; int result = NDBT_OK;
int loops = ctx->getNumLoops(); int loops = ctx->getNumLoops();
...@@ -334,6 +385,17 @@ TESTCASE("DontTimeoutTransaction", ...@@ -334,6 +385,17 @@ TESTCASE("DontTimeoutTransaction",
FINALIZER(resetTransactionTimeout); FINALIZER(resetTransactionTimeout);
FINALIZER(runClearTable); FINALIZER(runClearTable);
} }
TESTCASE("Bug11290",
"Setting TransactionInactiveTimeout to 0(zero) "\
"should result in infinite timeout, and not as "\
"was the bug, a timeout that is equal to the deadlock timeout"){
TC_PROPERTY("TransactionInactiveTimeout",(Uint32)0);
INITIALIZER(runLoadTable);
INITIALIZER(setTransactionTimeout);
STEPS(runDeadlockTimeoutTrans, 1);
FINALIZER(resetTransactionTimeout);
FINALIZER(runClearTable);
}
TESTCASE("DontTimeoutTransaction5", TESTCASE("DontTimeoutTransaction5",
"Test that the transaction does not timeout "\ "Test that the transaction does not timeout "\
"if we sleep during the transaction. Use a sleep "\ "if we sleep during the transaction. Use a sleep "\
......
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