Single index lookup, simulate out of txn buffer memory when saving
INDXKEYINFO.
should get back 4000 no mem.
Index: ndb-work/ndb/src/kernel/blocks/ERROR_codes.txt
===================================================================
--- ndb-work.orig/ndb/src/kernel/blocks/ERROR_codes.txt 2007-07-02 17:56:06.773940868
+1000
+++ ndb-work/ndb/src/kernel/blocks/ERROR_codes.txt 2007-07-02 17:56:49.948401240 +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-02 17:54:51.485650433
+1000
+++ ndb-work/ndb/src/kernel/blocks/dbtc/DbtcMain.cpp 2007-07-02 17:57:01.005031322 +1000
@@ -11764,7 +11764,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-02 17:59:02.155935318 +1000
+++ ndb-work/ndb/test/ndbapi/testIndex.cpp 2007-07-02 23:33:03.702037942 +1000
@@ -1297,6 +1297,47 @@ runBug25059(NDBT_Context* ctx, NDBT_Step
return res;
}
+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);
+
+ while (loops--)
+ {
+ if(restarter.insertErrorInAllNodes(8039) != 0)
+ {
+ g_err << "Failed to error insert(8039)" << endl;
+ return NDBT_FAILED;
+ }
+
+ if (hugoTrans.indexReadRecords(pNdb, pkIdxName, rows, batchsize,
+ NoCommit, AO_IgnoreError) == 0)
+ {
+ g_err << "Index succeded (it should have failed" << endl;
+ return NDBT_FAILED;
+ }
+
+ 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 +1669,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-02 23:06:00.561540437
+1000
+++ ndb-work/ndb/test/include/HugoTransactions.hpp 2007-07-02 23:13:43.235906746 +1000
@@ -97,7 +97,9 @@ public:
int indexReadRecords(Ndb*,
const char * idxName,
int records,
- int batchsize = 1);
+ int batchsize = 1,
+ ExecType execType= Commit,
+ AbortOption abortOption= AbortOnError);
int indexUpdateRecords(Ndb*,
const char * idxName,
Index: ndb-work/ndb/test/src/HugoTransactions.cpp
===================================================================
--- ndb-work.orig/ndb/test/src/HugoTransactions.cpp 2007-07-02 23:05:55.129230867 +1000
+++ ndb-work/ndb/test/src/HugoTransactions.cpp 2007-07-02 23:13:54.140528165 +1000
@@ -1434,7 +1434,9 @@ int
HugoTransactions::indexReadRecords(Ndb* pNdb,
const char * idxName,
int records,
- int batch){
+ int batch,
+ ExecType execType,
+ AbortOption abortOption){
int reads = 0;
int r = 0;
int retryAttempt = 0;
@@ -1528,7 +1530,8 @@ HugoTransactions::indexReadRecords(Ndb*
}
}
- 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-02 23:26:08.386370451
+1000
+++ ndb-work/ndb/test/run-test/daily-basic-tests.txt 2007-07-02 23:39:53.789407489 +1000
@@ -771,3 +771,7 @@ cmd: DbAsyncGenerator
args: -time 60 -p 1 -proc 25
type: bench
+max-time: 60
+cmd: testIndex
+args: -n Bug28804 T1
+
--
Stewart Smith