/* Copyright (C) 2003 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include #include "ScanFunctions.hpp" #include const NdbDictionary::Table * getTable(Ndb* pNdb, int i){ const NdbDictionary::Table* t = NDBT_Tables::getTable(i); if (t == NULL){ return 0; } return pNdb->getDictionary()->getTable(t->getName()); } int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){ int records = ctx->getProperty("Rows", ctx->getNumRecords()); HugoTransactions hugoTrans(*ctx->getTab()); if (hugoTrans.loadTable(GETNDB(step), records) != 0){ return NDBT_FAILED; } return NDBT_OK; } int runCreateAllTables(NDBT_Context* ctx, NDBT_Step* step){ int a = NDBT_Tables::createAllTables(GETNDB(step), false, true); return a; } int runDropAllTablesExceptTestTable(NDBT_Context* ctx, NDBT_Step* step){ for (int i=0; i < NDBT_Tables::getNumTables(); i++){ const NdbDictionary::Table* tab = NDBT_Tables::getTable(i); if (tab == NULL){ return NDBT_ProgramExit(NDBT_FAILED); } // Don't drop test table if (strcmp(tab->getName(), ctx->getTab()->getName()) == 0){ continue; } int res = GETNDB(step)->getDictionary()->dropTable(tab->getName()); if(res == -1){ return NDBT_FAILED; } } return NDBT_OK; } int runLoadAllTables(NDBT_Context* ctx, NDBT_Step* step){ int records = ctx->getNumRecords(); for (int i=0; i < NDBT_Tables::getNumTables(); i++){ const NdbDictionary::Table* tab = getTable(GETNDB(step), i); if (tab == NULL){ return NDBT_FAILED; } HugoTransactions hugoTrans(*tab); if (hugoTrans.loadTable(GETNDB(step), records) != 0){ return NDBT_FAILED; } } return NDBT_OK; } char orderedPkIdxName[255]; int createOrderedPkIndex(NDBT_Context* ctx, NDBT_Step* step){ const NdbDictionary::Table* pTab = ctx->getTab(); Ndb* pNdb = GETNDB(step); // Create index BaseString::snprintf(orderedPkIdxName, sizeof(orderedPkIdxName), "IDC_O_PK_%s", pTab->getName()); NdbDictionary::Index pIdx(orderedPkIdxName); pIdx.setTable(pTab->getName()); pIdx.setType(NdbDictionary::Index::OrderedIndex); pIdx.setLogging(false); for (int c = 0; c< pTab->getNoOfColumns(); c++){ const NdbDictionary::Column * col = pTab->getColumn(c); if(col->getPrimaryKey()){ pIdx.addIndexColumn(col->getName()); } } if (pNdb->getDictionary()->createIndex(pIdx) != 0){ ndbout << "FAILED! to create index" << endl; const NdbError err = pNdb->getDictionary()->getNdbError(); ERR(err); return NDBT_FAILED; } return NDBT_OK; } int createOrderedPkIndex_Drop(NDBT_Context* ctx, NDBT_Step* step){ const NdbDictionary::Table* pTab = ctx->getTab(); Ndb* pNdb = GETNDB(step); // Drop index if (pNdb->getDictionary()->dropIndex(orderedPkIdxName, pTab->getName()) != 0){ ndbout << "FAILED! to drop index" << endl; ERR(pNdb->getDictionary()->getNdbError()); return NDBT_FAILED; } return NDBT_OK; } int runScanReadRandomTable(NDBT_Context* ctx, NDBT_Step* step){ int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); int parallelism = ctx->getProperty("Parallelism", 240); int abort = ctx->getProperty("AbortProb", 5); int i = 0; while (igetName() << endl; HugoTransactions hugoTrans(*tab); g_info << i << ": "; if (hugoTrans.scanReadRecords(GETNDB(step), records, abort, parallelism) != 0){ return NDBT_FAILED; } i++; } return NDBT_OK; } int runInsertUntilStopped(NDBT_Context* ctx, NDBT_Step* step){ int records = ctx->getNumRecords(); int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (ctx->isTestStopped() == false) { g_info << i << ": "; if (hugoTrans.loadTable(GETNDB(step), records, 1) != 0){ return NDBT_FAILED; } i++; } return NDBT_OK; } int runInsertDelete(NDBT_Context* ctx, NDBT_Step* step){ int result = NDBT_OK; int records = ctx->getNumRecords(); int loops = ctx->getNumLoops(); int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); UtilTransactions utilTrans(*ctx->getTab()); while (istopTest(); return result; } int runClearTable(NDBT_Context* ctx, NDBT_Step* step){ int records = ctx->getNumRecords(); UtilTransactions utilTrans(*ctx->getTab()); if (utilTrans.clearTable2(GETNDB(step), records) != 0){ return NDBT_FAILED; } return NDBT_OK; } int runScanDelete(NDBT_Context* ctx, NDBT_Step* step){ int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); int i = 0; UtilTransactions utilTrans(*ctx->getTab()); HugoTransactions hugoTrans(*ctx->getTab()); while (igetNumLoops(); int records = ctx->getNumRecords(); int i = 0; UtilTransactions utilTrans(*ctx->getTab()); HugoTransactions hugoTrans(*ctx->getTab()); while (igetNumLoops(); int records = ctx->getProperty("Rows", ctx->getNumRecords()); int parallelism = ctx->getProperty("Parallelism", 240); int abort = ctx->getProperty("AbortProb", 5); int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (iisTestStopped()) { g_info << i << ": "; if (hugoTrans.scanReadRecords(GETNDB(step), records, abort, parallelism) != 0){ return NDBT_FAILED; } i++; } return NDBT_OK; } int runRandScanRead(NDBT_Context* ctx, NDBT_Step* step){ int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); int parallelism = ctx->getProperty("Parallelism", 240); int abort = ctx->getProperty("AbortProb", 5); int tupscan = ctx->getProperty("TupScan", (Uint32)0); int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (iisTestStopped()) { g_info << i << ": "; NdbOperation::LockMode lm = (NdbOperation::LockMode)(rand() % 3); int scan_flags = 0; if (tupscan == 1) scan_flags |= NdbScanOperation::SF_TupScan; else if (tupscan == 2 && ((rand() & 0x800))) { scan_flags |= NdbScanOperation::SF_TupScan; } if (hugoTrans.scanReadRecords(GETNDB(step), records, abort, parallelism, lm, scan_flags) != 0){ return NDBT_FAILED; } i++; } return NDBT_OK; } int runScanReadIndex(NDBT_Context* ctx, NDBT_Step* step){ int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); int parallelism = ctx->getProperty("Parallelism", 240); int abort = ctx->getProperty("AbortProb", 5); const NdbDictionary::Index * pIdx = GETNDB(step)->getDictionary()->getIndex(orderedPkIdxName, ctx->getTab()->getName()); int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (pIdx && iisTestStopped()) { g_info << i << ": "; bool sort = (rand() % 100) > 50 ? true : false; bool desc = (rand() % 100) > 50 ? true : false; desc = false; // random causes too many deadlocks int scan_flags = (NdbScanOperation::SF_OrderBy & -(int)sort) | (NdbScanOperation::SF_Descending & -(int)desc); NdbOperation::LockMode lm = (NdbOperation::LockMode)(rand() % 3); if (hugoTrans.scanReadRecords(GETNDB(step), pIdx, records, abort, parallelism, lm, scan_flags) != 0){ return NDBT_FAILED; } i++; } return NDBT_OK; } int runScanReadCommitted(NDBT_Context* ctx, NDBT_Step* step){ int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); int parallelism = ctx->getProperty("Parallelism", 240); int abort = ctx->getProperty("AbortProb", 5); bool tupScan = ctx->getProperty("TupScan"); int scan_flags = (NdbScanOperation::SF_TupScan & -(int)tupScan); int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (iisTestStopped()) { g_info << i << ": "; if (hugoTrans.scanReadRecords(GETNDB(step), records, abort, parallelism, NdbOperation::LM_CommittedRead, scan_flags) != 0){ return NDBT_FAILED; } i++; } return NDBT_OK; } int runScanReadError(NDBT_Context* ctx, NDBT_Step* step){ int result = NDBT_OK; int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); int parallelism = 240; // Max parallelism int error = ctx->getProperty("ErrorCode"); NdbRestarter restarter; int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (iisTestStopped()) { g_info << i << ": "; ndbout << "insertErrorInAllNodes("<getProperty("ErrorCode"); NdbRestarter restarter; ctx->setProperty("ErrorCode", (Uint32)0); if (restarter.insertErrorInAllNodes(error) != 0){ ndbout << "Could not insert error in all nodes "<getNumLoops(); int records = ctx->getNumRecords(); int parallelism = 240; // Max parallelism int error = ctx->getProperty("ErrorCode"); NdbRestarter restarter; int lastId = 0; if (restarter.getNumDbNodes() < 2){ ctx->stopTest(); return NDBT_OK; } int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (igetNumRecords(); int i = 0; int parallelism = ctx->getProperty("Parallelism", 240); int para = parallelism; HugoTransactions hugoTrans(*ctx->getTab()); while (ctx->isTestStopped() == false) { if (parallelism == RANDOM_PARALLELISM) para = myRandom48(239)+1; g_info << i << ": "; if (hugoTrans.scanReadRecords(GETNDB(step), records, 0, para) != 0){ return NDBT_FAILED; } i++; } return NDBT_OK; } int runScanReadUntilStoppedNoCount(NDBT_Context* ctx, NDBT_Step* step){ int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (ctx->isTestStopped() == false) { g_info << i << ": "; if (hugoTrans.scanReadRecords(GETNDB(step), 0) != 0){ return NDBT_FAILED; } i++; } return NDBT_OK; } int runScanReadUntilStoppedPrintTime(NDBT_Context* ctx, NDBT_Step* step){ int records = ctx->getNumRecords(); int i = 0; int parallelism = ctx->getProperty("Parallelism", 240); NdbTimer timer; Ndb* ndb = GETNDB(step); HugoTransactions hugoTrans(*ctx->getTab()); while (ctx->isTestStopped() == false) { timer.doReset(); timer.doStart(); g_info << i << ": "; if (ndb->waitUntilReady() != 0) return NDBT_FAILED; if (hugoTrans.scanReadRecords(GETNDB(step), records, 0, parallelism) != 0) return NDBT_FAILED; timer.doStop(); if ((timer.elapsedTime()/1000) > 1) timer.printTotalTime(); i++; } return NDBT_OK; } int runPkRead(NDBT_Context* ctx, NDBT_Step* step){ int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (igetNumLoops(); int records = ctx->getNumRecords(); int parallelism = ctx->getProperty("Parallelism", 1); int abort = ctx->getProperty("AbortProb", 5); int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (igetNumRecords(); int i = 0; int parallelism = ctx->getProperty("Parallelism", 240); int para = parallelism; HugoTransactions hugoTrans(*ctx->getTab()); while (ctx->isTestStopped() == false) { if (parallelism == RANDOM_PARALLELISM) para = myRandom48(239)+1; g_info << i << ": "; if (hugoTrans.scanUpdateRecords(GETNDB(step), 0, 0, para) == NDBT_FAILED){ return NDBT_FAILED; } i++; } return NDBT_OK; } int runScanUpdate2(NDBT_Context* ctx, NDBT_Step* step){ int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); int parallelism = ctx->getProperty("Parallelism", 240); int abort = ctx->getProperty("AbortProb", 5); int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (igetNumRecords(); HugoTransactions hugoTrans(*ctx->getTab()); if (hugoTrans.lockRecords(GETNDB(step), records, 5, 500) != 0){ result = NDBT_FAILED; } ctx->stopTest(); return result; } int runRestarter(NDBT_Context* ctx, NDBT_Step* step){ int result = NDBT_OK; int loops = ctx->getNumLoops(); NdbRestarter restarter; int i = 0; int lastId = 0; int timeout = 240; if (restarter.getNumDbNodes() < 2){ ctx->stopTest(); return NDBT_OK; } while(istopTest(); return result; } int runStopAndStartNode(NDBT_Context* ctx, NDBT_Step* step){ int result = NDBT_OK; int loops = ctx->getNumLoops(); NdbRestarter restarter; int i = 0; int lastId = 0; int timeout = 240; if (restarter.getNumDbNodes() < 2){ ctx->stopTest(); return NDBT_OK; } while(istopTest(); return result; } int runRestarter9999(NDBT_Context* ctx, NDBT_Step* step){ int result = NDBT_OK; int loops = ctx->getNumLoops(); NdbRestarter restarter; int i = 0; int lastId = 0; if (restarter.getNumDbNodes() < 2){ ctx->stopTest(); return NDBT_OK; } while(istopTest(); return result; } int runCheckGetValue(NDBT_Context* ctx, NDBT_Step* step){ const NdbDictionary::Table* pTab = ctx->getTab(); int parallelism = ctx->getProperty("Parallelism", 1); int records = ctx->getNumRecords(); int numFailed = 0; AttribList alist; alist.buildAttribList(pTab); UtilTransactions utilTrans(*pTab); for(size_t i = 0; i < alist.attriblist.size(); i++){ g_info << (unsigned)i << endl; if(utilTrans.scanReadRecords(GETNDB(step), parallelism, NdbOperation::LM_Read, records, alist.attriblist[i]->numAttribs, alist.attriblist[i]->attribs) != 0){ numFailed++; } if(utilTrans.scanReadRecords(GETNDB(step), parallelism, NdbOperation::LM_Read, records, alist.attriblist[i]->numAttribs, alist.attriblist[i]->attribs) != 0){ numFailed++; } } if(numFailed > 0) return NDBT_FAILED; else return NDBT_OK; } int runCloseWithoutStop(NDBT_Context* ctx, NDBT_Step* step){ const NdbDictionary::Table* pTab = ctx->getTab(); int records = ctx->getNumRecords(); int numFailed = 0; ScanFunctions scanF(*pTab); // Iterate over all possible parallelism valuse for (int p = 1; p<240; p++){ g_info << p << " CloseWithoutStop openScan" << endl; if (scanF.scanReadFunctions(GETNDB(step), records, p, ScanFunctions::CloseWithoutStop, false) != 0){ numFailed++; } g_info << p << " CloseWithoutStop openScanExclusive" << endl; if (scanF.scanReadFunctions(GETNDB(step), records, p, ScanFunctions::CloseWithoutStop, true) != 0){ numFailed++; } } if(numFailed > 0) return NDBT_FAILED; else return NDBT_OK; } int runNextScanWhenNoMore(NDBT_Context* ctx, NDBT_Step* step){ const NdbDictionary::Table* pTab = ctx->getTab(); int records = ctx->getNumRecords(); int numFailed = 0; ScanFunctions scanF(*pTab); if (scanF.scanReadFunctions(GETNDB(step), records, 6, ScanFunctions::NextScanWhenNoMore, false) != 0){ numFailed++; } if (scanF.scanReadFunctions(GETNDB(step), records, 6, ScanFunctions::NextScanWhenNoMore, true) != 0){ numFailed++; } if(numFailed > 0) return NDBT_FAILED; else return NDBT_OK; } int runEqualAfterOpenScan(NDBT_Context* ctx, NDBT_Step* step){ const NdbDictionary::Table* pTab = ctx->getTab(); int records = ctx->getNumRecords(); int numFailed = 0; ScanFunctions scanF(*pTab); if (scanF.scanReadFunctions(GETNDB(step), records, 6, ScanFunctions::EqualAfterOpenScan, false) == NDBT_OK){ numFailed++; } if (scanF.scanReadFunctions(GETNDB(step), records, 6, ScanFunctions::EqualAfterOpenScan, true) == NDBT_OK){ numFailed++; } if(numFailed > 0) return NDBT_FAILED; else return NDBT_OK; } int runOnlyOpenScanOnce(NDBT_Context* ctx, NDBT_Step* step){ const NdbDictionary::Table* pTab = ctx->getTab(); int records = ctx->getNumRecords(); int numFailed = 0; ScanFunctions scanF(*pTab); g_info << "OnlyOpenScanOnce openScanRead" << endl; if (scanF.scanReadFunctions(GETNDB(step), records, 6, ScanFunctions::OnlyOpenScanOnce, false) == 0){ numFailed++; } g_info << "OnlyOpenScanOnce openScanExclusive" << endl; if (scanF.scanReadFunctions(GETNDB(step), records, 6, ScanFunctions::OnlyOpenScanOnce, true) == 0){ numFailed++; } if(numFailed > 0) return NDBT_FAILED; else return NDBT_OK; } int runOnlyOneOpInScanTrans(NDBT_Context* ctx, NDBT_Step* step){ return NDBT_OK; } int runExecuteScanWithoutOpenScan(NDBT_Context* ctx, NDBT_Step* step){ return NDBT_OK; } int runOnlyOneOpBeforeOpenScan(NDBT_Context* ctx, NDBT_Step* step){ return NDBT_OK; } int runOnlyOneScanPerTrans(NDBT_Context* ctx, NDBT_Step* step){ return NDBT_OK; } int runNoCloseTransaction(NDBT_Context* ctx, NDBT_Step* step){ const NdbDictionary::Table* pTab = ctx->getTab(); int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); int numFailed = 0; ScanFunctions scanF(*pTab); int l = 0; while(l < loops){ if (scanF.scanReadFunctions(GETNDB(step), records, 6, ScanFunctions::NoCloseTransaction, false) != 0){ numFailed++; } if (scanF.scanReadFunctions(GETNDB(step), records, 6, ScanFunctions::NoCloseTransaction, true) != 0){ numFailed++; } l++; } if(numFailed > 0) return NDBT_FAILED; else return NDBT_OK; } int runCheckInactivityTimeOut(NDBT_Context* ctx, NDBT_Step* step){ const NdbDictionary::Table* pTab = ctx->getTab(); int records = ctx->getNumRecords(); int numFailed = 0; ScanFunctions scanF(*pTab); if (scanF.scanReadFunctions(GETNDB(step), records, 1, ScanFunctions::CheckInactivityTimeOut, false) != NDBT_OK){ numFailed++; } if (scanF.scanReadFunctions(GETNDB(step), records, 240, ScanFunctions::CheckInactivityTimeOut, true) != NDBT_OK){ numFailed++; } if(numFailed > 0) return NDBT_FAILED; else return NDBT_OK; } int runCheckInactivityBeforeClose(NDBT_Context* ctx, NDBT_Step* step){ const NdbDictionary::Table* pTab = ctx->getTab(); int records = ctx->getNumRecords(); int numFailed = 0; ScanFunctions scanF(*pTab); if (scanF.scanReadFunctions(GETNDB(step), records, 16, ScanFunctions::CheckInactivityBeforeClose, false) != 0){ numFailed++; } if (scanF.scanReadFunctions(GETNDB(step), records, 240, ScanFunctions::CheckInactivityBeforeClose, true) != 0){ numFailed++; } if(numFailed > 0) return NDBT_FAILED; else return NDBT_OK; } int runScanRestart(NDBT_Context* ctx, NDBT_Step* step){ int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); Ndb * pNdb = GETNDB(step); const NdbDictionary::Table* pTab = ctx->getTab(); HugoCalculator calc(* pTab); NDBT_ResultRow tmpRow(* pTab); int i = 0; while (iisTestStopped()) { g_info << i++ << ": "; const int record = (rand() % records); g_info << " row=" << record; NdbConnection* pCon = pNdb->startTransaction(); NdbScanOperation* pOp = pCon->getNdbScanOperation(pTab->getName()); if (pOp == NULL) { ERR(pCon->getNdbError()); return NDBT_FAILED; } if( pOp->readTuples() ) { ERR(pCon->getNdbError()); return NDBT_FAILED; } int check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pCon->getNdbError()); return NDBT_FAILED; } // Define attributes to read for(int a = 0; agetNoOfColumns(); a++){ if((tmpRow.attributeStore(a) = pOp->getValue(pTab->getColumn(a)->getName())) == 0) { ERR(pCon->getNdbError()); return NDBT_FAILED; } } check = pCon->execute(NoCommit); if( check == -1 ) { ERR(pCon->getNdbError()); return NDBT_FAILED; } int res; int row = 0; while(row < record && (res = pOp->nextResult()) == 0) { if(calc.verifyRowValues(&tmpRow) != 0){ abort(); return NDBT_FAILED; } row++; } if(row != record){ ERR(pCon->getNdbError()); abort(); return NDBT_FAILED; } g_info << " restarting" << endl; if((res = pOp->restart()) != 0){ ERR(pCon->getNdbError()); abort(); return NDBT_FAILED; } row = 0; while((res = pOp->nextResult()) == 0) { if(calc.verifyRowValues(&tmpRow) != 0){ abort(); return NDBT_FAILED; } row++; } if(res != 1 || row != records){ ERR(pCon->getNdbError()); abort(); return NDBT_FAILED; } pCon->close(); } return NDBT_OK; } int runScanParallelism(NDBT_Context* ctx, NDBT_Step* step){ int loops = ctx->getNumLoops() + 3; int records = ctx->getNumRecords(); int abort = ctx->getProperty("AbortProb", 15); Uint32 fib[] = { 1, 2 }; Uint32 parallelism = 0; // start with 0 int i = 0; HugoTransactions hugoTrans(*ctx->getTab()); while (iisTestStopped()) { g_info << i << ": "; if (hugoTrans.scanReadRecords(GETNDB(step), records, abort, parallelism, NdbOperation::LM_Read) != 0){ return NDBT_FAILED; } if (hugoTrans.scanReadRecords(GETNDB(step), records, abort, parallelism, NdbOperation::LM_Exclusive) != 0){ return NDBT_FAILED; } if (hugoTrans.scanReadRecords(GETNDB(step), records, abort, parallelism, NdbOperation::LM_CommittedRead) != 0){ return NDBT_FAILED; } if (hugoTrans.scanUpdateRecords(GETNDB(step), records, abort, parallelism) != 0){ return NDBT_FAILED; } i++; parallelism = fib[0]; Uint32 next = fib[0] + fib[1]; fib[0] = fib[1]; fib[1] = next; } return NDBT_OK; } int runScanVariants(NDBT_Context* ctx, NDBT_Step* step) { int loops = ctx->getNumLoops(); int records = ctx->getNumRecords(); Ndb * pNdb = GETNDB(step); const NdbDictionary::Table* pTab = ctx->getTab(); HugoCalculator calc(* pTab); NDBT_ResultRow tmpRow(* pTab); for(int lm = 0; lm <= NdbOperation::LM_CommittedRead; lm++) { for(int flags = 0; flags < 4; flags++) { for (int batch = 0; batch < 100; batch += (1 + batch + (batch >> 3))) { for (int par = 0; par < 16; par += 1 + (rand() % 3)) { bool disk = flags & 1; bool tups = flags & 2; g_info << "lm: " << lm << " disk: " << disk << " tup scan: " << tups << " par: " << par << " batch: " << batch << endl; NdbConnection* pCon = pNdb->startTransaction(); NdbScanOperation* pOp = pCon->getNdbScanOperation(pTab->getName()); if (pOp == NULL) { ERR(pCon->getNdbError()); return NDBT_FAILED; } if( pOp->readTuples((NdbOperation::LockMode)lm, tups ? NdbScanOperation::SF_TupScan : 0, par, batch) != 0) { ERR(pCon->getNdbError()); return NDBT_FAILED; } int check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pCon->getNdbError()); return NDBT_FAILED; } // Define attributes to read bool found_disk = false; for(int a = 0; agetNoOfColumns(); a++){ if (pTab->getColumn(a)->getStorageType() == NdbDictionary::Column::StorageTypeDisk) { found_disk = true; if (!disk) continue; } if((pOp->getValue(pTab->getColumn(a)->getName())) == 0) { ERR(pCon->getNdbError()); return NDBT_FAILED; } } if (! (disk && !found_disk)) { check = pCon->execute(NoCommit); if( check == -1 ) { ERR(pCon->getNdbError()); return NDBT_FAILED; } int res; int row = 0; while((res = pOp->nextResult()) == 0); } pCon->close(); } } } } return NDBT_OK; } int runBug24447(NDBT_Context* ctx, NDBT_Step* step){ int loops = 1; //ctx->getNumLoops(); int records = ctx->getNumRecords(); int abort = ctx->getProperty("AbortProb", 15); NdbRestarter restarter; HugoTransactions hugoTrans(*ctx->getTab()); int i = 0; while (iisTestStopped()) { g_info << i++ << ": "; int nodeId = restarter.getRandomNotMasterNodeId(rand()); if (nodeId == -1) nodeId = restarter.getMasterNodeId(); if (restarter.insertErrorInNode(nodeId, 8038) != 0) { ndbout << "Could not insert error in node="<;