List:Commits« Previous MessageNext Message »
From:stewart Date:July 16 2007 7:35am
Subject:[NDB patch 1/5] Test for Bug#28804
View as plain text  
Single index lookup, simulate out of txn buffer memory when saving
INDXKEYINFO.

Then multiple lookups, in different batch sizes with errors injected in
different places.

should get back 4000 no mem.

NOTE: currently if run on T3, NF leading to CF.

Works (with my fixes) for T1 though.

Index: ndb-work/ndb/src/kernel/blocks/ERROR_codes.txt
===================================================================
--- ndb-work.orig/ndb/src/kernel/blocks/ERROR_codes.txt	2007-07-11 17:15:36.638636236
+1000
+++ ndb-work/ndb/src/kernel/blocks/ERROR_codes.txt	2007-07-12 12:43:43.084635176 +1000
@@ -6,7 +6,7 @@ Next DBTUP 4014
 Next DBLQH 5043
 Next DBDICT 6007
 Next DBDIH 7183
-Next DBTC 8039
+Next DBTC 8040
 Next CMVMI 9000
 Next BACKUP 10022
 Next DBUTIL 11002
@@ -296,6 +296,8 @@ ABORT OF TCKEYREQ
 
 8038 : Simulate API disconnect just after SCAN_TAB_REQ
 
+8039 : Simulate failure of TransactionBufferMemory allocation for OI lookup
+
 
 CMVMI
 -----
