Commit eab1e62c authored by unknown's avatar unknown
Browse files

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
parent b89feadf
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -449,6 +449,8 @@ public:
  NdbIndexScanOperation* getNdbIndexScanOperation(const NdbDictionary::Index * index,
						  const NdbDictionary::Table * table);

  Uint32	getConnectedNodeId();	          // Get Connected node id
  
private:						
  /**
   * Release completed operations
@@ -480,7 +482,6 @@ private:
   */
  void setConnectedNodeId( Uint32 nodeId, Uint32 sequence); 

  Uint32	getConnectedNodeId();	          // Get Connected node id
  void		setMyBlockReference( int );	  // Set my block refrerence
  void		setTC_ConnectPtr( Uint32 );	  // Sets TC Connect pointer
  int		getTC_ConnectPtr();		  // Gets TC Connect pointer
+2 −1
Original line number Diff line number Diff line
@@ -5194,6 +5194,7 @@ void Dbtc::execTC_COMMITREQ(Signal* signal)
    const Uint32 transId2      = regApiPtr->transid[1];
    Uint32 errorCode           = 0;

    regApiPtr->m_exec_flag = 1;
    switch (regApiPtr->apiConnectstate) {
    case CS_STARTED:
      tcConnectptr.i = regApiPtr->firstTcConnect;
+71 −0
Original line number Diff line number Diff line
@@ -344,6 +344,71 @@ int runDirtyRead(NDBT_Context* ctx, NDBT_Step* step){
  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);
TESTCASE("NoLoad", 
	 "Test that one node at a time can be stopped and then restarted "\
@@ -600,6 +665,12 @@ TESTCASE("CommittedRead",
  STEP(runDirtyRead);
  FINALIZER(runClearTable);
}
TESTCASE("LateCommit",
	 "Test commit after node failure"){
  INITIALIZER(runLoadTable);
  STEP(runLateCommit);
  FINALIZER(runClearTable);
}
NDBT_TESTSUITE_END(testNodeRestart);

int main(int argc, const char** argv){
+4 −0
Original line number Diff line number Diff line
@@ -69,6 +69,10 @@ max-time: 2500
cmd: testNodeRestart
args: -n CommittedRead T1

max-time: 2500
cmd: testNodeRestart
args: -n LateCommit T1

max-time: 2500
cmd: testNodeRestart
args: -n Terror T6 T13