List:Internals« Previous MessageNext Message »
From:jonas Date:December 1 2005 11:18am
Subject:bk commit into 5.1 tree (jonas:1.1973)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of jonas. When jonas does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet
  1.1973 05/12/01 12:18:11 jonas@stripped +6 -0
  ndb -
    New system test program using BANK and random node/system restarts

  storage/ndb/test/run-test/daily-basic-tests.txt
    1.39 05/12/01 12:18:08 jonas@stripped +12 -0
    New system test program using BANK and random node/system restarts

  storage/ndb/test/ndbapi/testSRBank.cpp
    1.4 05/12/01 12:18:08 jonas@stripped +190 -22
    New system test program using BANK and random node/system restarts

  storage/ndb/test/ndbapi/testNdbApi.cpp
    1.23 05/12/01 12:18:08 jonas@stripped +1 -1
    Fix test program

  storage/ndb/test/ndbapi/bank/Bank.cpp
    1.14 05/12/01 12:18:08 jonas@stripped +133 -98
    Better NF handling in BANK

  storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp
    1.89 05/12/01 12:18:08 jonas@stripped +1 -1
    Fix scan_delete via ordered index

  storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp
    1.64 05/12/01 12:18:08 jonas@stripped +4 -3
    Fix scan_delete via ordered index

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	jonas
# Host:	perch.ndb.mysql.com
# Root:	/home/jonas/src/51-ndb

--- 1.3/storage/ndb/test/ndbapi/testSRBank.cpp	2005-09-09 13:43:35 +02:00
+++ 1.4/storage/ndb/test/ndbapi/testSRBank.cpp	2005-12-01 12:18:08 +01:00
@@ -122,36 +122,30 @@
   result = NDBT_FAILED; \
   continue; } 
 
-int runSR(NDBT_Context* ctx, NDBT_Step* step)
+int
+restart_cluster(NDBT_Context* ctx, NDBT_Step* step, NdbRestarter& restarter)
 {
-  int result = NDBT_OK;
-  int runtime = ctx->getNumLoops();
-  int sleeptime = ctx->getNumRecords();
-  NdbRestarter restarter;
   bool abort = true;
   int timeout = 180;
+  int result = NDBT_OK;
 
-  Uint32 now;
-  const Uint32 stop = time(0)+ runtime;
-  while(!ctx->isTestStopped() && ((now= time(0)) < stop) && result == NDBT_OK)
+  do 
   {
-    ndbout << " -- Sleep " << sleeptime << "s " << endl;
-    NdbSleep_SecSleep(sleeptime);
     ndbout << " -- Shutting down " << endl;
     ctx->setProperty("SR", 1);
     CHECK(restarter.restartAll(false, true, abort) == 0);
     ctx->setProperty("SR", 2);
     CHECK(restarter.waitClusterNoStart(timeout) == 0);
-
+    
     Uint32 cnt = ctx->getProperty("ThreadCount");
     Uint32 curr= ctx->getProperty("ThreadStopped");
-    while(curr != cnt)
+    while(curr != cnt && !ctx->isTestStopped())
     {
       ndbout_c("%d %d", curr, cnt);
       NdbSleep_MilliSleep(100);
       curr= ctx->getProperty("ThreadStopped");
     }
-
+    
     ctx->setProperty("ThreadStopped", (Uint32)0);
     CHECK(restarter.startAll() == 0);
     CHECK(restarter.waitClusterStarted(timeout) == 0);
@@ -166,18 +160,166 @@
 	ndbout << "bank.performSumAccounts FAILED" << endl;
 	return NDBT_FAILED;
       }
-
+      
       if (bank.performValidateAllGLs() != 0)
       {
 	ndbout << "bank.performValidateAllGLs FAILED" << endl;
 	return NDBT_FAILED;
       }
     }
-
+    
     ndbout << " -- Validating complete " << endl;
