testScan.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:42k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <NDBT.hpp>
  14. #include <NDBT_Test.hpp>
  15. #include <HugoTransactions.hpp>
  16. #include <UtilTransactions.hpp>
  17. #include <NdbRestarter.hpp>
  18. #include <Vector.hpp>
  19. #include "ScanFunctions.hpp"
  20. #include <random.h>
  21. const NdbDictionary::Table *
  22. getTable(Ndb* pNdb, int i){
  23.   const NdbDictionary::Table* t = NDBT_Tables::getTable(i);
  24.   if (t == NULL){
  25.     return 0;
  26.   }
  27.   return pNdb->getDictionary()->getTable(t->getName());
  28. }
  29. int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
  30.   
  31.   int records = ctx->getProperty("Rows", ctx->getNumRecords());
  32.   HugoTransactions hugoTrans(*ctx->getTab());
  33.   if (hugoTrans.loadTable(GETNDB(step), records) != 0){
  34.     return NDBT_FAILED;
  35.   }
  36.   return NDBT_OK;
  37. }
  38. int runCreateAllTables(NDBT_Context* ctx, NDBT_Step* step){
  39.   int a = NDBT_Tables::createAllTables(GETNDB(step), false, true); 
  40.   return a;
  41. }
  42. int runDropAllTablesExceptTestTable(NDBT_Context* ctx, NDBT_Step* step){
  43.   for (int i=0; i < NDBT_Tables::getNumTables(); i++){
  44.     const NdbDictionary::Table* tab = NDBT_Tables::getTable(i);
  45.     if (tab == NULL){
  46.       return NDBT_ProgramExit(NDBT_FAILED);
  47.     }
  48.     // Don't drop test table
  49.     if (strcmp(tab->getName(), ctx->getTab()->getName()) == 0){
  50.       continue;
  51.     }
  52.     
  53.     int res = GETNDB(step)->getDictionary()->dropTable(tab->getName());
  54.     if(res == -1){
  55.       return NDBT_FAILED;
  56.     }
  57.   }
  58.   return NDBT_OK;
  59. }
  60. int runLoadAllTables(NDBT_Context* ctx, NDBT_Step* step){
  61.   
  62.   int records = ctx->getNumRecords();
  63.   for (int i=0; i < NDBT_Tables::getNumTables(); i++){
  64.     const NdbDictionary::Table* tab = getTable(GETNDB(step), i);
  65.     if (tab == NULL){ 
  66.       return NDBT_FAILED;
  67.     }
  68.     HugoTransactions hugoTrans(*tab);
  69.     if (hugoTrans.loadTable(GETNDB(step), records) != 0){
  70.       return NDBT_FAILED;
  71.     }    
  72.   }
  73.   return NDBT_OK;
  74. }
  75. char orderedPkIdxName[255];
  76. int createOrderedPkIndex(NDBT_Context* ctx, NDBT_Step* step){
  77.   const NdbDictionary::Table* pTab = ctx->getTab();
  78.   Ndb* pNdb = GETNDB(step);
  79.   
  80.   // Create index    
  81.   BaseString::snprintf(orderedPkIdxName, sizeof(orderedPkIdxName), 
  82.        "IDC_O_PK_%s", pTab->getName());
  83.   NdbDictionary::Index pIdx(orderedPkIdxName);
  84.   pIdx.setTable(pTab->getName());
  85.   pIdx.setType(NdbDictionary::Index::OrderedIndex);
  86.   pIdx.setLogging(false);
  87.   for (int c = 0; c< pTab->getNoOfColumns(); c++){
  88.     const NdbDictionary::Column * col = pTab->getColumn(c);
  89.     if(col->getPrimaryKey()){
  90.       pIdx.addIndexColumn(col->getName());
  91.     }
  92.   }
  93.   
  94.   if (pNdb->getDictionary()->createIndex(pIdx) != 0){
  95.     ndbout << "FAILED! to create index" << endl;
  96.     const NdbError err = pNdb->getDictionary()->getNdbError();
  97.     ERR(err);
  98.     return NDBT_FAILED;
  99.   }
  100.   
  101.   return NDBT_OK;
  102. }
  103. int createOrderedPkIndex_Drop(NDBT_Context* ctx, NDBT_Step* step){
  104.   const NdbDictionary::Table* pTab = ctx->getTab();
  105.   Ndb* pNdb = GETNDB(step);
  106.   
  107.   // Drop index
  108.   if (pNdb->getDictionary()->dropIndex(orderedPkIdxName, 
  109.        pTab->getName()) != 0){
  110.     ndbout << "FAILED! to drop index" << endl;
  111.     ERR(pNdb->getDictionary()->getNdbError());
  112.     return NDBT_FAILED;
  113.   }
  114.   
  115.   return NDBT_OK;
  116. }
  117. int runScanReadRandomTable(NDBT_Context* ctx, NDBT_Step* step){
  118.   int loops = ctx->getNumLoops();
  119.   int records = ctx->getNumRecords();
  120.   int parallelism = ctx->getProperty("Parallelism", 240);
  121.   int abort = ctx->getProperty("AbortProb", 5);
  122.   
  123.   int i = 0;
  124.   while (i<loops) {
  125.     
  126.     int tabNum = myRandom48(NDBT_Tables::getNumTables());
  127.     const NdbDictionary::Table* tab = getTable(GETNDB(step), tabNum);
  128.     if (tab == NULL){
  129.       g_info << "tab == NULL" << endl;
  130.       return NDBT_FAILED;
  131.     }
  132.     
  133.     g_info << "Scan reading from table " << tab->getName() << endl;
  134.     HugoTransactions hugoTrans(*tab);
  135.     
  136.     g_info << i << ": ";
  137.     if (hugoTrans.scanReadRecords(GETNDB(step), records, abort, parallelism) != 0){
  138.       return NDBT_FAILED;
  139.     }
  140.     i++;
  141.   }
  142.   return NDBT_OK;
  143. }
  144. int runInsertUntilStopped(NDBT_Context* ctx, NDBT_Step* step){
  145.   int records = ctx->getNumRecords();
  146.   int i = 0;
  147.   HugoTransactions hugoTrans(*ctx->getTab());
  148.   while (ctx->isTestStopped() == false) {
  149.     g_info << i << ": ";    
  150.     if (hugoTrans.loadTable(GETNDB(step), records, 1) != 0){
  151.       return NDBT_FAILED;
  152.     }
  153.     i++;
  154.   }
  155.   return NDBT_OK;
  156. }
  157. int runInsertDelete(NDBT_Context* ctx, NDBT_Step* step){
  158.   int result = NDBT_OK;
  159.   int records = ctx->getNumRecords();
  160.   int loops = ctx->getNumLoops();
  161.   int i = 0;
  162.   HugoTransactions hugoTrans(*ctx->getTab());
  163.   UtilTransactions utilTrans(*ctx->getTab());
  164.   while (i<loops) {
  165.     g_info << i << ": ";    
  166.     if (hugoTrans.loadTable(GETNDB(step), records, 1) != 0){
  167.       result = NDBT_FAILED;
  168.       break;
  169.     }
  170.     if (utilTrans.clearTable(GETNDB(step),  records) != 0){
  171.       result = NDBT_FAILED;
  172.       break;
  173.     }
  174.     i++;
  175.   }
  176.   ctx->stopTest();
  177.   return result;
  178. }
  179. int runClearTable(NDBT_Context* ctx, NDBT_Step* step){
  180.   int records = ctx->getNumRecords();
  181.   
  182.   UtilTransactions utilTrans(*ctx->getTab());
  183.   if (utilTrans.clearTable2(GETNDB(step),  records) != 0){
  184.     return NDBT_FAILED;
  185.   }
  186.   return NDBT_OK;
  187. }
  188. int runScanDelete(NDBT_Context* ctx, NDBT_Step* step){
  189.   int loops = ctx->getNumLoops();
  190.   int records = ctx->getNumRecords();
  191.   int i = 0;
  192.   UtilTransactions utilTrans(*ctx->getTab());
  193.   HugoTransactions hugoTrans(*ctx->getTab());
  194.   while (i<loops) {
  195.     g_info << i << ": ";
  196.     if (utilTrans.clearTable(GETNDB(step), records) != 0){
  197.       return NDBT_FAILED;
  198.     }
  199.     // Load table, don't allow any primary key violations
  200.     if (hugoTrans.loadTable(GETNDB(step), records, 512, false) != 0){
  201.       return NDBT_FAILED;
  202.     }
  203.     i++;
  204.   }  
  205.   return NDBT_OK;
  206. }
  207. int runScanDelete2(NDBT_Context* ctx, NDBT_Step* step){
  208.   int loops = ctx->getNumLoops();
  209.   int records = ctx->getNumRecords();
  210.   
  211.   int i = 0;
  212.   UtilTransactions utilTrans(*ctx->getTab());
  213.   HugoTransactions hugoTrans(*ctx->getTab());
  214.   while (i<loops) {
  215.     g_info << i << ": ";
  216.     if (utilTrans.clearTable2(GETNDB(step),  records) != 0){
  217.       return NDBT_FAILED;
  218.     }
  219.     // Load table, don't allow any primary key violations
  220.     if (hugoTrans.loadTable(GETNDB(step), records, 512, false) != 0){
  221.       return NDBT_FAILED;
  222.     }
  223.     i++;
  224.   }
  225.   return NDBT_OK;
  226. }
  227. int runVerifyTable(NDBT_Context* ctx, NDBT_Step* step){
  228.   return NDBT_OK;
  229. }
  230. int runScanRead(NDBT_Context* ctx, NDBT_Step* step){
  231.   int loops = ctx->getNumLoops();
  232.   int records = ctx->getProperty("Rows", ctx->getNumRecords());
  233.   int parallelism = ctx->getProperty("Parallelism", 240);
  234.   int abort = ctx->getProperty("AbortProb", 5);
  235.   int i = 0;
  236.   HugoTransactions hugoTrans(*ctx->getTab());
  237.   while (i<loops && !ctx->isTestStopped()) {
  238.     g_info << i << ": ";
  239.     if (hugoTrans.scanReadRecords(GETNDB(step), records, abort, parallelism) != 0){
  240.       return NDBT_FAILED;
  241.     }
  242.     i++;
  243.   }
  244.   return NDBT_OK;
  245. }
  246. int runRandScanRead(NDBT_Context* ctx, NDBT_Step* step){
  247.   int loops = ctx->getNumLoops();
  248.   int records = ctx->getNumRecords();
  249.   int parallelism = ctx->getProperty("Parallelism", 240);
  250.   int abort = ctx->getProperty("AbortProb", 5);
  251.   int i = 0;
  252.   HugoTransactions hugoTrans(*ctx->getTab());
  253.   while (i<loops && !ctx->isTestStopped()) {
  254.     g_info << i << ": ";
  255.     NdbOperation::LockMode lm = (NdbOperation::LockMode)(rand() % 3);
  256.     if (hugoTrans.scanReadRecords(GETNDB(step),
  257.   records, abort, parallelism,
  258.   lm) != 0){
  259.       return NDBT_FAILED;
  260.     }
  261.     i++;
  262.   }
  263.   return NDBT_OK;
  264. }
  265. int runScanReadIndex(NDBT_Context* ctx, NDBT_Step* step){
  266.   int loops = ctx->getNumLoops();
  267.   int records = ctx->getNumRecords();
  268.   int parallelism = ctx->getProperty("Parallelism", 240);
  269.   int abort = ctx->getProperty("AbortProb", 5);
  270.   const NdbDictionary::Index * pIdx = 
  271.     GETNDB(step)->getDictionary()->getIndex(orderedPkIdxName, 
  272.     ctx->getTab()->getName());
  273.   int i = 0;
  274.   HugoTransactions hugoTrans(*ctx->getTab());
  275.   while (pIdx && i<loops && !ctx->isTestStopped()) {
  276.     g_info << i << ": ";
  277.     bool sort = (rand() % 100) > 50 ? true : false;
  278.     NdbOperation::LockMode lm = (NdbOperation::LockMode)(rand() % 3);
  279.     if (hugoTrans.scanReadRecords(GETNDB(step), pIdx,
  280.   records, abort, parallelism,
  281.   lm,
  282.   sort) != 0){
  283.       return NDBT_FAILED;
  284.     }
  285.     i++;
  286.   }
  287.   return NDBT_OK;
  288. }
  289. int runScanReadCommitted(NDBT_Context* ctx, NDBT_Step* step){
  290.   int loops = ctx->getNumLoops();
  291.   int records = ctx->getNumRecords();
  292.   int parallelism = ctx->getProperty("Parallelism", 240);
  293.   int abort = ctx->getProperty("AbortProb", 5);
  294.   int i = 0;
  295.   HugoTransactions hugoTrans(*ctx->getTab());
  296.   while (i<loops && !ctx->isTestStopped()) {
  297.     g_info << i << ": ";
  298.     if (hugoTrans.scanReadRecords(GETNDB(step), records, 
  299.   abort, parallelism, 
  300.   NdbOperation::LM_CommittedRead) != 0){
  301.       return NDBT_FAILED;
  302.     }
  303.     i++;
  304.   }
  305.   return NDBT_OK;
  306. }
  307. int runScanReadError(NDBT_Context* ctx, NDBT_Step* step){
  308.   int result = NDBT_OK;
  309.   int loops = ctx->getNumLoops();
  310.   int records = ctx->getNumRecords();
  311.   int parallelism = 240; // Max parallelism
  312.   int error = ctx->getProperty("ErrorCode");
  313.   NdbRestarter restarter;
  314.   
  315.   int i = 0;
  316.   HugoTransactions hugoTrans(*ctx->getTab());
  317.   while (i<loops && !ctx->isTestStopped()) {
  318.     g_info << i << ": ";
  319.     
  320.     ndbout << "insertErrorInAllNodes("<<error<<")"<<endl;
  321.     if (restarter.insertErrorInAllNodes(error) != 0){
  322.       ndbout << "Could not insert error in all nodes "<<endl;
  323.       return NDBT_FAILED;
  324.     }
  325.     
  326.     if (hugoTrans.scanReadRecords(GETNDB(step), records, 0, parallelism) != 0){
  327.       result = NDBT_FAILED;
  328.     }
  329.     i++;
  330.   }
  331.   
  332.   restarter.insertErrorInAllNodes(0);
  333.   return result;
  334. }
  335. int
  336. runInsertError(NDBT_Context* ctx, NDBT_Step* step){
  337.   int error = ctx->getProperty("ErrorCode");
  338.   NdbRestarter restarter;
  339.   ctx->setProperty("ErrorCode", (Uint32)0);
  340.   if (restarter.insertErrorInAllNodes(error) != 0){
  341.     ndbout << "Could not insert error in all nodes "<<endl;
  342.     return NDBT_FAILED;
  343.   }
  344.   return NDBT_OK;
  345. }     
  346. int runScanReadErrorOneNode(NDBT_Context* ctx, NDBT_Step* step){
  347.   int result = NDBT_OK;
  348.   int loops = ctx->getNumLoops();
  349.   int records = ctx->getNumRecords();
  350.   int parallelism = 240; // Max parallelism
  351.   int error = ctx->getProperty("ErrorCode");
  352.   NdbRestarter restarter;
  353.   int lastId = 0;
  354.   if (restarter.getNumDbNodes() < 2){
  355.       ctx->stopTest();
  356.       return NDBT_OK;
  357.   }
  358.   int i = 0;
  359.   HugoTransactions hugoTrans(*ctx->getTab());
  360.   while (i<loops && result == NDBT_OK) {
  361.     g_info << i << ": ";
  362.         
  363.     int nodeId = restarter.getDbNodeId(lastId);
  364.     lastId = (lastId + 1) % restarter.getNumDbNodes();
  365.     ndbout << "insertErrorInNode("<<nodeId<<", "<<error<<")"<<endl;
  366.     if (restarter.insertErrorInNode(nodeId, error) != 0){
  367.       ndbout << "Could not insert error in node="<<nodeId<<endl;
  368.       return NDBT_FAILED;
  369.     }
  370.     
  371.     for (int j=0; j<10; j++){
  372.       if (hugoTrans.scanReadRecords(GETNDB(step), 
  373.     records, 0, parallelism) != 0)
  374. result = NDBT_FAILED;
  375.     }
  376.     if(restarter.waitClusterStarted(120) != 0){
  377.       g_err << "Cluster failed to restart" << endl;
  378.       result = NDBT_FAILED;
  379.     }
  380.     restarter.insertErrorInAllNodes(0);
  381.     
  382.     i++;
  383.   }
  384.   restarter.insertErrorInAllNodes(0);
  385.   return result;
  386. }
  387. int runRestartAll(NDBT_Context* ctx, NDBT_Step* step){
  388.   NdbRestarter restarter;
  389.   if (restarter.restartAll() != 0){
  390.     ndbout << "Could not restart all nodes"<<endl;
  391.     return NDBT_FAILED;
  392.   }
  393.   if (restarter.waitClusterStarted(120) != 0){
  394.     ndbout << "Could not restarted" << endl;
  395.     return NDBT_FAILED;
  396.   }
  397.       
  398.   return NDBT_OK;
  399. }
  400. static int RANDOM_PARALLELISM = 9999;
  401. int runScanReadUntilStopped(NDBT_Context* ctx, NDBT_Step* step){
  402.   int records = ctx->getNumRecords();
  403.   int i = 0;
  404.   int parallelism = ctx->getProperty("Parallelism", 240);
  405.   int para = parallelism;
  406.   HugoTransactions hugoTrans(*ctx->getTab());
  407.   while (ctx->isTestStopped() == false) {
  408.     if (parallelism == RANDOM_PARALLELISM)
  409.       para = myRandom48(239)+1;
  410.     g_info << i << ": ";
  411.     if (hugoTrans.scanReadRecords(GETNDB(step), records, 0, para) != 0){
  412.       return NDBT_FAILED;
  413.     }
  414.     i++;
  415.   }
  416.   return NDBT_OK;
  417. }
  418. int runScanReadUntilStoppedNoCount(NDBT_Context* ctx, NDBT_Step* step){
  419.   int i = 0;
  420.   HugoTransactions hugoTrans(*ctx->getTab());
  421.   while (ctx->isTestStopped() == false) {
  422.     g_info << i << ": ";
  423.     if (hugoTrans.scanReadRecords(GETNDB(step), 0) != 0){
  424.       return NDBT_FAILED;
  425.     }
  426.     i++;
  427.   }
  428.   return NDBT_OK;
  429. }
  430. int runScanReadUntilStoppedPrintTime(NDBT_Context* ctx, NDBT_Step* step){
  431.   int records = ctx->getNumRecords();
  432.   int i = 0;
  433.   int parallelism = ctx->getProperty("Parallelism", 240);
  434.   NdbTimer timer;
  435.   Ndb* ndb = GETNDB(step);
  436.   HugoTransactions hugoTrans(*ctx->getTab());
  437.   while (ctx->isTestStopped() == false) {
  438.     timer.doReset();
  439.     timer.doStart();
  440.     g_info << i << ": ";
  441.     if (ndb->waitUntilReady() != 0)
  442.       return NDBT_FAILED;      
  443.     if (hugoTrans.scanReadRecords(GETNDB(step), records, 0, parallelism) != 0)
  444.       return NDBT_FAILED;
  445.     timer.doStop();
  446.     if ((timer.elapsedTime()/1000) > 1)
  447.       timer.printTotalTime();
  448.     i++;
  449.   }
  450.   return NDBT_OK;
  451. }
  452. int runPkRead(NDBT_Context* ctx, NDBT_Step* step){
  453.   int loops = ctx->getNumLoops();
  454.   int records = ctx->getNumRecords();
  455.   int i = 0;
  456.   HugoTransactions hugoTrans(*ctx->getTab());
  457.   while (i<loops) {
  458.     g_info << i << ": ";
  459.     if (hugoTrans.pkReadRecords(GETNDB(step), records) != 0){
  460.       return NDBT_FAILED;
  461.     }
  462.     i++;
  463.   }
  464.   return NDBT_OK;
  465. }
  466. int runScanUpdate(NDBT_Context* ctx, NDBT_Step* step){
  467.   int loops = ctx->getNumLoops();
  468.   int records = ctx->getNumRecords();
  469.   int parallelism = ctx->getProperty("Parallelism", 1);
  470.   int abort = ctx->getProperty("AbortProb", 5);
  471.   int i = 0;
  472.   HugoTransactions hugoTrans(*ctx->getTab());
  473.   while (i<loops) {
  474.     g_info << i << ": ";
  475.     if (hugoTrans.scanUpdateRecords(GETNDB(step), records, abort, parallelism) != 0){
  476.       return NDBT_FAILED;
  477.     }
  478.     i++;
  479.   }
  480.   return NDBT_OK;
  481. }
  482. int runScanUpdateUntilStopped(NDBT_Context* ctx, NDBT_Step* step){
  483.   int records = ctx->getNumRecords();
  484.   int i = 0;
  485.   int parallelism = ctx->getProperty("Parallelism", 240);
  486.   int para = parallelism;
  487.   HugoTransactions hugoTrans(*ctx->getTab());
  488.   while (ctx->isTestStopped() == false) {
  489.     if (parallelism == RANDOM_PARALLELISM)
  490.       para = myRandom48(239)+1;
  491.     g_info << i << ": ";
  492.     if (hugoTrans.scanUpdateRecords(GETNDB(step), records, 0, para) == NDBT_FAILED){
  493.       return NDBT_FAILED;
  494.     }
  495.     i++;
  496.   }
  497.   return NDBT_OK;
  498. }
  499. int runScanUpdate2(NDBT_Context* ctx, NDBT_Step* step){
  500.   int loops = ctx->getNumLoops();
  501.   int records = ctx->getNumRecords();
  502.   int parallelism = ctx->getProperty("Parallelism", 240);
  503.   int abort = ctx->getProperty("AbortProb", 5);
  504.   int i = 0;
  505.   HugoTransactions hugoTrans(*ctx->getTab());
  506.   while (i<loops) {
  507.     g_info << i << ": ";
  508.     if (hugoTrans.scanUpdateRecords2(GETNDB(step), records, abort, parallelism) != 0){
  509.       return NDBT_FAILED;
  510.     }
  511.     i++;
  512.   }
  513.   return NDBT_OK;
  514. }
  515. int runLocker(NDBT_Context* ctx, NDBT_Step* step){
  516.   int result = NDBT_OK;
  517.   int records = ctx->getNumRecords();
  518.   HugoTransactions hugoTrans(*ctx->getTab());
  519.   
  520.   if (hugoTrans.lockRecords(GETNDB(step), records, 5, 500) != 0){
  521.     result = NDBT_FAILED;
  522.   }
  523.   ctx->stopTest();
  524.   
  525.   return result;
  526. }
  527. int runRestarter(NDBT_Context* ctx, NDBT_Step* step){
  528.   int result = NDBT_OK;
  529.   int loops = ctx->getNumLoops();
  530.   NdbRestarter restarter;
  531.   int i = 0;
  532.   int lastId = 0;
  533.   int timeout = 240;
  534.   if (restarter.getNumDbNodes() < 2){
  535.       ctx->stopTest();
  536.       return NDBT_OK;
  537.   }
  538.   while(i<loops && result != NDBT_FAILED){
  539.     if(restarter.waitClusterStarted(timeout) != 0){
  540.       g_err << "Cluster failed to start 1" << endl;
  541.       result = NDBT_FAILED;
  542.       break;
  543.     }
  544.     NdbSleep_SecSleep(10);
  545.     
  546.     int nodeId = restarter.getDbNodeId(lastId);
  547.     lastId = (lastId + 1) % restarter.getNumDbNodes();
  548.     if(restarter.restartOneDbNode(nodeId) != 0){
  549.       g_err << "Failed to restartNextDbNode" << endl;
  550.       result = NDBT_FAILED;
  551.       break;
  552.     }    
  553.     i++;
  554.   }
  555.   if(restarter.waitClusterStarted(timeout) != 0){
  556.     g_err << "Cluster failed to start 2" << endl;
  557.     result = NDBT_FAILED;
  558.   }
  559.   ctx->stopTest();
  560.   
  561.   return result;
  562. }
  563. int runStopAndStartNode(NDBT_Context* ctx, NDBT_Step* step){
  564.   int result = NDBT_OK;
  565.   int loops = ctx->getNumLoops();
  566.   NdbRestarter restarter;
  567.   int i = 0;
  568.   int lastId = 0;
  569.   int timeout = 240;
  570.   if (restarter.getNumDbNodes() < 2){
  571.       ctx->stopTest();
  572.       return NDBT_OK;
  573.   }
  574.   while(i<loops && result != NDBT_FAILED){
  575.     if(restarter.waitClusterStarted(timeout) != 0){
  576.       g_err << "Cluster failed to start 1" << endl;
  577.       result = NDBT_FAILED;
  578.       break;
  579.     }
  580.     NdbSleep_SecSleep(1);
  581.     int nodeId = restarter.getDbNodeId(lastId);
  582.     lastId = (lastId + 1) % restarter.getNumDbNodes();
  583.     g_err << "Stopping node " << nodeId << endl;
  584.     if(restarter.restartOneDbNode(nodeId, false, true) != 0){
  585.       g_err << "Failed to restartOneDbNode" << endl;
  586.       result = NDBT_FAILED;
  587.       break;
  588.     }
  589.  
  590.     if(restarter.waitNodesNoStart(&nodeId, 1, timeout) != 0){
  591.       g_err << "Node failed to reach NoStart" << endl;
  592.       result = NDBT_FAILED;
  593.       break;
  594.     }   
  595.     g_info << "Sleeping for 10 secs" << endl;
  596.     NdbSleep_SecSleep(10);
  597.     
  598.     g_err << "Starting node " << nodeId << endl;
  599.     if(restarter.startNodes(&nodeId, 1) != 0){
  600.       g_err << "Failed to start the node" << endl;
  601.       result = NDBT_FAILED;
  602.       break;
  603.     }    
  604.     i++;
  605.   }
  606.   if(restarter.waitClusterStarted(timeout) != 0){
  607.     g_err << "Cluster failed to start 2" << endl;
  608.     result = NDBT_FAILED;
  609.   }
  610.   ctx->stopTest();
  611.   
  612.   return result;
  613. }
  614. int runRestarter9999(NDBT_Context* ctx, NDBT_Step* step){
  615.   int result = NDBT_OK;
  616.   int loops = ctx->getNumLoops();
  617.   NdbRestarter restarter;
  618.   int i = 0;
  619.   int lastId = 0;
  620.   if (restarter.getNumDbNodes() < 2){
  621.       ctx->stopTest();
  622.       return NDBT_OK;
  623.   }
  624.   while(i<loops && result != NDBT_FAILED){
  625.     if(restarter.waitClusterStarted(120) != 0){
  626.       g_err << "Cluster failed to start" << endl;
  627.       result = NDBT_FAILED;
  628.       break;
  629.     }
  630.     NdbSleep_SecSleep(10);
  631.     
  632.     int nodeId = restarter.getDbNodeId(lastId);
  633.     lastId = (lastId + 1) % restarter.getNumDbNodes();
  634.     if(restarter.insertErrorInNode(nodeId, 9999) != 0){
  635.       g_err << "Failed to insertErrorInNode="<<nodeId << endl;
  636.       result = NDBT_FAILED;
  637.       break;
  638.     }    
  639.     NdbSleep_SecSleep(10);
  640.     i++;
  641.   }
  642.   if(restarter.waitClusterStarted(120) != 0){
  643.     g_err << "Cluster failed to start" << endl;
  644.     result = NDBT_FAILED;
  645.   }
  646.   ctx->stopTest();
  647.   
  648.   return result;
  649. }
  650. int runCheckGetValue(NDBT_Context* ctx, NDBT_Step* step){
  651.   const NdbDictionary::Table*  pTab = ctx->getTab();
  652.   int parallelism = ctx->getProperty("Parallelism", 1);
  653.   int records = ctx->getNumRecords();
  654.   int numFailed = 0;
  655.   AttribList alist; 
  656.   alist.buildAttribList(pTab);
  657.   UtilTransactions utilTrans(*pTab);  
  658.   for(size_t i = 0; i < alist.attriblist.size(); i++){
  659.     g_info << (unsigned)i << endl;
  660.     if(utilTrans.scanReadRecords(GETNDB(step), 
  661.  parallelism,
  662.  NdbOperation::LM_Read,
  663.  records,
  664.  alist.attriblist[i]->numAttribs,
  665.  alist.attriblist[i]->attribs) != 0){
  666.       numFailed++;
  667.     }
  668.     if(utilTrans.scanReadRecords(GETNDB(step), 
  669.  parallelism,
  670.  NdbOperation::LM_Read,
  671.  records,
  672.  alist.attriblist[i]->numAttribs,
  673.  alist.attriblist[i]->attribs) != 0){
  674.       numFailed++;
  675.     }
  676.   }
  677.   
  678.   if(numFailed > 0)
  679.     return NDBT_FAILED;
  680.   else
  681.     return NDBT_OK;
  682. }
  683. int runCloseWithoutStop(NDBT_Context* ctx, NDBT_Step* step){
  684.   const NdbDictionary::Table*  pTab = ctx->getTab();
  685.   int records = ctx->getNumRecords();
  686.   int numFailed = 0;
  687.   ScanFunctions scanF(*pTab);
  688.   // Iterate over all possible parallelism valuse
  689.   for (int p = 1; p<240; p++){
  690.     g_info << p << " CloseWithoutStop openScan" << endl;
  691.     if (scanF.scanReadFunctions(GETNDB(step), 
  692. records, 
  693. p,
  694. ScanFunctions::CloseWithoutStop,
  695. false) != 0){
  696.       numFailed++;
  697.     }
  698.     g_info << p << " CloseWithoutStop openScanExclusive" << endl;
  699.     if (scanF.scanReadFunctions(GETNDB(step), 
  700. records, 
  701. p,
  702. ScanFunctions::CloseWithoutStop,
  703. true) != 0){
  704.       numFailed++;
  705.     }
  706.   }
  707.     
  708.   if(numFailed > 0)
  709.     return NDBT_FAILED;
  710.   else
  711.     return NDBT_OK;
  712. }
  713. int runNextScanWhenNoMore(NDBT_Context* ctx, NDBT_Step* step){
  714.   const NdbDictionary::Table*  pTab = ctx->getTab();
  715.   int records = ctx->getNumRecords();
  716.   int numFailed = 0;
  717.   ScanFunctions scanF(*pTab);
  718.   if (scanF.scanReadFunctions(GETNDB(step), 
  719.       records, 
  720.       6,
  721.       ScanFunctions::NextScanWhenNoMore,
  722.       false) != 0){
  723.     numFailed++;
  724.   }
  725.   if (scanF.scanReadFunctions(GETNDB(step), 
  726.       records, 
  727.       6,
  728.       ScanFunctions::NextScanWhenNoMore,
  729.       true) != 0){
  730.     numFailed++;
  731.   }
  732.   
  733.   
  734.   if(numFailed > 0)
  735.     return NDBT_FAILED;
  736.   else
  737.     return NDBT_OK;
  738. }
  739. int runEqualAfterOpenScan(NDBT_Context* ctx, NDBT_Step* step){
  740.   const NdbDictionary::Table*  pTab = ctx->getTab();
  741.   int records = ctx->getNumRecords();
  742.   int numFailed = 0;
  743.   ScanFunctions scanF(*pTab);
  744.   if (scanF.scanReadFunctions(GETNDB(step), 
  745.       records, 
  746.       6,
  747.       ScanFunctions::EqualAfterOpenScan,
  748.       false) == NDBT_OK){
  749.     numFailed++;
  750.   }
  751.   if (scanF.scanReadFunctions(GETNDB(step), 
  752.       records, 
  753.       6,
  754.       ScanFunctions::EqualAfterOpenScan,
  755.       true) == NDBT_OK){
  756.     numFailed++;
  757.   }
  758.   
  759.   
  760.   if(numFailed > 0)
  761.     return NDBT_FAILED;
  762.   else
  763.     return NDBT_OK;
  764. }
  765. int runOnlyOpenScanOnce(NDBT_Context* ctx, NDBT_Step* step){
  766.   const NdbDictionary::Table*  pTab = ctx->getTab();
  767.   int records = ctx->getNumRecords();
  768.   int numFailed = 0;
  769.   ScanFunctions scanF(*pTab);
  770.   g_info << "OnlyOpenScanOnce openScanRead" << endl;
  771.   if (scanF.scanReadFunctions(GETNDB(step), 
  772.       records, 
  773.       6,
  774.       ScanFunctions::OnlyOpenScanOnce,
  775.       false) == 0){
  776.     numFailed++;
  777.   }
  778.   g_info << "OnlyOpenScanOnce openScanExclusive" << endl;
  779.   if (scanF.scanReadFunctions(GETNDB(step), 
  780.       records, 
  781.       6,
  782.       ScanFunctions::OnlyOpenScanOnce,
  783.       true) == 0){
  784.     numFailed++;
  785.   }
  786.   
  787.   
  788.   if(numFailed > 0)
  789.     return NDBT_FAILED;
  790.   else
  791.     return NDBT_OK;
  792. }
  793. int runOnlyOneOpInScanTrans(NDBT_Context* ctx, NDBT_Step* step){
  794.   return NDBT_OK;
  795. }
  796. int runExecuteScanWithoutOpenScan(NDBT_Context* ctx, NDBT_Step* step){
  797.   return NDBT_OK;
  798. }
  799. int runOnlyOneOpBeforeOpenScan(NDBT_Context* ctx, NDBT_Step* step){
  800.     return NDBT_OK;
  801. }
  802. int runOnlyOneScanPerTrans(NDBT_Context* ctx, NDBT_Step* step){
  803.   return NDBT_OK;
  804. }
  805. int runNoCloseTransaction(NDBT_Context* ctx, NDBT_Step* step){
  806.   const NdbDictionary::Table*  pTab = ctx->getTab();
  807.   int loops = ctx->getNumLoops();
  808.   int records = ctx->getNumRecords();
  809.   int numFailed = 0;
  810.   ScanFunctions scanF(*pTab);
  811.   int l = 0;
  812.   while(l < loops){
  813.     if (scanF.scanReadFunctions(GETNDB(step), 
  814. records, 
  815. 6,
  816. ScanFunctions::NoCloseTransaction,
  817. false) != 0){
  818.       numFailed++;
  819.     }
  820.     if (scanF.scanReadFunctions(GETNDB(step), 
  821. records, 
  822. 6,
  823. ScanFunctions::NoCloseTransaction,
  824. true) != 0){
  825.       numFailed++;
  826.     }
  827.     l++;
  828.   }
  829.   
  830.   
  831.   if(numFailed > 0)
  832.     return NDBT_FAILED;
  833.   else
  834.     return NDBT_OK;
  835. }
  836. int runCheckInactivityTimeOut(NDBT_Context* ctx, NDBT_Step* step){
  837.   const NdbDictionary::Table*  pTab = ctx->getTab();
  838.   int records = ctx->getNumRecords();
  839.   int numFailed = 0;
  840.   ScanFunctions scanF(*pTab);
  841.   if (scanF.scanReadFunctions(GETNDB(step), 
  842.       records, 
  843.       1,
  844.       ScanFunctions::CheckInactivityTimeOut,
  845.       false) != NDBT_OK){
  846.     numFailed++;
  847.   }
  848.   if (scanF.scanReadFunctions(GETNDB(step), 
  849.       records, 
  850.       240,
  851.       ScanFunctions::CheckInactivityTimeOut,
  852.       true) != NDBT_OK){
  853.     numFailed++;
  854.   }
  855.   
  856.   if(numFailed > 0)
  857.     return NDBT_FAILED;
  858.   else
  859.     return NDBT_OK;
  860. }
  861. int runCheckInactivityBeforeClose(NDBT_Context* ctx, NDBT_Step* step){
  862.   const NdbDictionary::Table*  pTab = ctx->getTab();
  863.   int records = ctx->getNumRecords();
  864.   int numFailed = 0;
  865.   ScanFunctions scanF(*pTab);
  866.   if (scanF.scanReadFunctions(GETNDB(step), 
  867.       records, 
  868.       16,
  869.       ScanFunctions::CheckInactivityBeforeClose,
  870.       false) != 0){
  871.     numFailed++;
  872.   }
  873.   if (scanF.scanReadFunctions(GETNDB(step), 
  874.       records, 
  875.       240,
  876.       ScanFunctions::CheckInactivityBeforeClose,
  877.       true) != 0){
  878.     numFailed++;
  879.   }
  880.   
  881.   if(numFailed > 0)
  882.     return NDBT_FAILED;
  883.   else
  884.     return NDBT_OK;
  885. }
  886. int runScanRestart(NDBT_Context* ctx, NDBT_Step* step){
  887.   int loops = ctx->getNumLoops();
  888.   int records = ctx->getNumRecords();
  889.   Ndb * pNdb = GETNDB(step);
  890.   const NdbDictionary::Table*  pTab = ctx->getTab();
  891.   HugoCalculator calc(* pTab);
  892.   NDBT_ResultRow tmpRow(* pTab);
  893.   int i = 0;
  894.   while (i<loops && !ctx->isTestStopped()) {
  895.     g_info << i++ << ": ";
  896.     const int record = (rand() % records);
  897.     g_info << " row=" << record;
  898.     NdbConnection* pCon = pNdb->startTransaction();
  899.     NdbScanOperation* pOp = pCon->getNdbScanOperation(pTab->getName());
  900.     if (pOp == NULL) {
  901.       ERR(pCon->getNdbError());
  902.       return NDBT_FAILED;
  903.     }
  904.     
  905.     NdbResultSet* rs = pOp->readTuples();
  906.     if( rs == 0 ) {
  907.       ERR(pCon->getNdbError());
  908.       return NDBT_FAILED;
  909.     }
  910.   
  911.     int check = pOp->interpret_exit_ok();
  912.     if( check == -1 ) {
  913.       ERR(pCon->getNdbError());
  914.       return NDBT_FAILED;
  915.     }
  916.     
  917.     // Define attributes to read  
  918.     for(int a = 0; a<pTab->getNoOfColumns(); a++){
  919.       if((tmpRow.attributeStore(a) = 
  920.   pOp->getValue(pTab->getColumn(a)->getName())) == 0) {
  921. ERR(pCon->getNdbError());
  922. return NDBT_FAILED;
  923.       }
  924.     } 
  925.     
  926.     check = pCon->execute(NoCommit);
  927.     if( check == -1 ) {
  928.       ERR(pCon->getNdbError());
  929.       return NDBT_FAILED;
  930.     }
  931.     int res;
  932.     int row = 0;
  933.     while(row < record && (res = rs->nextResult()) == 0) {
  934.       if(calc.verifyRowValues(&tmpRow) != 0){
  935. abort();
  936. return NDBT_FAILED;
  937.       }
  938.       row++;
  939.     }
  940.     if(row != record){
  941.       ERR(pCon->getNdbError());
  942.       abort();
  943.       return NDBT_FAILED;
  944.     }
  945.     g_info << " restarting" << endl;
  946.     if((res = rs->restart()) != 0){
  947.       ERR(pCon->getNdbError());
  948.       abort();
  949.       return NDBT_FAILED;
  950.     }      
  951.     row = 0;
  952.     while((res = rs->nextResult()) == 0) {
  953.       if(calc.verifyRowValues(&tmpRow) != 0){
  954. abort();
  955. return NDBT_FAILED;
  956.       }
  957.       row++;
  958.     }
  959.     if(res != 1 || row != records){
  960.       ERR(pCon->getNdbError());
  961.       abort();
  962.       return NDBT_FAILED;
  963.     }
  964.     pCon->close();
  965.   }
  966.   return NDBT_OK;
  967. }
  968. NDBT_TESTSUITE(testScan);
  969. TESTCASE("ScanRead", 
  970.  "Verify scan requirement: It should be possible "
  971.  "to read all records in a table without knowing their "
  972.  "primary key."){
  973.   INITIALIZER(runLoadTable);
  974.   TC_PROPERTY("Parallelism", 1);
  975.   STEP(runScanRead);
  976.   FINALIZER(runClearTable);
  977. }
  978. TESTCASE("ScanRead16", 
  979.  "Verify scan requirement: It should be possible to scan read "
  980.  "with parallelism, test with parallelism 16"){
  981.   INITIALIZER(runLoadTable);
  982.   TC_PROPERTY("Parallelism", 16);
  983.   STEP(runScanRead);
  984.   FINALIZER(runClearTable);
  985. }
  986. TESTCASE("ScanRead240", 
  987.  "Verify scan requirement: It should be possible to scan read with "
  988.  "parallelism, test with parallelism 240(240 would automatically be "
  989.  "downgraded to the maximum parallelism value for the current config)"){
  990.   INITIALIZER(runLoadTable);
  991.   TC_PROPERTY("Parallelism", 240);
  992.   STEP(runScanRead);
  993.   FINALIZER(runClearTable);
  994. }
  995. TESTCASE("ScanReadCommitted240", 
  996.  "Verify scan requirement: It should be possible to scan read committed with "
  997.  "parallelism, test with parallelism 240(240 would automatically be "
  998.  "downgraded to the maximum parallelism value for the current config)"){
  999.   INITIALIZER(runLoadTable);
  1000.   TC_PROPERTY("Parallelism", 240);
  1001.   STEP(runScanReadCommitted);
  1002.   FINALIZER(runClearTable);
  1003. }
  1004. TESTCASE("ScanUpdate", 
  1005.  "Verify scan requirement: It should be possible "
  1006.  "to update all records in a table without knowing their"
  1007.  " primary key."){
  1008.   INITIALIZER(runLoadTable);
  1009.   STEP(runScanUpdate);
  1010.   FINALIZER(runClearTable);
  1011. }
  1012. TESTCASE("ScanUpdate2", 
  1013.  "Verify scan requirement: It should be possible "
  1014.  "to update all records in a table without knowing their"
  1015.  " primary key. Do this efficently by calling nextScanResult(false) "
  1016.  "in order to update the records already fetched to the api in one batch."){
  1017.   INITIALIZER(runLoadTable);
  1018.   TC_PROPERTY("Parallelism", 240);
  1019.   STEP(runScanUpdate2);
  1020.   FINALIZER(runClearTable);
  1021. }
  1022. TESTCASE("ScanDelete", 
  1023.  "Verify scan requirement: It should be possible "
  1024.  "to delete all records in a table without knowing their"
  1025.  " primary key."){
  1026.   INITIALIZER(runLoadTable);
  1027.   STEP(runScanDelete);
  1028.   FINALIZER(runClearTable);
  1029. }
  1030. TESTCASE("ScanDelete2", 
  1031.  "Verify scan requirement: It should be possible "
  1032.  "to delete all records in a table without knowing their"
  1033.  " primary key. Do this efficently by calling nextScanResult(false) "
  1034.  "in order to delete the records already fetched to the api in one batch."){
  1035.   INITIALIZER(runLoadTable);
  1036.   TC_PROPERTY("Parallelism", 240);
  1037.   STEP(runScanDelete2);
  1038.   FINALIZER(runClearTable);
  1039. }
  1040. TESTCASE("ScanUpdateAndScanRead", 
  1041.  "Verify scan requirement: It should be possible to run "
  1042.  "scan read and scan update at the same time"){
  1043.   INITIALIZER(runLoadTable);
  1044.   TC_PROPERTY("Parallelism", 16);
  1045.   STEP(runScanRead);
  1046.   STEP(runScanUpdate);
  1047.   FINALIZER(runClearTable);
  1048. }
  1049. TESTCASE("ScanReadAndLocker", 
  1050.  "Verify scan requirement: The locks are not kept throughout "
  1051.  "the entire scan operation. This means that a scan does not "
  1052.  "lock the entire table, only the records it's currently "
  1053.  "operating on. This will test how scan performs when there are "
  1054.  " a number of 1 second locks in the table"){
  1055.   INITIALIZER(runLoadTable);
  1056.   STEP(runScanReadUntilStopped);
  1057.   STEP(runLocker);
  1058.   FINALIZER(runClearTable);
  1059. }
  1060. TESTCASE("ScanReadAndPkRead", 
  1061.  "Verify scan requirement: The locks are not kept throughout "
  1062.  "the entire scan operation. This means that a scan does not "
  1063.  "lock the entire table, only the records it's currently "
  1064.  "operating on. This will test how scan performs when there are "
  1065.  " a pk reads "){
  1066.   INITIALIZER(runLoadTable);
  1067.   STEPS(runScanRead, 2);
  1068.   STEPS(runPkRead, 2);
  1069.   FINALIZER(runClearTable);
  1070. }
  1071. TESTCASE("ScanRead488", 
  1072.  "Verify scan requirement: It's only possible to have 11 concurrent "
  1073.  "scans per fragment running in Ndb kernel at the same time. "
  1074.  "When this limit is exceeded the scan will be aborted with errorcode "
  1075.  "488."){
  1076.   INITIALIZER(runLoadTable);
  1077.   STEPS(runRandScanRead, 70);
  1078.   FINALIZER(runClearTable);
  1079. }
  1080. TESTCASE("ScanRead488O", 
  1081.  "Verify scan requirement: It's only possible to have 11 concurrent "
  1082.  "scans per fragment running in Ndb kernel at the same time. "
  1083.  "When this limit is exceeded the scan will be aborted with errorcode "
  1084.  "488."){
  1085.   INITIALIZER(createOrderedPkIndex);
  1086.   INITIALIZER(runLoadTable);
  1087.   STEPS(runScanReadIndex, 70);
  1088.   FINALIZER(createOrderedPkIndex_Drop);
  1089.   FINALIZER(runClearTable);
  1090. }
  1091. TESTCASE("ScanRead488_Mixed", 
  1092.  "Verify scan requirement: It's only possible to have 11 concurrent "
  1093.  "scans per fragment running in Ndb kernel at the same time. "
  1094.  "When this limit is exceeded the scan will be aborted with errorcode "
  1095.  "488."){
  1096.   INITIALIZER(createOrderedPkIndex);
  1097.   INITIALIZER(runLoadTable);
  1098.   STEPS(runRandScanRead, 50);
  1099.   STEPS(runScanReadIndex, 50);
  1100.   FINALIZER(createOrderedPkIndex_Drop);
  1101.   FINALIZER(runClearTable);
  1102. }
  1103. TESTCASE("ScanRead488Timeout", 
  1104.  ""){
  1105.   INITIALIZER(runLoadTable);
  1106.   TC_PROPERTY("ErrorCode", 5034);
  1107.   STEPS(runScanRead, 30);
  1108.   STEP(runScanReadError);
  1109.   FINALIZER(runClearTable);
  1110. }
  1111. TESTCASE("ScanRead40", 
  1112.  "Verify scan requirement: Scan with 40 simultaneous threads"){
  1113.   INITIALIZER(runLoadTable);
  1114.   STEPS(runScanRead, 40);
  1115.   FINALIZER(runClearTable);
  1116. }
  1117. TESTCASE("ScanRead100", 
  1118.  "Verify scan requirement: Scan with 100 simultaneous threads"){
  1119.   INITIALIZER(runLoadTable);
  1120.   STEPS(runScanRead, 100);
  1121.   FINALIZER(runClearTable);
  1122. }
  1123. TESTCASE("Scan-bug8262", 
  1124.  ""){
  1125.   TC_PROPERTY("Rows", 1);
  1126.   TC_PROPERTY("ErrorCode", 8035);
  1127.   INITIALIZER(runLoadTable);
  1128.   INITIALIZER(runInsertError); // Will reset error code
  1129.   STEPS(runScanRead, 25);
  1130.   FINALIZER(runInsertError);
  1131.   FINALIZER(runClearTable);
  1132. }
  1133. TESTCASE("ScanRead40RandomTable", 
  1134.  "Verify scan requirement: Scan with 40 simultaneous threads. "
  1135.  "Use random table for the scan"){
  1136.   INITIALIZER(runCreateAllTables);
  1137.   INITIALIZER(runLoadAllTables);
  1138.   STEPS(runScanReadRandomTable, 40);
  1139.   FINALIZER(runDropAllTablesExceptTestTable);
  1140. }
  1141. TESTCASE("ScanRead100RandomTable", 
  1142.  "Verify scan requirement: Scan with 100 simultaneous threads. "
  1143.  "Use random table for the scan"){
  1144.   INITIALIZER(runCreateAllTables);
  1145.   INITIALIZER(runLoadAllTables);
  1146.   STEPS(runScanReadRandomTable, 100);
  1147.   FINALIZER(runDropAllTablesExceptTestTable);
  1148. }
  1149. TESTCASE("ScanReadRandomPrepare",
  1150.  "Create and load tables for ScanRead40RandomNoTableCreate."){
  1151.   INITIALIZER(runCreateAllTables);
  1152.   INITIALIZER(runLoadAllTables);
  1153. }
  1154. TESTCASE("ScanRead40RandomNoTableCreate", 
  1155.  "Verify scan requirement: Scan with 40 simultaneous threads. "
  1156.  "Use random table for the scan. Dont create or load the tables."){
  1157.   STEPS(runScanReadRandomTable, 40);
  1158. }
  1159. TESTCASE("ScanRead100RandomNoTableCreate", 
  1160.  "Verify scan requirement: Scan with 100 simultaneous threads. "
  1161.  "Use random table for the scan. Dont create or load the tables."){
  1162.   STEPS(runScanReadRandomTable, 100);
  1163. }
  1164. TESTCASE("ScanWithLocksAndInserts", 
  1165.  "TR457: This test is added to verify that an insert of a records "
  1166.  "that is already in the database does not delete the record"){  
  1167.   INITIALIZER(runLoadTable);
  1168.   STEPS(runScanReadUntilStopped, 2);
  1169.   STEP(runLocker);
  1170.   STEP(runInsertUntilStopped);
  1171.   FINALIZER(runClearTable);
  1172. }
  1173. TESTCASE("ScanReadAbort", 
  1174.  "Scan requirement: A scan may be aborted by the application "
  1175.  "at any time. This can be performed even if there are more "
  1176.  "tuples to scan."){  
  1177.   INITIALIZER(runLoadTable);
  1178.   TC_PROPERTY("AbortProb", 90);
  1179.   STEPS(runScanRead, 3);
  1180.   FINALIZER(runClearTable);
  1181. }
  1182. TESTCASE("ScanReadAbort15", 
  1183.  "Scan requirement: A scan may be aborted by the application "
  1184.  "at any time. This can be performed even if there are more "
  1185.  "tuples to scan. Use parallelism 15"){  
  1186.   INITIALIZER(runLoadTable);
  1187.   TC_PROPERTY("Parallelism", 15);
  1188.   TC_PROPERTY("AbortProb", 90);
  1189.   STEPS(runScanRead, 3);
  1190.   FINALIZER(runClearTable);
  1191. }
  1192. TESTCASE("ScanReadAbort240", 
  1193.  "Scan requirement: A scan may be aborted by the application "
  1194.  "at any time. This can be performed even if there are more "
  1195.  "tuples to scan. Use parallelism 240(it will be downgraded to max para for this config)"){  
  1196.   INITIALIZER(runLoadTable);
  1197.   TC_PROPERTY("Parallelism", 240);
  1198.   TC_PROPERTY("AbortProb", 90);
  1199.   STEPS(runScanRead, 3);
  1200.   FINALIZER(runClearTable);
  1201. }
  1202. TESTCASE("ScanUpdateAbort16", 
  1203.  "Scan requirement: A scan may be aborted by the application "
  1204.  "at any time. This can be performed even if there are more "
  1205.  "tuples to scan. Use parallelism 16"){  
  1206.   INITIALIZER(runLoadTable);
  1207.   TC_PROPERTY("Parallelism", 16);
  1208.   TC_PROPERTY("AbortProb", 90);
  1209.   STEPS(runScanUpdate, 3);
  1210.   FINALIZER(runClearTable);
  1211. }
  1212. TESTCASE("ScanUpdateAbort240", 
  1213.  "Scan requirement: A scan may be aborted by the application "
  1214.  "at any time. This can be performed even if there are more "
  1215.  "tuples to scan. Use parallelism 240(it will be downgraded to max para for this config)"){  
  1216.   INITIALIZER(runLoadTable);
  1217.   TC_PROPERTY("Parallelism", 240);
  1218.   TC_PROPERTY("AbortProb", 90);
  1219.   STEPS(runScanUpdate, 3);
  1220.   FINALIZER(runClearTable);
  1221. }
  1222. TESTCASE("CheckGetValue", 
  1223.  "Check that we can call getValue to read attributes"
  1224.  "Especially interesting to see if we can read only the"
  1225.  " first, last or any two attributes from the table"){
  1226.   INITIALIZER(runLoadTable);
  1227.   STEP(runCheckGetValue);
  1228.   VERIFIER(runScanRead);
  1229.   FINALIZER(runClearTable);
  1230. }
  1231. TESTCASE("CloseWithoutStop", 
  1232.  "Check that we can close the scanning transaction without calling "
  1233.  "stopScan"){
  1234.   INITIALIZER(runLoadTable);
  1235.   STEP(runCloseWithoutStop);
  1236.   VERIFIER(runScanRead);
  1237.   FINALIZER(runClearTable);
  1238. }
  1239. TESTCASE("NextScanWhenNoMore", 
  1240.  "Check that we can call nextScanResult when there are no more "
  1241.  "records, and that it returns a valid value"){
  1242.   INITIALIZER(runLoadTable);
  1243.   STEP(runNextScanWhenNoMore);
  1244.   VERIFIER(runScanRead);
  1245.   FINALIZER(runClearTable);
  1246. }
  1247. TESTCASE("EqualAfterOpenScan", 
  1248.  "Check that we can't call equal after openScan"){
  1249.   STEP(runEqualAfterOpenScan);
  1250. }
  1251. TESTCASE("ExecuteScanWithoutOpenScan", 
  1252.  "Check that we can't call executeScan without defining a scan "
  1253.          "with openScan"){
  1254.   INITIALIZER(runLoadTable);
  1255.   STEP(runExecuteScanWithoutOpenScan);
  1256.   VERIFIER(runScanRead);
  1257.   FINALIZER(runClearTable);
  1258. }
  1259. TESTCASE("OnlyOpenScanOnce", 
  1260.  "Check that we may only call openScan once in the same trans"){
  1261.   INITIALIZER(runLoadTable);
  1262.   STEP(runOnlyOpenScanOnce);
  1263.   VERIFIER(runScanRead);
  1264.   FINALIZER(runClearTable);
  1265. }
  1266. TESTCASE("OnlyOneOpInScanTrans", 
  1267.  "Check that we can have only one operation in a scan trans"){
  1268.   INITIALIZER(runLoadTable);
  1269.   STEP(runOnlyOneOpInScanTrans);
  1270.   VERIFIER(runScanRead);
  1271.   FINALIZER(runClearTable);
  1272. }
  1273. TESTCASE("OnlyOneOpBeforeOpenScan", 
  1274.  "Check that we can have only one operation in a trans defined "
  1275.  "when calling openScan "){
  1276.   INITIALIZER(runLoadTable);
  1277.   STEP(runOnlyOneOpBeforeOpenScan);
  1278.   VERIFIER(runScanRead);
  1279.   FINALIZER(runClearTable);
  1280. }
  1281. TESTCASE("OnlyOneScanPerTrans", 
  1282.  "Check that we can have only one scan operation in a trans"){
  1283.   INITIALIZER(runLoadTable);
  1284.   STEP(runOnlyOneScanPerTrans);
  1285.   VERIFIER(runScanRead);
  1286.   FINALIZER(runClearTable);
  1287. }
  1288. TESTCASE("NoCloseTransaction", 
  1289.  "Check behaviour when close transaction is not called "){
  1290.   INITIALIZER(runLoadTable);
  1291.   STEP(runNoCloseTransaction);
  1292.   VERIFIER(runScanRead);
  1293.   FINALIZER(runClearTable);
  1294. }
  1295. TESTCASE("CheckInactivityTimeOut", 
  1296.  "Check behaviour when the api sleeps for a long time before continuing scan "){
  1297.   INITIALIZER(runLoadTable);
  1298.   STEP(runCheckInactivityTimeOut);
  1299.   VERIFIER(runScanRead);
  1300.   FINALIZER(runClearTable);
  1301. }
  1302. TESTCASE("CheckInactivityBeforeClose", 
  1303.  "Check behaviour when the api sleeps for a long time before calling close scan "){
  1304.   INITIALIZER(runLoadTable);
  1305.   STEP(runCheckInactivityBeforeClose);
  1306.   VERIFIER(runScanRead);
  1307.   FINALIZER(runClearTable);
  1308. }
  1309. TESTCASE("ScanReadError5021", 
  1310.  "Scan and insert error 5021, one node is expected to crash"){
  1311.   INITIALIZER(runLoadTable);
  1312.   TC_PROPERTY("ErrorCode", 5021);
  1313.   STEP(runScanReadErrorOneNode);
  1314.   FINALIZER(runClearTable);
  1315. }
  1316. TESTCASE("ScanReadError5022", 
  1317.  "Scan and insert error 5022, one node is expected to crash"){
  1318.   INITIALIZER(runLoadTable);
  1319.   TC_PROPERTY("ErrorCode", 5022);
  1320.   TC_PROPERTY("NodeNumber", 2);
  1321.   STEP(runScanReadErrorOneNode);
  1322.   FINALIZER(runClearTable);
  1323. }
  1324. TESTCASE("ScanReadError5023", 
  1325.  "Scan and insert error 5023"){
  1326.   INITIALIZER(runLoadTable);
  1327.   TC_PROPERTY("ErrorCode", 5023);
  1328.   STEP(runScanReadError);
  1329.   FINALIZER(runClearTable);
  1330. }
  1331. TESTCASE("ScanReadError5024", 
  1332.  "Scan and insert error 5024"){
  1333.   INITIALIZER(runLoadTable);
  1334.   TC_PROPERTY("ErrorCode", 5024);
  1335.   STEP(runScanReadError);
  1336.   FINALIZER(runClearTable);
  1337. }
  1338. TESTCASE("ScanReadError5025", 
  1339.  "Scan and insert error 5025"){
  1340.   INITIALIZER(runLoadTable);
  1341.   TC_PROPERTY("ErrorCode", 5025);
  1342.   STEP(runScanReadError);
  1343.   FINALIZER(runClearTable);
  1344. }
  1345. TESTCASE("ScanReadError5030", 
  1346.  "Scan and insert error 5030."
  1347.  "Drop all SCAN_NEXTREQ signals in LQH until the node is "
  1348.  "shutdown with SYSTEM_ERROR because of scan fragment timeout"){
  1349.   INITIALIZER(runLoadTable);
  1350.   TC_PROPERTY("ErrorCode", 5030);
  1351.   STEP(runScanReadErrorOneNode);
  1352.   FINALIZER(runClearTable);
  1353. }
  1354. TESTCASE("ScanReadRestart", 
  1355.  "Scan requirement:A scan should be able to start and "
  1356.  "complete during node recovery and when one or more nodes "
  1357.  "in the cluster is down.Use random parallelism "){
  1358.   INITIALIZER(runLoadTable);
  1359.   TC_PROPERTY("Parallelism", RANDOM_PARALLELISM); // Random
  1360.   STEP(runScanReadUntilStopped);
  1361.   STEP(runRestarter);
  1362.   FINALIZER(runClearTable);
  1363. }
  1364. TESTCASE("ScanUpdateRestart", 
  1365.  "Scan requirement:A scan should be able to start and "
  1366.  "complete during node recovery and when one or more nodes "
  1367.  "in the cluster is down. Use random parallelism"){
  1368.   INITIALIZER(runLoadTable);
  1369.   TC_PROPERTY("Parallelism", RANDOM_PARALLELISM); // Random
  1370.   STEP(runScanUpdateUntilStopped);
  1371.   STEP(runRestarter);
  1372.   FINALIZER(runClearTable);
  1373. }
  1374. #if 0
  1375. TESTCASE("ScanReadRestart9999", 
  1376.  "Scan requirement:A scan should be able to start and "
  1377.  "complete during node recovery and when one or more nodes "
  1378.  "in the cluster is down. Use parallelism 240."
  1379.  "Restart using error insert 9999"){
  1380.   INITIALIZER(runLoadTable);
  1381.   TC_PROPERTY("Parallelism", 240);
  1382.   STEP(runScanReadUntilStopped);
  1383.   STEP(runRestarter9999);
  1384.   FINALIZER(runClearTable);
  1385. }
  1386. TESTCASE("ScanUpdateRestart9999", 
  1387.  "Scan requirement:A scan should be able to start and "
  1388.  "complete during node recovery and when one or more nodes "
  1389.  "in the cluster is down. Use parallelism 240."
  1390.  "Restart using error insert 9999"){
  1391.   INITIALIZER(runLoadTable);
  1392.   TC_PROPERTY("Parallelism", 240);
  1393.   STEP(runScanReadUntilStopped);
  1394.   STEP(runScanUpdateUntilStopped);
  1395.   STEP(runRestarter9999);
  1396.   FINALIZER(runClearTable);
  1397. }
  1398. #endif
  1399. TESTCASE("InsertDelete", 
  1400.  "Load and delete all while scan updating and scan readingn"
  1401.  "Alexander Lukas special"){
  1402.   INITIALIZER(runClearTable);
  1403.   STEP(runScanReadUntilStoppedNoCount);
  1404.   STEP(runScanUpdateUntilStopped);
  1405.   STEP(runInsertDelete);
  1406.   FINALIZER(runClearTable);
  1407. }
  1408. TESTCASE("CheckAfterTerror", 
  1409.  "Check that we can still scan read after this terror of NdbApi"){
  1410.   INITIALIZER(runLoadTable);
  1411.   STEPS(runScanRead, 5);
  1412.   FINALIZER(runClearTable);
  1413. }
  1414. TESTCASE("ScanReadWhileNodeIsDown", 
  1415.  "Scan requirement:A scan should be able to run as fast when  "
  1416.  "one or more nodes in the cluster is down."){
  1417.   INITIALIZER(runLoadTable);
  1418.   STEP(runScanReadUntilStoppedPrintTime);
  1419.   STEP(runStopAndStartNode);
  1420.   FINALIZER(runClearTable);
  1421. }
  1422. TESTCASE("ScanRestart", 
  1423.  "Verify restart functionallity"){
  1424.   INITIALIZER(runLoadTable);
  1425.   STEP(runScanRestart);
  1426.   FINALIZER(runClearTable);
  1427. }
  1428. NDBT_TESTSUITE_END(testScan);
  1429. int main(int argc, const char** argv){
  1430.   ndb_init();
  1431.   myRandom48Init(NdbTick_CurrentMillisecond());
  1432.   return testScan.execute(argc, argv);
  1433. }
  1434. template class Vector<Attrib*>;