Commit 517aa8be authored by igor@rurik.mysql.com's avatar igor@rurik.mysql.com

Merge ibabaev@bk-internal.mysql.com:/home/bk/mysql-5.0

into rurik.mysql.com:/home/igor/mysql-5.0
parents 12f88c67 be1177c1
...@@ -197,6 +197,7 @@ mysqldev@melody.local ...@@ -197,6 +197,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
ndbdev@shark. ndbdev@shark.
......
...@@ -75,6 +75,8 @@ SELECT id, IF(date IS NULL, '-', FROM_UNIXTIME(date, '%d-%m-%Y')) AS date_ord, t ...@@ -75,6 +75,8 @@ SELECT id, IF(date IS NULL, '-', FROM_UNIXTIME(date, '%d-%m-%Y')) AS date_ord, t
SELECT id, IF(date IS NULL, '-', FROM_UNIXTIME(date, '%d-%m-%Y')) AS date_ord, text FROM t1 ORDER BY date_ord DESC; SELECT id, IF(date IS NULL, '-', FROM_UNIXTIME(date, '%d-%m-%Y')) AS date_ord, text FROM t1 ORDER BY date_ord DESC;
DROP TABLE t1; DROP TABLE t1;
#
# Test for bug #11142: evaluation of NULLIF when the first argument is NULL # Test for bug #11142: evaluation of NULLIF when the first argument is NULL
# #
......
...@@ -763,11 +763,14 @@ Dbtc::set_timeout_value(Uint32 timeOut) ...@@ -763,11 +763,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;
} }
...@@ -6286,7 +6289,8 @@ void Dbtc::timeOutFoundLab(Signal* signal, Uint32 TapiConPtr) ...@@ -6286,7 +6289,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;
} }
...@@ -95,8 +95,10 @@ int runTimeoutTrans2(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -95,8 +95,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);
...@@ -109,7 +111,7 @@ int runTimeoutTrans2(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -109,7 +111,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
...@@ -211,8 +213,10 @@ int runDontTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -211,8 +213,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;
...@@ -242,6 +246,51 @@ int runDontTimeoutTrans(NDBT_Context* ctx, NDBT_Step* step){ ...@@ -242,6 +246,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();
...@@ -295,6 +344,17 @@ TESTCASE("DontTimeoutTransaction", ...@@ -295,6 +344,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