-    ctx->setProperty("SR", (Uint32)0);
-    ctx->broadcast();
+  } while(0);
+  ctx->setProperty("SR", (Uint32)0);
+  ctx->broadcast();
+  return result;
+}
+
+ndb_mgm_node_state*
+select_node_to_stop(Vector<ndb_mgm_node_state>& nodes)
+{
+  Uint32 i, j;
+  Vector<ndb_mgm_node_state*> alive_nodes;
+  for(i = 0; i<nodes.size(); i++)
+  {
+    ndb_mgm_node_state* node = &nodes[i];
+    if (node->node_status == NDB_MGM_NODE_STATUS_STARTED)
+      alive_nodes.push_back(node);
+  }
+
+  Vector<ndb_mgm_node_state*> victims;
+  // Remove those with one in node group
+  for(i = 0; i<alive_nodes.size(); i++)
+  {
+    int group = alive_nodes[i]->node_group;
+    for(j = 0; j<alive_nodes.size(); j++) 
+    {
+      if (i != j && alive_nodes[j]->node_group == group)
+      {
+	victims.push_back(alive_nodes[i]);
+	break;
+      }
+    }
+  }
+
+  if (victims.size())
+  {
+    int victim = rand() % victims.size();
+    return victims[victim];
+  }
+  else
+  {
+    return 0;
   }
+}
+
+ndb_mgm_node_state*
+select_node_to_start(Vector<ndb_mgm_node_state>& nodes)
+{
+  Uint32 i, j;
+  Vector<ndb_mgm_node_state*> victims;
+  for(i = 0; i<nodes.size(); i++)
+  {
+    ndb_mgm_node_state* node = &nodes[i];
+    if (node->node_status == NDB_MGM_NODE_STATUS_NOT_STARTED)
+      victims.push_back(node);
+  }
+
+  if (victims.size())
+  {
+    int victim = rand() % victims.size();
+    return victims[victim];
+  }
+  else
+  {
+    return 0;
+  }
+}
+
+enum Action {
+  AA_RestartCluster = 0x1,
+  AA_RestartNode    = 0x2,
+  AA_StopNode       = 0x4,
+  AA_StartNode      = 0x8,
+  AA_COUNT = 4
+};
+
+int
+runMixRestart(NDBT_Context* ctx, NDBT_Step* step)
+{
+  int result = NDBT_OK;
+  int runtime = ctx->getNumLoops();
+  int sleeptime = ctx->getNumRecords();
+  NdbRestarter restarter;
+  int timeout = 180;
+  Uint32 type = ctx->getProperty("Type", ~(Uint32)0);
+  
+  restarter.waitClusterStarted();
+  Vector<ndb_mgm_node_state> nodes;
+  nodes = restarter.ndbNodes;
+#if 0
+  for (Uint32 i = 0; i<restarter.ndbNodes.size(); i++)
+    nodes.push_back(restarter.ndbNodes[i]);
+#endif  
+
+  
+  Uint32 now;
+  const Uint32 stop = time(0)+ runtime;
+  while(!ctx->isTestStopped() && ((now= time(0)) < stop) && result == NDBT_OK)
+  {
+    ndbout << " -- Sleep " << sleeptime << "s " << endl;
+    int cnt = sleeptime;
+    while (cnt-- && !ctx->isTestStopped())
+      NdbSleep_SecSleep(1);
+    if (ctx->isTestStopped())
+      return NDBT_FAILED;
+    
+    ndb_mgm_node_state* node = 0;
+    int action;
+loop:
+    while(((action = (1 << (rand() % AA_COUNT))) & type) == 0);
+    switch(action){
+    case AA_RestartCluster:
+      if (restart_cluster(ctx, step, restarter))
+	return NDBT_FAILED;
+      for (Uint32 i = 0; i<nodes.size(); i++)
+	nodes[i].node_status = NDB_MGM_NODE_STATUS_STARTED;
+      break;
+    case AA_RestartNode:
+    case AA_StopNode:
+    {
+      if ((node = select_node_to_stop(nodes)) == 0)
+	goto loop;
+      
+      if (action == AA_RestartNode)
+      {
+	g_err << "Restarting " << node->node_id << endl;
+	if (restarter.restartOneDbNode(node->node_id, false, false, true))
+	  return NDBT_FAILED;
+      }
+      if (action == AA_StopNode)
+      {
+	g_err << "Stopping " << node->node_id << endl;
+	if (restarter.restartOneDbNode(node->node_id, false, true, true))
+	  return NDBT_FAILED;
+	node->node_status = NDB_MGM_NODE_STATUS_NOT_STARTED;
+      }
+      break;
+    }
+    case AA_StartNode:
+      if ((node = select_node_to_start(nodes)) == 0)
+	goto loop;
+      g_err << "Starting " << node->node_id << endl;
+      if (restarter.startNodes(&node->node_id, 1))
+	return NDBT_FAILED;
+      if (restarter.waitNodesStarted(&node->node_id, 1))
+	return NDBT_FAILED;
+      
+      node->node_status = NDB_MGM_NODE_STATUS_STARTED;      
+      break;
+    }
+  }
+  
   ctx->stopTest();
   return NDBT_OK;
 }
