Commit e4d12c5a authored by unknown's avatar unknown

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

into mysql.com:/home/jonas/src/mysql-5.0

parents 41624daa 60e5117a
...@@ -5345,6 +5345,7 @@ void Dbtc::execTC_COMMITREQ(Signal* signal) ...@@ -5345,6 +5345,7 @@ void Dbtc::execTC_COMMITREQ(Signal* signal)
const Uint32 transId2 = regApiPtr->transid[1]; const Uint32 transId2 = regApiPtr->transid[1];
Uint32 errorCode = 0; Uint32 errorCode = 0;
regApiPtr->m_exec_flag = 1;
switch (regApiPtr->apiConnectstate) { switch (regApiPtr->apiConnectstate) {
case CS_STARTED: case CS_STARTED:
tcConnectptr.i = regApiPtr->firstTcConnect; tcConnectptr.i = regApiPtr->firstTcConnect;
......
...@@ -344,6 +344,71 @@ err: ...@@ -344,6 +344,71 @@ err:
return NDBT_FAILED; return NDBT_FAILED;
} }
int runLateCommit(NDBT_Context* ctx, NDBT_Step* step){
int result = NDBT_OK;
int loops = ctx->getNumLoops();
int records = ctx->getNumRecords();
NdbRestarter restarter;
HugoOperations hugoOps(*ctx->getTab());
Ndb* pNdb = GETNDB(step);
int i = 0;
while(i<loops && result != NDBT_FAILED && !ctx->isTestStopped()){
g_info << i << ": ";
if(hugoOps.startTransaction(pNdb) != 0)
return NDBT_FAILED;
if(hugoOps.pkUpdateRecord(pNdb, 1) != 0)
return NDBT_FAILED;
if(hugoOps.execute_NoCommit(pNdb) != 0)
return NDBT_FAILED;
Uint32 transNode= hugoOps.getTransaction()->getConnectedNodeId();
int id = i % restarter.getNumDbNodes();
int nodeId;
while((nodeId = restarter.getDbNodeId(id)) == transNode)
id = (id + 1) % restarter.getNumDbNodes();
ndbout << "Restart node " << nodeId << endl;
restarter.restartOneDbNode(nodeId,
/** initial */ false,
/** nostart */ true,
/** abort */ true);
restarter.waitNodesNoStart(&nodeId, 1);
int res;
if(i & 1)
res= hugoOps.execute_Commit(pNdb);
else
res= hugoOps.execute_Rollback(pNdb);
ndbout_c("res= %d", res);
hugoOps.closeTransaction(pNdb);
restarter.startNodes(&nodeId, 1);
restarter.waitNodesStarted(&nodeId, 1);
if(i & 1)
{
if(res != 286)
return NDBT_FAILED;
}
else
{
if(res != 0)
return NDBT_FAILED;
}
i++;
}
return NDBT_OK;
}
NDBT_TESTSUITE(testNodeRestart); NDBT_TESTSUITE(testNodeRestart);
TESTCASE("NoLoad", TESTCASE("NoLoad",
"Test that one node at a time can be stopped and then restarted "\ "Test that one node at a time can be stopped and then restarted "\
...@@ -600,6 +665,12 @@ TESTCASE("CommittedRead", ...@@ -600,6 +665,12 @@ TESTCASE("CommittedRead",
STEP(runDirtyRead); STEP(runDirtyRead);
FINALIZER(runClearTable); FINALIZER(runClearTable);
} }
TESTCASE("LateCommit",
"Test commit after node failure"){
INITIALIZER(runLoadTable);
STEP(runLateCommit);
FINALIZER(runClearTable);
}
NDBT_TESTSUITE_END(testNodeRestart); NDBT_TESTSUITE_END(testNodeRestart);
int main(int argc, const char** argv){ int main(int argc, const char** argv){
......
...@@ -69,6 +69,10 @@ max-time: 2500 ...@@ -69,6 +69,10 @@ max-time: 2500
cmd: testNodeRestart cmd: testNodeRestart
args: -n CommittedRead T1 args: -n CommittedRead T1
max-time: 2500
cmd: testNodeRestart
args: -n LateCommit T1
max-time: 2500 max-time: 2500
cmd: testNodeRestart cmd: testNodeRestart
args: -n Terror T6 T13 args: -n Terror T6 T13
......
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