Index: ndb-work/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp
===================================================================
--- ndb-work.orig/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2007-07-12 12:32:27.142115407
+1000
+++ ndb-work/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp	2007-07-12 12:43:43.272645890 +1000
@@ -11771,7 +11771,7 @@ bool Dbtc::saveINDXKEYINFO(Signal* signa
                            const Uint32 *src, 
                            Uint32 len)
 {
-  if (!indexOp->keyInfo.append(src, len)) {
+  if (ERROR_INSERTED(8039) || !indexOp->keyInfo.append(src, len)) {
     jam();
     // Failed to seize keyInfo, abort transaction
 #ifdef VM_TRACE
Index: ndb-work/ndb/test/ndbapi/testIndex.cpp
===================================================================
--- ndb-work.orig/ndb/test/ndbapi/testIndex.cpp	2007-07-11 17:15:36.682638744 +1000
+++ ndb-work/ndb/test/ndbapi/testIndex.cpp	2007-07-12 12:43:43.360650905 +1000
@@ -1297,6 +1297,69 @@ runBug25059(NDBT_Context* ctx, NDBT_Step
   return res;
 }
 
+struct bug28804_callback_param {
+  NdbRestarter *r;
+  int count;
+};
+void bug28804_callback(void* param)
+{
+  struct bug28804_callback_param *p= (struct bug28804_callback_param*)param;
+  if(--p->count==0)
+  {
+    g_err << "inserting" << endl;
+    p->r->insertErrorInAllNodes(8039);
+  }
+  else
+    g_err << "not inserting" << endl;
+}
+
+int
+runBug28804(NDBT_Context* ctx, NDBT_Step* step)
+{
+  Ndb* pNdb = GETNDB(step);
+  HugoTransactions hugoTrans(*ctx->getTab());
+  NdbRestarter restarter;
+
+  int loops = ctx->getNumLoops();
+  const int rows = ctx->getNumRecords();
+  const int batchsize = ctx->getProperty("BatchSize", 1);
+
+  for(int bs=1; bs < loops; bs++)
+  {
+    int c= 0;
+    while (c++ < loops)
+    {
+      g_err << "BS " << bs << " LOOP #" << c << endl;
+
+      struct bug28804_callback_param p;
+      p.r= &restarter;
+      p.count= c;
+      g_err << "inserting error on op#" << c << endl;
+
+      if(hugoTrans.indexReadRecords(pNdb, pkIdxName, c, bs,
+                                    NoCommit, AO_IgnoreError,
+                                    bug28804_callback, (void*)&p) == 0)
+      {
+        g_err << "Index succeded (it should have failed)" << endl;
+        return NDBT_FAILED;
+      }
+      g_err << "done, doing test read" << endl;
+      if(restarter.insertErrorInAllNodes(0) != 0)
+      {
+        g_err << "Failed to error insert(0)" << endl;
+        return NDBT_FAILED;
+      }
+
+      if (hugoTrans.indexReadRecords(pNdb, pkIdxName, rows, batchsize) != 0){
+        g_err << "Index read failed" << endl;
+        return NDBT_FAILED;
+      }
+    }
+  }
+
+  return NDBT_OK;
+}
+
 NDBT_TESTSUITE(testIndex);
 TESTCASE("CreateAll", 
 	 "Test that we can create all various indexes on each table\n"
@@ -1628,6 +1691,16 @@ TESTCASE("Bug25059", 
   STEP(runBug25059);
   FINALIZER(createPkIndex_Drop);
 }
+TESTCASE("Bug28804",
+	 "Test behaviour on out of TransactionBufferMemory for index lookup"){
+  TC_PROPERTY("LoggedIndexes", (unsigned)0);
+  INITIALIZER(runClearTable);
+  INITIALIZER(createPkIndex);
+  INITIALIZER(runLoadTable);
+  STEP(runBug28804);
+  FINALIZER(createPkIndex_Drop);
+  FINALIZER(runClearTable);
+}
 NDBT_TESTSUITE_END(testIndex);
 
 int main(int argc, const char** argv){
Index: ndb-work/ndb/test/include/HugoTransactions.hpp
===================================================================
--- ndb-work.orig/ndb/test/include/HugoTransactions.hpp	2007-07-11 17:15:36.686638972
+1000
+++ ndb-work/ndb/test/include/HugoTransactions.hpp	2007-07-12 12:43:43.936683731 +1000
@@ -97,7 +97,11 @@ public:
   int indexReadRecords(Ndb*, 
 		       const char * idxName,
 		       int records,
-		       int batchsize = 1);
+		       int batchsize = 1,
+                       ExecType execType= Commit,
+                       AbortOption abortOption= AbortOnError,
+                       void(*record_callback)(void*)= NULL,
+                       void *callback_param= NULL);
 
   int indexUpdateRecords(Ndb*,
 			 const char * idxName,
Index: ndb-work/ndb/test/src/HugoTransactions.cpp
===================================================================
--- ndb-work.orig/ndb/test/src/HugoTransactions.cpp	2007-07-11 17:15:36.710640340 +1000
+++ ndb-work/ndb/test/src/HugoTransactions.cpp	2007-07-12 12:43:44.428711770 +1000
@@ -1434,7 +1434,11 @@ int 
 HugoTransactions::indexReadRecords(Ndb* pNdb, 
 				   const char * idxName,
 				   int records,
-				   int batch){
+				   int batch,
+                                   ExecType execType,
+                                   AbortOption abortOption,
+                                   void(*record_callback)(void*),
+                                   void *callback_param){
   int                  reads = 0;
   int                  r = 0;
   int                  retryAttempt = 0;
@@ -1526,9 +1530,13 @@ HugoTransactions::indexReadRecords(Ndb* 
 	  return NDBT_FAILED;
 	}
       }
+
+      if(record_callback)
+        (record_callback)(callback_param);
     }
 
-    check = pTrans->execute(Commit);   
+    check = pTrans->execute(execType, abortOption, 1);
+
     check = (check == -1 ? -1 : !ordered ? check : sOp->nextResult(true));
     if( check == -1 ) {
       const NdbError err = pTrans->getNdbError();
Index: ndb-work/ndb/test/run-test/daily-basic-tests.txt
===================================================================
--- ndb-work.orig/ndb/test/run-test/daily-basic-tests.txt	2007-07-12 12:32:27.386129312
+1000
+++ ndb-work/ndb/test/run-test/daily-basic-tests.txt	2007-07-12 12:43:44.788732287 +1000
@@ -779,3 +779,7 @@ cmd: DbAsyncGenerator
 args: -time 60 -p 1 -proc 25
 type: bench
 
+max-time: 60
+cmd: testIndex
+args: -n Bug28804 T1
+

--
Stewart Smith
Thread
[NDB patch 0/5] Bug28804 Unknown error returned on a query using joinsstewart16 Jul
  • [NDB patch 3/5] BUG#28804 fix ha_ndbcluster::unique_index_read to properly return errorstewart16 Jul
  • [NDB patch 4/5] BUG#28804 release index operation for unique index lookup (without matching tuple) on completion of operation, not txnstewart16 Jul
  • [NDB patch 5/5] BUG#28804 Dbtc::releaseAbortResources() send returnsignal when exists.stewart16 Jul
    • Re: [NDB patch 5/5] BUG#28804 Dbtc::releaseAbortResources() sendreturnsignal when exists.Jonas Oreland16 Jul
  • [NDB patch 1/5] Test for Bug#28804stewart16 Jul
    • Re: [NDB patch 1/5] Test for Bug#28804Jonas Oreland16 Jul
  • [NDB patch 2/5] BUG#28804 improve NDBAPI behaviour in execute on timeout waiting for txn respones.stewart16 Jul
  • Re: [NDB patch 0/5] Bug28804 Unknown error returned on a queryusing joinsStewart Smith16 Jul
  • Re: [NDB patch 0/5] Bug28804 Unknown error returned on a query usingjoinsJonas Oreland16 Jul