@@ -191,13 +333,14 @@
 
 
 NDBT_TESTSUITE(testSRBank);
-TESTCASE("Graceful", 
+TESTCASE("SR", 
 	 " Test that a consistent bank is restored after graceful shutdown\n"
 	 "1.  Create bank\n"
 	 "2.  Start bank and let it run\n"
 	 "3.  Restart ndb and verify consistency\n"
 	 "4.  Drop bank\n")
 {
+  TC_PROPERTY("Type", AA_RestartCluster);
   INITIALIZER(runCreateBank);
   STEP(runBankTimer);
   STEP(runBankTransactions);
@@ -211,15 +354,16 @@
   STEP(runBankTransactions);
   STEP(runBankTransactions);
   STEP(runBankGL);
-  STEP(runSR);
+  STEP(runMixRestart);
 }
-TESTCASE("Abort", 
+TESTCASE("NR", 
 	 " Test that a consistent bank is restored after graceful shutdown\n"
 	 "1.  Create bank\n"
 	 "2.  Start bank and let it run\n"
 	 "3.  Restart ndb and verify consistency\n"
 	 "4.  Drop bank\n")
 {
+  TC_PROPERTY("Type", AA_RestartNode | AA_StopNode | AA_StartNode);
   INITIALIZER(runCreateBank);
   STEP(runBankTimer);
   STEP(runBankTransactions);
@@ -233,7 +377,31 @@
   STEP(runBankTransactions);
   STEP(runBankTransactions);
   STEP(runBankGL);
-  STEP(runSR);
+  STEP(runMixRestart);
+  FINALIZER(runDropBank);
+}
+TESTCASE("Mix", 
+	 " Test that a consistent bank is restored after graceful shutdown\n"
+	 "1.  Create bank\n"
+	 "2.  Start bank and let it run\n"
+	 "3.  Restart ndb and verify consistency\n"
+	 "4.  Drop bank\n")
+{
+  TC_PROPERTY("Type", ~0);
+  INITIALIZER(runCreateBank);
+  STEP(runBankTimer);
+  STEP(runBankTransactions);
+  STEP(runBankTransactions);
+  STEP(runBankTransactions);
+  STEP(runBankTransactions);
+  STEP(runBankTransactions);
+  STEP(runBankTransactions);
+  STEP(runBankTransactions);
+  STEP(runBankTransactions);
+  STEP(runBankTransactions);
+  STEP(runBankTransactions);
+  STEP(runBankGL);
+  STEP(runMixRestart);
   FINALIZER(runDropBank);
 }
 NDBT_TESTSUITE_END(testSRBank);
@@ -243,4 +411,4 @@
   return testSRBank.execute(argc, argv);
 }
 
-
+template class Vector<ndb_mgm_node_state*>;

--- 1.38/storage/ndb/test/run-test/daily-basic-tests.txt	2005-11-24 16:43:20 +01:00
+++ 1.39/storage/ndb/test/run-test/daily-basic-tests.txt	2005-12-01 12:18:08 +01:00
@@ -636,6 +636,18 @@
 cmd: testSystemRestart
 args: -n SR_UNDO T8 
 
+max-time: 1000
+cmd: testSRBank
+args: -n SR -l 300 -r 15 T1
+
+max-time: 1000
+cmd: testSRBank
+args: -n NR -l 300 -r 15 T1
+
+max-time: 1000
+cmd: testSRBank
+args: -n Mix -l 300 -r 15 T1
+
 # OLD FLEX
 max-time: 500
 cmd: flexBench

--- 1.63/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp	2005-11-25 15:16:30 +01:00
+++ 1.64/storage/ndb/src/kernel/blocks/dbacc/DbaccMain.cpp	2005-12-01 12:18:08 +01:00
@@ -2776,8 +2776,9 @@
   jam();
   Uint32 localKey = operationRecPtr.p->localdata[0];
   Uint32 userptr= operationRecPtr.p->userptr;
-  Uint32 scanptr= operationRecPtr.p->scanRecPtr;
-
+  Uint32 scanInd = operationRecPtr.p->operation == ZSCAN_OP 
+    || operationRecPtr.p->isAccLockReq;
+ 
   signal->theData[0] = fragrecptr.p->myfid;
   signal->theData[1] = fragrecptr.p->myTableId;
   Uint32 pageId = localKey >> MAX_TUPLES_BITS;
@@ -2785,7 +2786,7 @@
   signal->theData[2] = pageId;
   signal->theData[3] = pageIndex;
   signal->theData[4] = userptr;
-  signal->theData[5] = scanptr;
+  signal->theData[5] = scanInd;
   EXECUTE_DIRECT(DBLQH, GSN_TUP_DEALLOCREQ, signal, 6);
   jamEntry();
   

--- 1.88/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2005-12-01 10:16:29 +01:00
+++ 1.89/storage/ndb/src/kernel/blocks/dblqh/DblqhMain.cpp	2005-12-01 12:18:08 +01:00
@@ -3837,7 +3837,7 @@
   jamEntry();
   regTcPtr.i = signal->theData[4];
   
-  if (signal->theData[5] != RNIL)
+  if (signal->theData[5])
   {
     jam();
     Local_key tmp;

--- 1.13/storage/ndb/test/ndbapi/bank/Bank.cpp	2005-09-15 10:42:05 +02:00
+++ 1.14/storage/ndb/test/ndbapi/bank/Bank.cpp	2005-12-01 12:18:08 +01:00
@@ -108,6 +108,7 @@
       break;
     case NDBT_TEMPORARY:
       g_err << "TEMPORARY_ERRROR retrying" << endl;
+      NdbSleep_MilliSleep(50);
       goto retry_transaction;
       break;
     default:
@@ -1587,88 +1588,111 @@
    *
    */
 
-  int check;  
-  NdbConnection* pScanTrans = m_ndb.startTransaction();
-  if (pScanTrans == NULL) {
-    ERR(m_ndb.getNdbError());
-    return NDBT_FAILED;
-  }
-      
-  NdbScanOperation* pOp = pScanTrans->getNdbScanOperation("TRANSACTION");	
-  if (pOp == NULL) {
-    ERR(pScanTrans->getNdbError());
-    m_ndb.closeTransaction(pScanTrans);
-    return NDBT_FAILED;
-  }
-
-  if( pOp->readTuples() ) {
-    ERR(pScanTrans->getNdbError());
-    m_ndb.closeTransaction(pScanTrans);
-    return NDBT_FAILED;
-  }
-
-  check = pOp->interpret_exit_ok();
-  if( check == -1 ) {
-    ERR(pScanTrans->getNdbError());
-    m_ndb.closeTransaction(pScanTrans);
-    return NDBT_FAILED;
-  }
-
-  NdbRecAttr* accountTypeRec = pOp->getValue("ACCOUNT_TYPE");
-  if( accountTypeRec ==NULL ) {
-    ERR(pScanTrans->getNdbError());
-    m_ndb.closeTransaction(pScanTrans);
-    return NDBT_FAILED;
-  }
-
-  NdbRecAttr* timeRec = pOp->getValue("TIME");
-  if( timeRec ==NULL ) {
-    ERR(pScanTrans->getNdbError());
-    m_ndb.closeTransaction(pScanTrans);
-    return NDBT_FAILED;
-  }
-
-  NdbRecAttr* transactionIdRec = pOp->getValue("TRANSACTION_ID");
-  if( transactionIdRec ==NULL ) {
-    ERR(pScanTrans->getNdbError());
-    m_ndb.closeTransaction(pScanTrans);
-    return NDBT_FAILED;
-  }
-
-  check = pScanTrans->execute(NoCommit);   
-  if( check == -1 ) {
-    ERR(pScanTrans->getNdbError());
-    m_ndb.closeTransaction(pScanTrans);
-    return NDBT_FAILED;
-  }
-    
-  int eof;
-  int rows = 0;
+  int loop = 0;
   int found = 0;
-  eof = pOp->nextResult();
+  NdbConnection* pScanTrans = 0;
+  do {
+    int check;  
+    loop++;
+    pScanTrans = m_ndb.startTransaction();
+    if (pScanTrans == NULL) {
+      ERR(m_ndb.getNdbError());
+      return NDBT_FAILED;
+    }
     
-  while(eof == 0){
-    rows++;
-    Uint32 a = accountTypeRec->u_32_value();
-    Uint32 t = timeRec->u_32_value();
+    NdbScanOperation* pOp = pScanTrans->getNdbScanOperation("TRANSACTION");
+    if (pOp == NULL) {
+      ERR(pScanTrans->getNdbError());
+      m_ndb.closeTransaction(pScanTrans);
+      return NDBT_FAILED;
+    }
+    
+    if( pOp->readTuples() ) {
+      ERR(pScanTrans->getNdbError());
+      m_ndb.closeTransaction(pScanTrans);
+      return NDBT_FAILED;
+    }
+    
+    check = pOp->interpret_exit_ok();
+    if( check == -1 ) {
+      ERR(pScanTrans->getNdbError());
+      m_ndb.closeTransaction(pScanTrans);
+      return NDBT_FAILED;
+    }
+    
+    NdbRecAttr* accountTypeRec = pOp->getValue("ACCOUNT_TYPE");
+    if( accountTypeRec ==NULL ) {
+      ERR(pScanTrans->getNdbError());
+      m_ndb.closeTransaction(pScanTrans);
+      return NDBT_FAILED;
+    }
+    
+    NdbRecAttr* timeRec = pOp->getValue("TIME");
+    if( timeRec ==NULL ) {
+      ERR(pScanTrans->getNdbError());
+      m_ndb.closeTransaction(pScanTrans);
+      return NDBT_FAILED;
+    }
+    
+    NdbRecAttr* transactionIdRec = pOp->getValue("TRANSACTION_ID");
+    if( transactionIdRec ==NULL ) {
+      ERR(pScanTrans->getNdbError());
+      m_ndb.closeTransaction(pScanTrans);
+      return NDBT_FAILED;
+    }
+    
+    check = pScanTrans->execute(NoCommit);   
+    if( check == -1 ) {
+      NdbError err = pScanTrans->getNdbError();
+      ERR(err);
+      m_ndb.closeTransaction(pScanTrans);
 
-    if (a == accountType && t <= oldest){
-      // One record found
-      Uint64 ti = transactionIdRec->u_64_value();
-      g_err << "checkNoTransactionsOlderThan found one record" << endl
-	    << "  t = " << t << endl
-	    << "  a = " << a << endl
-	    << "  ti = " << ti << endl;
-      found++;
+      if (err.status == NdbError::TemporaryError)
+      {
+	NdbSleep_MilliSleep(50);
+	continue;
+      }
+      return NDBT_FAILED;
     }
+    
+    int eof;
+    int rows = 0;
+    found = 0;
     eof = pOp->nextResult();
-  }
-  if (eof == -1) {
-    ERR(pScanTrans->getNdbError());
-    m_ndb.closeTransaction(pScanTrans);
-    return NDBT_FAILED;
-  }
     
+    while(eof == 0){
+      rows++;
+      Uint32 a = accountTypeRec->u_32_value();
+      Uint32 t = timeRec->u_32_value();
+      
+      if (a == accountType && t <= oldest){
+	// One record found
+	Uint64 ti = transactionIdRec->u_64_value();
+	g_err << "checkNoTransactionsOlderThan found one record" << endl
+	      << "  t = " << t << endl
+	      << "  a = " << a << endl
+	      << "  ti = " << ti << endl;
+	found++;
+      }
+      eof = pOp->nextResult();
+    }
+    if (eof == -1) {
+      NdbError err = pScanTrans->getNdbError();
+      ERR(err);
+      m_ndb.closeTransaction(pScanTrans);
+      
+      if (err.status == NdbError::TemporaryError)
+      {
+	NdbSleep_MilliSleep(50);
+	continue;
+      }
+      
+      return NDBT_FAILED;
+    }
+
+    break;
+  } while(true);
+
   m_ndb.closeTransaction(pScanTrans);
   
   if (found == 0)
@@ -1949,32 +1973,43 @@
 int Bank::readSystemValue(SystemValueId sysValId, Uint64 & value){
 
   int check;
+  NdbConnection* pTrans = 0;
+  while (true)
+  {
+    pTrans = m_ndb.startTransaction();
+    if (pTrans == NULL)
+    {
+      ERR(m_ndb.getNdbError());
+      if(m_ndb.getNdbError().status == NdbError::TemporaryError)
+      {
+	NdbSleep_MilliSleep(50);
+	continue;
+      }
+      return NDBT_FAILED;
+    }
     
-  NdbConnection* pTrans = m_ndb.startTransaction();
-  if (pTrans == NULL){
-    ERR(m_ndb.getNdbError());
-    if(m_ndb.getNdbError().status == NdbError::TemporaryError)
-      return NDBT_TEMPORARY;
-    return NDBT_FAILED;
-  }
-
-  int result;
-  if ((result= prepareReadSystemValueOp(pTrans, sysValId, value)) != NDBT_OK) {
-    ERR(pTrans->getNdbError());
-    m_ndb.closeTransaction(pTrans);
-    return result;
-  }
-
-  check = pTrans->execute(Commit);
-  if( check == -1 ) {
-    ERR(pTrans->getNdbError());
-    if(pTrans->getNdbError().status == NdbError::TemporaryError)
+    int result;
+    if ((result= prepareReadSystemValueOp(pTrans, sysValId, value)) != NDBT_OK)
     {
+      ERR(pTrans->getNdbError());
       m_ndb.closeTransaction(pTrans);
-      return NDBT_TEMPORARY;
+      return result;
     }
-    m_ndb.closeTransaction(pTrans);
-    return NDBT_FAILED;
+    
+    check = pTrans->execute(Commit);
+    if( check == -1 ) {
+      NdbError err = pTrans->getNdbError();
+      m_ndb.closeTransaction(pTrans);
+      ERR(err);
+      if(err.status == NdbError::TemporaryError)
+      {
+	NdbSleep_MilliSleep(50);
+	continue;
+      }
+      return NDBT_FAILED;
+    }
+    
+    break;
   }
   
   m_ndb.closeTransaction(pTrans);      

--- 1.22/storage/ndb/test/ndbapi/testNdbApi.cpp	2005-11-23 10:45:05 +01:00
+++ 1.23/storage/ndb/test/ndbapi/testNdbApi.cpp	2005-12-01 12:18:08 +01:00
@@ -1150,7 +1150,7 @@
   Ndb* pNdb = GETNDB(step);
   C2(hugoOps.startTransaction(pNdb) == 0);
   C2(hugoOps.pkWritePartialRecord(pNdb, 0, 1) == 0);
-  C2(hugoOps.execute_Commit(pNdb, AO_IgnoreError) == 0);
+  C2(hugoOps.execute_Commit(pNdb, AO_IgnoreError) == 839);
   C2(hugoOps.closeTransaction(pNdb) == 0);
 
   return result;
Thread
bk commit into 5.1 tree (jonas:1.1973)jonas1 Dec