int HugoOperations::scanReadRecords(Ndb* pNdb, NdbScanOperation::LockMode lm, int records){ allocRows(records); NdbScanOperation * pOp = pTrans->getNdbScanOperation(tab.getName()); if(!pOp) return -1; if(pOp->readTuples(lm, 0, 1)){ return -1; } for(int a = 0; a<tab.getNoOfColumns(); a++){ if((rows[0]->attributeStore(a) = pOp->getValue(tab.getColumn(a)->getName())) == 0) { ERR(pTrans->getNdbError()); return NDBT_FAILED; } } RsPair p = {pOp, records}; m_result_sets.push_back(p); return 0; }
int scan_print(Ndb * myNdb) { // Scan all records exclusive and update // them one by one int retryAttempt = 0; const int retryMax = 10; int fetchedRows = 0; int check; NdbError err; NdbTransaction *myTrans; NdbScanOperation *myScanOp; /* Result of reading attribute value, three columns: REG_NO, BRAND, and COLOR */ NdbRecAttr * myRecAttr[3]; const NdbDictionary::Dictionary* myDict= myNdb->getDictionary(); const NdbDictionary::Table *myTable= myDict->getTable("api_scan"); if (myTable == NULL) APIERROR(myDict->getNdbError()); /** * Loop as long as : * retryMax not reached * failed operations due to TEMPORARY erros * * Exit loop; * retyrMax reached * Permanent error (return -1) */ while (true) { if (retryAttempt >= retryMax) { std::cout << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << std::endl; return -1; } myTrans = myNdb->startTransaction(); if (myTrans == NULL) { const NdbError err = myNdb->getNdbError(); if (err.status == NdbError::TemporaryError) { milliSleep(50); retryAttempt++; continue; } std::cout << err.message << std::endl; return -1; } /* * Define a scan operation. * NDBAPI. */ myScanOp = myTrans->getNdbScanOperation(myTable); if (myScanOp == NULL) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Read without locks, without being placed in lock queue */ if( myScanOp->readTuples(NdbOperation::LM_CommittedRead) == -1) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Define storage for fetched attributes. * E.g., the resulting attributes of executing * myOp->getValue("REG_NO") is placed in myRecAttr[0]. * No data exists in myRecAttr until transaction has commited! */ myRecAttr[0] = myScanOp->getValue("REG_NO"); myRecAttr[1] = myScanOp->getValue("BRAND"); myRecAttr[2] = myScanOp->getValue("COLOR"); if(myRecAttr[0] ==NULL || myRecAttr[1] == NULL || myRecAttr[2]==NULL) { std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * Start scan (NoCommit since we are only reading at this stage); */ if(myTrans->execute(NdbTransaction::NoCommit) != 0){ err = myTrans->getNdbError(); if(err.status == NdbError::TemporaryError){ std::cout << myTrans->getNdbError().message << std::endl; myNdb->closeTransaction(myTrans); milliSleep(50); continue; } std::cout << err.code << std::endl; std::cout << myTrans->getNdbError().code << std::endl; myNdb->closeTransaction(myTrans); return -1; } /** * start of loop: nextResult(true) means that "parallelism" number of * rows are fetched from NDB and cached in NDBAPI */ while((check = myScanOp->nextResult(true)) == 0){ do { fetchedRows++; /** * print REG_NO unsigned int */ std::cout << myRecAttr[0]->u_32_value() << "\t"; /** * print BRAND character string */ std::cout << myRecAttr[1]->aRef() << "\t"; /** * print COLOR character string */ std::cout << myRecAttr[2]->aRef() << std::endl; /** * nextResult(false) means that the records * cached in the NDBAPI are modified before * fetching more rows from NDB. */ } while((check = myScanOp->nextResult(false)) == 0); } myNdb->closeTransaction(myTrans); return 1; } return -1; }
int UtilTransactions::scanAndCompareUniqueIndex(Ndb* pNdb, const NdbDictionary::Index* pIndex, int parallelism, bool transactional){ int retryAttempt = 0; const int retryMax = 100; int check; NdbScanOperation *pOp; NDBT_ResultRow row(tab); parallelism = 1; while (true){ restart: if (retryAttempt >= retryMax){ g_info << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return NDBT_FAILED; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return NDBT_FAILED; } pOp = pTrans->getNdbScanOperation(tab.getName()); if (pOp == NULL) { const NdbError err = pNdb->getNdbError(); closeTransaction(pNdb); ERR(err); if (err.status == NdbError::TemporaryError){ NdbSleep_MilliSleep(50); retryAttempt++; continue; } return NDBT_FAILED; } int rs; if(transactional){ rs = pOp->readTuples(NdbScanOperation::LM_Read, 0, parallelism); } else { rs = pOp->readTuples(NdbScanOperation::LM_CommittedRead, 0, parallelism); } if( rs != 0 ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } // Read all attributes for (int a = 0; a < tab.getNoOfColumns(); a++){ if ((row.attributeStore(a) = pOp->getValue(tab.getColumn(a)->getName())) == 0) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } } check = pTrans->execute(NoCommit, AbortOnError); if( check == -1 ) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); closeTransaction(pNdb); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); closeTransaction(pNdb); return NDBT_FAILED; } int eof; int rows = 0; while((eof = pOp->nextResult()) == 0){ rows++; // ndbout << row.c_str().c_str() << endl; if (readRowFromTableAndIndex(pNdb, pTrans, pIndex, row) != NDBT_OK){ while((eof= pOp->nextResult(false)) == 0); if(eof == 2) eof = pOp->nextResult(true); // this should give -1 if(eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); closeTransaction(pNdb); NdbSleep_MilliSleep(50); retryAttempt++; goto restart; } } closeTransaction(pNdb); return NDBT_FAILED; } } if (eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); closeTransaction(pNdb); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); closeTransaction(pNdb); return NDBT_FAILED; } closeTransaction(pNdb); return NDBT_OK; } return NDBT_FAILED; }
int select_count(Ndb* pNdb, const NdbDictionary::Table* pTab, int parallelism, Uint64* count_rows, NdbOperation::LockMode lock) { int retryAttempt = 0; const int retryMax = 100; int check; NdbTransaction *pTrans; NdbScanOperation *pOp; const Uint32 codeWords= 1; Uint32 codeSpace[ codeWords ]; NdbInterpretedCode code(NULL, // Table is irrelevant &codeSpace[0], codeWords); if ((code.interpret_exit_last_row() != 0) || (code.finalise() != 0)) { ERR(code.getNdbError()); return NDBT_FAILED; } while (true) { if (retryAttempt >= retryMax) { g_info << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return NDBT_FAILED; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError) { NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return NDBT_FAILED; } pOp = pTrans->getNdbScanOperation(pTab->getName()); if (pOp == NULL) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } if( pOp->readTuples(NdbScanOperation::LM_Dirty) ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } check = pOp->setInterpretedCode(&code); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } Uint64 tmp; Uint32 row_size; pOp->getValue(NdbDictionary::Column::ROW_COUNT, (char*)&tmp); pOp->getValue(NdbDictionary::Column::ROW_SIZE, (char*)&row_size); check = pTrans->execute(NdbTransaction::NoCommit); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } Uint64 row_count = 0; int eof; while((eof = pOp->nextResult(true)) == 0) { row_count += tmp; } if (eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError) { pNdb->closeTransaction(pTrans); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } pNdb->closeTransaction(pTrans); if (count_rows != NULL) { *count_rows = row_count; } return NDBT_OK; } return NDBT_FAILED; }
int UtilTransactions::copyTableData(Ndb* pNdb, const char* destName){ // Scan all records and copy // them to destName table int retryAttempt = 0; const int retryMax = 10; int insertedRows = 0; int parallelism = 240; int check; NdbScanOperation *pOp; NDBT_ResultRow row(tab); while (true){ if (retryAttempt >= retryMax){ g_info << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return NDBT_FAILED; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return NDBT_FAILED; } pOp = pTrans->getNdbScanOperation(tab.getName()); if (pOp == NULL) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } if( pOp->readTuples(NdbScanOperation::LM_Read, parallelism) ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } // Read all attributes for (int a = 0; a < tab.getNoOfColumns(); a++){ if ((row.attributeStore(a) = pOp->getValue(tab.getColumn(a)->getName())) == 0) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } } check = pTrans->execute(NoCommit, AbortOnError); if( check == -1 ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } int eof; while((eof = pOp->nextResult(true)) == 0){ do { insertedRows++; if (addRowToInsert(pNdb, pTrans, row, destName) != 0){ closeTransaction(pNdb); return NDBT_FAILED; } } while((eof = pOp->nextResult(false)) == 0); check = pTrans->execute(Commit, AbortOnError); pTrans->restart(); if( check == -1 ) { const NdbError err = pTrans->getNdbError(); ERR(err); closeTransaction(pNdb); return NDBT_FAILED; } } if (eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); closeTransaction(pNdb); NdbSleep_MilliSleep(50); // If error = 488 there should be no limit on number of retry attempts if (err.code != 488) retryAttempt++; continue; } ERR(err); closeTransaction(pNdb); return NDBT_FAILED; } closeTransaction(pNdb); g_info << insertedRows << " rows copied" << endl; return NDBT_OK; } return NDBT_FAILED; }
int UtilTransactions::scanReadRecords(Ndb* pNdb, int parallelism, NdbOperation::LockMode lm, int records, int noAttribs, int *attrib_list, ReadCallBackFn* fn){ int retryAttempt = 0; const int retryMax = 100; int check; NdbScanOperation *pOp; NDBT_ResultRow row(tab); while (true){ if (retryAttempt >= retryMax){ g_info << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return NDBT_FAILED; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return NDBT_FAILED; } pOp = getScanOperation(pTrans); if (pOp == NULL) { const NdbError err = pNdb->getNdbError(); closeTransaction(pNdb); if (err.status == NdbError::TemporaryError){ ERR(err); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return NDBT_FAILED; } if( pOp->readTuples(lm, 0, parallelism) ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } // Call getValue for all the attributes supplied in attrib_list // ************************************************ for (int a = 0; a < noAttribs; a++){ if (attrib_list[a] < tab.getNoOfColumns()){ g_info << "getValue(" << attrib_list[a] << ")" << endl; if ((row.attributeStore(attrib_list[a]) = pOp->getValue(tab.getColumn(attrib_list[a])->getName())) == 0) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } } } // ************************************************* check = pTrans->execute(NoCommit, AbortOnError); if( check == -1 ) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); closeTransaction(pNdb); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); closeTransaction(pNdb); return NDBT_FAILED; } int eof; int rows = 0; while((eof = pOp->nextResult()) == 0){ rows++; // Call callback for each record returned if(fn != NULL) fn(&row); } if (eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); closeTransaction(pNdb); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); closeTransaction(pNdb); return NDBT_FAILED; } closeTransaction(pNdb); g_info << rows << " rows have been read" << endl; if (records != 0 && rows != records){ g_info << "Check expected number of records failed" << endl << " expected=" << records <<", " << endl << " read=" << rows << endl; return NDBT_FAILED; } return NDBT_OK; } return NDBT_FAILED; }
inline int ScanInterpretTest::scanRead(Ndb* pNdb, int records, int parallelism, ScanFilter& filter){ int retryAttempt = 0; int retryMax = 100; int check; NdbConnection *pTrans; NdbScanOperation *pOp; while (true){ if (retryAttempt >= retryMax){ ndbout << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return NDBT_FAILED; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return NDBT_FAILED; } pOp = pTrans->getNdbScanOperation(tab.getName()); if (pOp == NULL) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } if( pOp->readTuples(NdbScanOperation::LM_Read, 0, parallelism) ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } if (filter.filterOp(pOp) != 0){ ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } // Read all attributes for(int a = 0; a<tab.getNoOfColumns(); a++){ if((row.attributeStore(a) = pOp->getValue(tab.getColumn(a)->getName())) == 0) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } } check = pTrans->execute(NoCommit); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } int eof; int rows = 0; NdbConnection* pInsTrans; while((eof = pOp->nextResult(true)) == 0){ do { rows++; if (addRowToInsert(pNdb, pTrans) != 0){ pNdb->closeTransaction(pTrans); return NDBT_FAILED; } } while((eof = pOp->nextResult(false)) == 0); check = pTrans->execute(Commit); if( check == -1 ) { const NdbError err = pTrans->getNdbError(); ERR(err); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } } if (eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); pNdb->closeTransaction(pTrans); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } pNdb->closeTransaction(pTrans); g_info << rows << " rows have been scanned" << endl; return NDBT_OK; } return NDBT_FAILED; }
inline int ScanInterpretTest::scanReadVerify(Ndb* pNdb, int records, int parallelism, ScanFilter& filter){ int retryAttempt = 0; const int retryMax = 100; int check; NdbConnection *pTrans; NdbScanOperation *pOp; while (true){ if (retryAttempt >= retryMax){ ndbout << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return NDBT_FAILED; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return NDBT_FAILED; } pOp = pTrans->getNdbScanOperation(tab.getName()); if (pOp == NULL) { if (pOp->getValue("KOL2") == 0){ ERR(pNdb->getNdbError()); return NDBT_FAILED; } ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } if( pOp->readTuples(NdbScanOperation::LM_Read, 0, parallelism) ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } check = pOp->interpret_exit_ok(); if (check == -1) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } // Read all attributes for(int a = 0; a<tab.getNoOfColumns(); a++){ if((row.attributeStore(a) = pOp->getValue(tab.getColumn(a)->getName())) == 0) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } } check = pTrans->execute(NoCommit); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } int eof; int rows = 0; int rowsNoExist = 0; int rowsExist = 0; int existingRecordsNotFound = 0; int nonExistingRecordsFound = 0; NdbConnection* pExistTrans; NdbConnection* pNoExistTrans; while((eof = pOp->nextResult(true)) == 0){ pExistTrans = pNdb->startTransaction(); if (pExistTrans == NULL) { const NdbError err = pNdb->getNdbError(); ERR(err); return NDBT_FAILED; } pNoExistTrans = pNdb->startTransaction(); if (pNoExistTrans == NULL) { const NdbError err = pNdb->getNdbError(); ERR(err); return NDBT_FAILED; } do { rows++; if (filter.verifyRecord(row) == NDBT_OK){ rowsExist++; if (addRowToCheckTrans(pNdb, pExistTrans) != 0){ pNdb->closeTransaction(pTrans); pNdb->closeTransaction(pExistTrans); pNdb->closeTransaction(pNoExistTrans); return NDBT_FAILED; } }else{ rowsNoExist++; if (addRowToCheckTrans(pNdb, pNoExistTrans) != 0){ pNdb->closeTransaction(pTrans); pNdb->closeTransaction(pExistTrans); pNdb->closeTransaction(pNoExistTrans); return NDBT_FAILED; } } } while((eof = pOp->nextResult(false)) == 0); // Execute the transaction containing reads of // all the records that should be in the result table check = pExistTrans->execute(Commit); if( check == -1 ) { const NdbError err = pExistTrans->getNdbError(); ERR(err); if (err.code != 626){ pNdb->closeTransaction(pExistTrans); pNdb->closeTransaction(pNoExistTrans); pNdb->closeTransaction(pTrans); return NDBT_FAILED; }else{ // Some of the records expected to be found wasn't // there existingRecordsNotFound = 1; } } pNdb->closeTransaction(pExistTrans); // Execute the transaction containing reads of // all the records that should NOT be in the result table check = pNoExistTrans->execute(Commit, CommitAsMuchAsPossible); if( check == -1 ) { const NdbError err = pNoExistTrans->getNdbError(); // The transactions error code should be zero if (err.code != 626){ ERR(err); pNdb->closeTransaction(pNoExistTrans); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } // Loop through the no existing transaction and check that no // operations where successful const NdbOperation* pOp2 = NULL; while ((pOp2 = pNoExistTrans->getNextCompletedOperation(pOp2)) != NULL){ const NdbError err = pOp2->getNdbError(); if (err.code != 626){ ndbout << "err.code = " << err.code<< endl; nonExistingRecordsFound = 1; } } } pNdb->closeTransaction(pNoExistTrans); } if (eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); pNdb->closeTransaction(pTrans); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } int testResult = NDBT_OK; int rowsResult = 0; UtilTransactions utilTrans(restab); if (utilTrans.selectCount(pNdb, 240, &rowsResult) != 0){ return NDBT_FAILED; } if (existingRecordsNotFound == 1){ ndbout << "!!! Expected records not found" << endl; testResult = NDBT_FAILED; } if (nonExistingRecordsFound == 1){ ndbout << "!!! Unxpected records found" << endl; testResult = NDBT_FAILED; } ndbout << rows << " rows scanned(" << rowsExist << " found, " << rowsResult<<" expected)" << endl; if (rowsResult != rowsExist){ ndbout << "!!! Number of rows in result table different from expected" << endl; testResult = NDBT_FAILED; } return testResult; } return NDBT_FAILED; }
inline int ScanFunctions::scanReadFunctions(Ndb* pNdb, int records, int parallelism, ActionType action, bool exclusive){ int retryAttempt = 0; const int retryMax = 100; int sleepTime = 10; int check; NdbConnection *pTrans = 0; NdbScanOperation *pOp = 0; while (true){ if (retryAttempt >= retryMax){ g_err << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return NDBT_FAILED; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return NDBT_FAILED; } // Execute the scan without defining a scan operation pOp = pTrans->getNdbScanOperation(tab.getName()); if (pOp == NULL) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } if( pOp->readTuples(exclusive ? NdbScanOperation::LM_Exclusive : NdbScanOperation::LM_Read) ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } if (action == OnlyOpenScanOnce){ // Call openScan one more time when it's already defined if( pOp->readTuples(NdbScanOperation::LM_Read) ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } } if (action==EqualAfterOpenScan){ check = pOp->equal(tab.getColumn(0)->getName(), 10); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } } check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } for(int a = 0; a<tab.getNoOfColumns(); a++){ if(pOp->getValue(tab.getColumn(a)->getName()) == NULL) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } } check = pTrans->execute(NoCommit); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } int abortCount = records / 10; bool abortTrans = (action==CloseWithoutStop); int eof; int rows = 0; eof = pOp->nextResult(); while(eof == 0){ rows++; if (abortCount == rows && abortTrans == true){ g_info << "Scan is aborted after "<<abortCount<<" rows" << endl; if (action != CloseWithoutStop){ // Test that we can closeTrans without stopScan pOp->close(); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } } pNdb->closeTransaction(pTrans); return NDBT_OK; } if(action == CheckInactivityTimeOut){ if ((rows % (records / 10)) == 0){ // Sleep for a long time before calling nextScanResult if (sleepTime > 1) sleepTime--; g_info << "Sleeping "<<sleepTime<<" secs " << endl; NdbSleep_SecSleep(sleepTime); } } eof = pOp->nextResult(); } if (eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); // Be cruel, call nextScanResult after error for(int i=0; i<10; i++){ eof = pOp->nextResult(); if(eof == 0){ g_err << "nextScanResult returned eof = " << eof << endl << " That is an error when there are no more records" << endl; return NDBT_FAILED; } } // Be cruel end pNdb->closeTransaction(pTrans); NdbSleep_MilliSleep(50); retryAttempt++; g_info << "Starting over" << endl; // If test is CheckInactivityTimeOut // error 296 is expected if ((action == CheckInactivityTimeOut) && (err.code == 296)) return NDBT_OK; continue; } ERR(err); pNdb->closeTransaction(pTrans); return NDBT_FAILED; } if (action == NextScanWhenNoMore){ g_info << "Calling nextScanresult when there are no more records" << endl; for(int i=0; i<10; i++){ eof = pOp->nextResult(); if(eof == 0){ g_err << "nextScanResult returned eof = " << eof << endl << " That is an error when there are no more records" << endl; return NDBT_FAILED; } } } if(action == CheckInactivityBeforeClose){ // Sleep for a long time before calling close g_info << "NdbSleep_SecSleep(5) before close transaction" << endl; NdbSleep_SecSleep(5); } if(action == NoCloseTransaction) g_info << "Forgetting to close transaction" << endl; else pNdb->closeTransaction(pTrans); g_info << rows << " rows have been read" << endl; if (records != 0 && rows != records){ g_err << "Check expected number of records failed" << endl << " expected=" << records <<", " << endl << " read=" << rows << endl; return NDBT_FAILED; } return NDBT_OK; } return NDBT_FAILED; }
int HugoTransactions::scanReadRecords(Ndb* pNdb, int records, int abortPercent, int parallelism, NdbOperation::LockMode lm, int scan_flags) { int retryAttempt = 0; int check, a; NdbScanOperation *pOp; while (true){ if (retryAttempt >= m_retryMax){ g_err << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return NDBT_FAILED; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return NDBT_FAILED; } pOp = getScanOperation(pTrans); if (pOp == NULL) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } if( pOp ->readTuples(lm, scan_flags, parallelism) ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } for(a = 0; a<tab.getNoOfColumns(); a++){ if((row.attributeStore(a) = pOp->getValue(tab.getColumn(a)->getName())) == 0) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } } check = pTrans->execute(NoCommit, AbortOnError); if( check == -1 ) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR(err); closeTransaction(pNdb); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); closeTransaction(pNdb); return NDBT_FAILED; } // Abort after 1-100 or 1-records rows int ranVal = rand(); int abortCount = ranVal % (records == 0 ? 100 : records); bool abortTrans = false; if (abort > 0){ // Abort if abortCount is less then abortPercent if (abortCount < abortPercent) abortTrans = true; } int eof; int rows = 0; while((eof = pOp->nextResult(true)) == 0){ rows++; if (calc.verifyRowValues(&row) != 0){ closeTransaction(pNdb); return NDBT_FAILED; } if (abortCount == rows && abortTrans == true){ ndbout << "Scan is aborted" << endl; g_info << "Scan is aborted" << endl; pOp->close(); if( check == -1 ) { ERR(pTrans->getNdbError()); closeTransaction(pNdb); return NDBT_FAILED; } closeTransaction(pNdb); return NDBT_OK; } } if (eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError){ ERR_INFO(err); closeTransaction(pNdb); NdbSleep_MilliSleep(50); switch (err.code){ case 488: case 245: case 490: // Too many active scans, no limit on number of retry attempts break; default: retryAttempt++; } continue; } ERR(err); closeTransaction(pNdb); return NDBT_FAILED; } closeTransaction(pNdb); g_info << rows << " rows have been read" << endl; if (records != 0 && rows != records){ g_err << "Check expected number of records failed" << endl << " expected=" << records <<", " << endl << " read=" << rows << endl; return NDBT_FAILED; } return NDBT_OK; } return NDBT_FAILED; }
int run_scan(){ int iter = g_paramters[P_LOOPS].value; NDB_TICKS start1, stop; int sum_time= 0; int sample_rows = 0; int tot_rows = 0; NDB_TICKS sample_start = NdbTick_CurrentMillisecond(); Uint32 tot = g_paramters[P_ROWS].value; if(g_paramters[P_BOUND].value >= 2 || g_paramters[P_FILT].value == 2) iter *= g_paramters[P_ROWS].value; NdbScanOperation * pOp = 0; NdbIndexScanOperation * pIOp = 0; NdbConnection * pTrans = 0; int check = 0; for(int i = 0; i<iter; i++){ start1 = NdbTick_CurrentMillisecond(); pTrans = pTrans ? pTrans : g_ndb->startTransaction(); if(!pTrans){ g_err << "Failed to start transaction" << endl; err(g_ndb->getNdbError()); return -1; } int par = g_paramters[P_PARRA].value; int bat = 0; // g_paramters[P_BATCH].value; NdbScanOperation::LockMode lm; switch(g_paramters[P_LOCK].value){ case 0: lm = NdbScanOperation::LM_CommittedRead; break; case 1: lm = NdbScanOperation::LM_Read; break; case 2: lm = NdbScanOperation::LM_Exclusive; break; default: abort(); } if(g_paramters[P_ACCESS].value == 0){ pOp = pTrans->getNdbScanOperation(g_tablename); assert(pOp); pOp->readTuples(lm, bat, par); } else { if(g_paramters[P_RESET].value == 0 || pIOp == 0) { pOp= pIOp= pTrans->getNdbIndexScanOperation(g_indexname, g_tablename); bool ord = g_paramters[P_ACCESS].value == 2; pIOp->readTuples(lm, bat, par, ord); } else { pIOp->reset_bounds(); } switch(g_paramters[P_BOUND].value){ case 0: // All break; case 1: // None pIOp->setBound((Uint32)0, NdbIndexScanOperation::BoundEQ, 0); break; case 2: { // 1 row default: assert(g_table->getNoOfPrimaryKeys() == 1); // only impl. so far int tot = g_paramters[P_ROWS].value; int row = rand() % tot; #if 0 fix_eq_bound(pIOp, row); #else pIOp->setBound((Uint32)0, NdbIndexScanOperation::BoundEQ, &row); #endif if(g_paramters[P_RESET].value == 2) goto execute; break; } case 3: { // read multi int multi = g_paramters[P_MULTI].value; int tot = g_paramters[P_ROWS].value; for(; multi > 0 && i < iter; --multi, i++) { int row = rand() % tot; pIOp->setBound((Uint32)0, NdbIndexScanOperation::BoundEQ, &row); pIOp->end_of_bound(i); } if(g_paramters[P_RESET].value == 2) goto execute; break; } } } assert(pOp); switch(g_paramters[P_FILT].value){ case 0: // All check = pOp->interpret_exit_ok(); break; case 1: // None check = pOp->interpret_exit_nok(); break; case 2: { // 1 row default: assert(g_table->getNoOfPrimaryKeys() == 1); // only impl. so far abort(); #if 0 int tot = g_paramters[P_ROWS].value; int row = rand() % tot; NdbScanFilter filter(pOp) ; filter.begin(NdbScanFilter::AND); fix_eq(filter, pOp, row); filter.end(); break; #endif } } if(check != 0){ err(pOp->getNdbError()); return -1; } assert(check == 0); if(g_paramters[P_RESET].value == 1) g_paramters[P_RESET].value = 2; for(int i = 0; i<g_table->getNoOfColumns(); i++){ pOp->getValue(i); } if(g_paramters[P_RESET].value == 1) g_paramters[P_RESET].value = 2; execute: int rows = 0; check = pTrans->execute(NoCommit); assert(check == 0); int fetch = g_paramters[P_FETCH].value; while((check = pOp->nextResult(true)) == 0){ do { rows++; } while(!fetch && ((check = pOp->nextResult(false)) == 0)); if(check == -1){ err(pTrans->getNdbError()); return -1; } assert(check == 2); } if(check == -1){ err(pTrans->getNdbError()); return -1; } assert(check == 1); if(g_paramters[P_RESET].value == 0) { pTrans->close(); pTrans = 0; } stop = NdbTick_CurrentMillisecond(); int time_passed= (int)(stop - start1); sample_rows += rows; sum_time+= time_passed; tot_rows+= rows; if(sample_rows >= tot) { int sample_time = (int)(stop - sample_start); g_info << "Found " << sample_rows << " rows" << endl; g_err.println("Time: %d ms = %u rows/sec", sample_time, (1000*sample_rows)/sample_time); sample_rows = 0; sample_start = stop; } } g_err.println("Avg time: %d ms = %u rows/sec", sum_time/tot_rows, (1000*tot_rows)/sum_time); return 0; }
int calc_var_column(const NdbDictionary::Table * t, const NdbDictionary::Index * ix, int col, Ndb* ndb, bool longvarchar, bool ftScan, bool ignoreData) { char buff[8052]; memset(buff, 0, sizeof(buff)); int sz=0; NdbTransaction * trans = ndb->startTransaction(); if(trans==0) abort(); NdbScanOperation * sop; sop=trans->getNdbScanOperation(t); sop->readTuples(); NdbRecAttr * attr=sop->getValue(col, buff); int rows=0; int charset_size=1; bool no_data=false; //Set charset cost (for binary and latin1 cost is 1) const NdbDictionary::Column * c = t->getColumn(col); const NdbDictionary::Column::Type type = c->getType(); if ((type == NdbDictionary::Column::Varchar) || (type == NdbDictionary::Column::Longvarchar)) { CHARSET_INFO * cs2; cs2= (CHARSET_INFO*)(c->getCharset()); if(cs2!=0) { if(strncmp(cs2->name, "utf8",4)==0) { charset_size=3; printf( "---\tWARNING! cs2->name charset used, each character cost : %d bytes\n",charset_size); } if(strncmp(cs2->name, "ucs2",4)==0) { charset_size=2; printf( "---\tWARNING! cs2->name charset used, each character cost : %d bytes\n",charset_size); } } } //Set var header size int headerSize=longvarchar ? 2 : 1; if(trans->execute(NdbTransaction::NoCommit, NdbOperation::AbortOnError, 1) == -1) { no_data=true; trans->close(); } if(!no_data) { int check=0; while( ((check = sop->nextResult(true)) == 0) && !ignoreData) { rows++; if (verbose) { printf("attribut %d size = %d \n",rows,attr->isNULL()==1 ? 0 : attr->get_size_in_bytes()); } if(attr->isNULL()==1) { sz+=0; //for the time being until we know for sure.. } else { //attr->get_size_in_bytes return lengh of attr including header attr cost = (length-header*charset) sz+=((attr->get_size_in_bytes() - headerSize)* charset_size); } if(rows==1024 && !ftScan) break; } trans->close(); } if(rows==0) { sz = (int)(((float)(t->getColumn(col)->getSizeInBytes()))* (float)((float)loadfactor/100)); printf("---\tWARNING! No reference data found for VAR*. Defaulting to max size (loadfactor=100 percent)..%d bytes \n",sz); printf("\tConsider loading database with average data for exact measurement\n"); return sz+waste_sz(sz); } int tmpsz=(sz/rows)+headerSize; sz=tmpsz + waste_sz(tmpsz); if(ix) printf("---\t\tVAR* attribute is %d bytes averaged over %d rows\n", sz, rows); else printf("---\tVAR* attribute is %d bytes averaged over %d rows\n", sz, rows); return sz; }
int scanReadRecords(Ndb* pNdb, const NdbDictionary::Table* pTab, const NdbDictionary::Index* pIdx, int parallel, int _lock, bool headers, bool useHexFormat, char delimiter, bool order, bool descending) { int retryAttempt = 0; const int retryMax = 100; int check; NdbTransaction *pTrans; NdbScanOperation *pOp; NdbIndexScanOperation * pIOp= 0; NDBT_ResultRow * row = new NDBT_ResultRow(*pTab, delimiter); while (true) { if (retryAttempt >= retryMax) { ndbout << "ERROR: has retried this operation " << retryAttempt << " times, failing!" << endl; return -1; } pTrans = pNdb->startTransaction(); if (pTrans == NULL) { const NdbError err = pNdb->getNdbError(); if (err.status == NdbError::TemporaryError) { NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); return -1; } pOp = (!pIdx) ? pTrans->getNdbScanOperation(pTab->getName()) : pIOp=pTrans->getNdbIndexScanOperation(pIdx->getName(), pTab->getName()); if (pOp == NULL) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return -1; } int rs; unsigned scan_flags = 0; if (_tup) scan_flags |= NdbScanOperation::SF_TupScan; switch(_lock + (3 * order)) { case 1: rs = pOp->readTuples(NdbScanOperation::LM_Read, scan_flags, parallel); break; case 2: rs = pOp->readTuples(NdbScanOperation::LM_Exclusive, scan_flags, parallel); break; case 3: rs = pIOp->readTuples(NdbScanOperation::LM_CommittedRead, 0, parallel, true, descending); break; case 4: rs = pIOp->readTuples(NdbScanOperation::LM_Read, 0, parallel, true, descending); break; case 5: rs = pIOp->readTuples(NdbScanOperation::LM_Exclusive, 0, parallel, true, descending); break; case 0: default: rs = pOp->readTuples(NdbScanOperation::LM_CommittedRead, scan_flags, parallel); break; } if( rs != 0 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return -1; } if(0) { NdbScanFilter sf(pOp); #if 0 sf.begin(NdbScanFilter::AND); sf.le(0, (Uint32)10); sf.end(); #elif 0 sf.begin(NdbScanFilter::OR); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)10); sf.lt(0, (Uint32)20); sf.end(); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)30); sf.lt(0, (Uint32)40); sf.end(); sf.end(); #elif 1 sf.begin(NdbScanFilter::AND); sf.begin(NdbScanFilter::OR); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)10); sf.lt(0, (Uint32)20); sf.end(); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)30); sf.lt(0, (Uint32)40); sf.end(); sf.end(); sf.begin(NdbScanFilter::OR); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)0); sf.lt(0, (Uint32)50); sf.end(); sf.begin(NdbScanFilter::AND); sf.ge(0, (Uint32)100); sf.lt(0, (Uint32)200); sf.end(); sf.end(); sf.end(); #endif } else { check = pOp->interpret_exit_ok(); if( check == -1 ) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return -1; } } bool disk= false; for(int a = 0; a<pTab->getNoOfColumns(); a++) { const NdbDictionary::Column* col = pTab->getColumn(a); if(col->getStorageType() == NdbDictionary::Column::StorageTypeDisk) disk= true; if (!nodata) if((row->attributeStore(a) = pOp->getValue(col)) == 0) { ERR(pTrans->getNdbError()); pNdb->closeTransaction(pTrans); return -1; } } NdbRecAttr * disk_ref= 0; if(_dumpDisk && disk) disk_ref = pOp->getValue(NdbDictionary::Column::DISK_REF); NdbRecAttr * rowid= 0, *frag = 0, *gci = 0; if (use_rowid) { frag = pOp->getValue(NdbDictionary::Column::FRAGMENT); rowid = pOp->getValue(NdbDictionary::Column::ROWID); } if (use_gci) { gci = pOp->getValue(NdbDictionary::Column::ROW_GCI); } check = pTrans->execute(NdbTransaction::NoCommit); if( check == -1 ) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError) { pNdb->closeTransaction(pTrans); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); pNdb->closeTransaction(pTrans); return -1; } if (rowid) ndbout << "ROWID\t"; if (gci) ndbout << "\tGCI"; if (headers && !nodata) row->header(ndbout); if (disk_ref) ndbout << "\tDISK_REF"; ndbout << endl; int eof; int rows = 0; eof = pOp->nextResult(); while(eof == 0) { rows++; if (useHexFormat) ndbout.setHexFormat(1); if (rowid) { ndbout << "[ fragment: " << frag->u_32_value() << " m_page: " << rowid->u_32_value() << " m_page_idx: " << *(Uint32*)(rowid->aRef() + 4) << " ]"; ndbout << "\t"; } if (gci) { if (gci->isNULL()) ndbout << "NULL\t"; else ndbout << gci->u_64_value() << "\t"; } if (!nodata) ndbout << (*row); if(disk_ref) { ndbout << "\t"; ndbout << "[ m_file_no: " << *(Uint16*)(disk_ref->aRef()+6) << " m_page: " << disk_ref->u_32_value() << " m_page_idx: " << *(Uint16*)(disk_ref->aRef() + 4) << " ]"; } if (rowid || disk_ref || gci || !nodata) ndbout << endl; eof = pOp->nextResult(); } if (eof == -1) { const NdbError err = pTrans->getNdbError(); if (err.status == NdbError::TemporaryError) { pNdb->closeTransaction(pTrans); NdbSleep_MilliSleep(50); retryAttempt++; continue; } ERR(err); pNdb->closeTransaction(pTrans); return -1; } pNdb->closeTransaction(pTrans); ndbout << rows << " rows returned" << endl; return 0; } return -1; }