mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
bug#8853 - ndb - commit after nodefailure on not TC node
set exec_flag in execTC_COMMITREQ so that api will get rollbackrep ndb/include/ndbapi/NdbConnection.hpp: Make getConnectedNode public ndb/src/kernel/blocks/dbtc/DbtcMain.cpp: Fix TC_COMMITREQ in abort cases ndb/test/ndbapi/testNodeRestart.cpp: Testcase for bug#8853 ndb/test/run-test/daily-devel-tests.txt: Testcase for bug#8853
This commit is contained in:
@ -448,6 +448,8 @@ public:
|
|||||||
NdbScanOperation* getNdbScanOperation(const NdbDictionary::Table * table);
|
NdbScanOperation* getNdbScanOperation(const NdbDictionary::Table * table);
|
||||||
NdbIndexScanOperation* getNdbIndexScanOperation(const NdbDictionary::Index * index,
|
NdbIndexScanOperation* getNdbIndexScanOperation(const NdbDictionary::Index * index,
|
||||||
const NdbDictionary::Table * table);
|
const NdbDictionary::Table * table);
|
||||||
|
|
||||||
|
Uint32 getConnectedNodeId(); // Get Connected node id
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/**
|
/**
|
||||||
@ -480,7 +482,6 @@ private:
|
|||||||
*/
|
*/
|
||||||
void setConnectedNodeId( Uint32 nodeId, Uint32 sequence);
|
void setConnectedNodeId( Uint32 nodeId, Uint32 sequence);
|
||||||
|
|
||||||
Uint32 getConnectedNodeId(); // Get Connected node id
|
|
||||||
void setMyBlockReference( int ); // Set my block refrerence
|
void setMyBlockReference( int ); // Set my block refrerence
|
||||||
void setTC_ConnectPtr( Uint32 ); // Sets TC Connect pointer
|
void setTC_ConnectPtr( Uint32 ); // Sets TC Connect pointer
|
||||||
int getTC_ConnectPtr(); // Gets TC Connect pointer
|
int getTC_ConnectPtr(); // Gets TC Connect pointer
|
||||||
|
@ -5193,7 +5193,8 @@ void Dbtc::execTC_COMMITREQ(Signal* signal)
|
|||||||
const Uint32 transId1 = regApiPtr->transid[0];
|
const Uint32 transId1 = regApiPtr->transid[0];
|
||||||
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:
|
|||||||
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",
|
|||||||
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
|
|||||||
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
|
||||||
|
Reference in New Issue
Block a user