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

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 <NdbRestarts.hpp>
  19. #include <Vector.hpp>
  20. #include <signaldata/DumpStateOrd.hpp>
  21. #define CHECK(b) if (!(b)) { 
  22.   g_err << "ERR: "<< step->getName() 
  23.          << " failed on line " << __LINE__ << endl; 
  24.   result = NDBT_FAILED; break;
  25. struct Attrib {
  26.   bool indexCreated;
  27.   int numAttribs;
  28.   int attribs[1024];
  29.   Attrib(){
  30.     numAttribs = 0;
  31.     indexCreated = false;
  32.   }
  33. };
  34. class AttribList {
  35. public:
  36.   AttribList(){};
  37.   ~AttribList(){
  38.     for(size_t i = 0; i < attriblist.size(); i++){      
  39.       delete attriblist[i];
  40.     }
  41.   };
  42.   void buildAttribList(const NdbDictionary::Table* pTab); 
  43.   Vector<Attrib*> attriblist;
  44. };
  45. void AttribList::buildAttribList(const NdbDictionary::Table* pTab){
  46.   attriblist.clear();
  47.   Attrib* attr;
  48.   // Build attrib definitions that describes which attributes to build index
  49.   // Try to build strange combinations, not just "all" or all PK's
  50.   int i;
  51.   for(i = 1; i <= pTab->getNoOfColumns(); i++){
  52.     attr = new Attrib;
  53.     attr->numAttribs = i;
  54.     for(int a = 0; a<i; a++)
  55.       attr->attribs[a] = a;
  56.     attriblist.push_back(attr);
  57.   }
  58.   int b = 0;
  59.   for(i = pTab->getNoOfColumns()-1; i > 0; i--){
  60.     attr = new Attrib;
  61.     attr->numAttribs = i;
  62.     b++;
  63.     for(int a = 0; a<i; a++)
  64.       attr->attribs[a] = a+b;
  65.     attriblist.push_back(attr);
  66.   }
  67.   for(i = pTab->getNoOfColumns(); i > 0;  i--){
  68.     attr = new Attrib;
  69.     attr->numAttribs = pTab->getNoOfColumns() - i;
  70.     for(int a = 0; a<pTab->getNoOfColumns() - i; a++)
  71.       attr->attribs[a] = pTab->getNoOfColumns()-a-1;
  72.     attriblist.push_back(attr); 
  73.   }  
  74.   for(i = 1; i < pTab->getNoOfColumns(); i++){
  75.     attr = new Attrib;
  76.     attr->numAttribs = pTab->getNoOfColumns() - i;
  77.     for(int a = 0; a<pTab->getNoOfColumns() - i; a++)
  78.       attr->attribs[a] = pTab->getNoOfColumns()-a-1;
  79.     attriblist.push_back(attr); 
  80.   }  
  81.   for(i = 1; i < pTab->getNoOfColumns(); i++){
  82.     attr = new Attrib;
  83.     attr->numAttribs = 2;
  84.     for(int a = 0; a<2; a++){
  85.       attr->attribs[a] = i%pTab->getNoOfColumns();
  86.     }
  87.     attriblist.push_back(attr);
  88.   }
  89.   // Last 
  90.   attr = new Attrib;
  91.   attr->numAttribs = 1;
  92.   attr->attribs[0] = pTab->getNoOfColumns()-1;
  93.   attriblist.push_back(attr);
  94.   // Last and first
  95.   attr = new Attrib;
  96.   attr->numAttribs = 2;
  97.   attr->attribs[0] = pTab->getNoOfColumns()-1;
  98.   attr->attribs[1] = 0;
  99.   attriblist.push_back(attr); 
  100.   // First and last
  101.   attr = new Attrib;
  102.   attr->numAttribs = 2;
  103.   attr->attribs[0] = 0;
  104.   attr->attribs[1] = pTab->getNoOfColumns()-1;
  105.   attriblist.push_back(attr);  
  106. #if 0
  107.   for(size_t i = 0; i < attriblist.size(); i++){
  108.     ndbout << attriblist[i]->numAttribs << ": " ;
  109.     for(int a = 0; a < attriblist[i]->numAttribs; a++)
  110.       ndbout << attriblist[i]->attribs[a] << ", ";
  111.     ndbout << endl;
  112.   }
  113. #endif
  114. }
  115. char idxName[255];
  116. char pkIdxName[255];
  117. static const int SKIP_INDEX = 99;
  118. int create_index(NDBT_Context* ctx, int indxNum, 
  119.  const NdbDictionary::Table* pTab, 
  120.  Ndb* pNdb, Attrib* attr, bool logged){
  121.   bool orderedIndex = ctx->getProperty("OrderedIndex", (unsigned)0);
  122.   int result  = NDBT_OK;
  123.   HugoCalculator calc(*pTab);
  124.   if (attr->numAttribs == 1 && 
  125.       calc.isUpdateCol(attr->attribs[0]) == true){
  126.     // Don't create index for the Hugo update column
  127.     // since it's not unique
  128.     return SKIP_INDEX;
  129.   }
  130.   // Create index    
  131.   BaseString::snprintf(idxName, 255, "IDC%d", indxNum);
  132.   if (orderedIndex)
  133.     ndbout << "Creating " << ((logged)?"logged ": "temporary ") << "ordered index "<<idxName << " (";
  134.   else
  135.     ndbout << "Creating " << ((logged)?"logged ": "temporary ") << "unique index "<<idxName << " (";
  136.   ndbout << flush;
  137.   NdbDictionary::Index pIdx(idxName);
  138.   pIdx.setTable(pTab->getName());
  139.   if (orderedIndex)
  140.     pIdx.setType(NdbDictionary::Index::OrderedIndex);
  141.   else
  142.     pIdx.setType(NdbDictionary::Index::UniqueHashIndex);
  143.   for (int c = 0; c< attr->numAttribs; c++){
  144.     int attrNo = attr->attribs[c];
  145.     pIdx.addIndexColumn(pTab->getColumn(attrNo)->getName());
  146.     ndbout << pTab->getColumn(attrNo)->getName()<<" ";
  147.   }
  148.   
  149.   pIdx.setStoredIndex(logged);
  150.   ndbout << ") ";
  151.   if (pNdb->getDictionary()->createIndex(pIdx) != 0){
  152.     attr->indexCreated = false;
  153.     ndbout << "FAILED!" << endl;
  154.     const NdbError err = pNdb->getDictionary()->getNdbError();
  155.     ERR(err);
  156.     if(err.classification == NdbError::ApplicationError)
  157.       return SKIP_INDEX;
  158.     
  159.     return NDBT_FAILED;
  160.   } else {
  161.     ndbout << "OK!" << endl;
  162.     attr->indexCreated = true;
  163.   }
  164.   return result;
  165. }
  166. int drop_index(int indxNum, Ndb* pNdb, 
  167.        const NdbDictionary::Table* pTab, Attrib* attr){
  168.   int result = NDBT_OK;
  169.   if (attr->indexCreated == false)
  170.     return NDBT_OK;
  171.   BaseString::snprintf(idxName, 255, "IDC%d", indxNum);
  172.   
  173.   // Drop index
  174.   ndbout << "Dropping index "<<idxName<<"(" << pTab->getName() << ") ";
  175.   if (pNdb->getDictionary()->dropIndex(idxName, pTab->getName()) != 0){
  176.     ndbout << "FAILED!" << endl;
  177.     ERR(pNdb->getDictionary()->getNdbError());
  178.     result = NDBT_FAILED;
  179.   } else {
  180.     ndbout << "OK!" << endl;
  181.   }
  182.   return result;
  183. }
  184. int runCreateIndexes(NDBT_Context* ctx, NDBT_Step* step){
  185.   int loops = ctx->getNumLoops();
  186.   int l = 0;
  187.   const NdbDictionary::Table* pTab = ctx->getTab();
  188.   Ndb* pNdb = GETNDB(step);
  189.   int result = NDBT_OK;
  190.   // NOTE If we need to test creating both logged and non logged indexes
  191.   // this should be divided into two testcases
  192.   // The paramater logged should then be specified 
  193.   // as a TC_PROPERTY. ex TC_PROPERTY("LoggedIndexes", 1);
  194.   // and read into the test step like
  195.   bool logged = ctx->getProperty("LoggedIndexes", 1);
  196.   AttribList attrList;
  197.   attrList.buildAttribList(pTab);
  198.   while (l < loops && result == NDBT_OK){
  199.     unsigned int i;
  200.     for (i = 0; i < attrList.attriblist.size(); i++){
  201.       
  202.       // Try to create index
  203.       if (create_index(ctx, i, pTab, pNdb, attrList.attriblist[i], logged) == NDBT_FAILED)
  204. result = NDBT_FAILED;      
  205.     }
  206.     
  207.     // Now drop all indexes that where created
  208.     for (i = 0; i < attrList.attriblist.size(); i++){
  209.             
  210.       // Try to drop index
  211.       if (drop_index(i, pNdb, pTab, attrList.attriblist[i]) != NDBT_OK)
  212. result = NDBT_FAILED;            
  213.     }
  214.     
  215.     l++;
  216.   }
  217.   
  218.   return result;
  219. }
  220. int createRandomIndex(NDBT_Context* ctx, NDBT_Step* step){
  221.   const NdbDictionary::Table* pTab = ctx->getTab();
  222.   Ndb* pNdb = GETNDB(step);
  223.   bool logged = ctx->getProperty("LoggedIndexes", 1);
  224.   AttribList attrList;
  225.   attrList.buildAttribList(pTab);
  226.   int retries = 100;
  227.   while(retries > 0){
  228.     const Uint32 i = rand() % attrList.attriblist.size();
  229.     int res = create_index(ctx, i, pTab, pNdb, attrList.attriblist[i], 
  230.    logged);
  231.     if (res == SKIP_INDEX){
  232.       retries--;
  233.       continue;
  234.     }
  235.     if (res == NDBT_FAILED){
  236.       return NDBT_FAILED;
  237.     }
  238.     
  239.     ctx->setProperty("createRandomIndex", i);
  240.     // Now drop all indexes that where created
  241.     
  242.     return NDBT_OK;
  243.   }
  244.   
  245.   return NDBT_FAILED;
  246. }
  247. int createRandomIndex_Drop(NDBT_Context* ctx, NDBT_Step* step){
  248.   Ndb* pNdb = GETNDB(step);
  249.   Uint32 i = ctx->getProperty("createRandomIndex");
  250.   
  251.   BaseString::snprintf(idxName, 255, "IDC%d", i);
  252.   
  253.   // Drop index
  254.   ndbout << "Dropping index " << idxName << " ";
  255.   if (pNdb->getDictionary()->dropIndex(idxName, 
  256.        ctx->getTab()->getName()) != 0){
  257.     ndbout << "FAILED!" << endl;
  258.     ERR(pNdb->getDictionary()->getNdbError());
  259.     return NDBT_FAILED;
  260.   } else {
  261.     ndbout << "OK!" << endl;
  262.   }
  263.   
  264.   return NDBT_OK;
  265. }
  266. int createPkIndex(NDBT_Context* ctx, NDBT_Step* step){
  267.   bool orderedIndex = ctx->getProperty("OrderedIndex", (unsigned)0);
  268.   const NdbDictionary::Table* pTab = ctx->getTab();
  269.   Ndb* pNdb = GETNDB(step);
  270.   bool logged = ctx->getProperty("LoggedIndexes", 1);
  271.   // Create index    
  272.   BaseString::snprintf(pkIdxName, 255, "IDC_PK_%s", pTab->getName());
  273.   if (orderedIndex)
  274.     ndbout << "Creating " << ((logged)?"logged ": "temporary ") << "ordered index "
  275.    << pkIdxName << " (";
  276.   else
  277.     ndbout << "Creating " << ((logged)?"logged ": "temporary ") << "unique index "
  278.    << pkIdxName << " (";
  279.   NdbDictionary::Index pIdx(pkIdxName);
  280.   pIdx.setTable(pTab->getName());
  281.   if (orderedIndex)
  282.     pIdx.setType(NdbDictionary::Index::OrderedIndex);
  283.   else
  284.     pIdx.setType(NdbDictionary::Index::UniqueHashIndex);
  285.   for (int c = 0; c< pTab->getNoOfColumns(); c++){
  286.     const NdbDictionary::Column * col = pTab->getColumn(c);
  287.     if(col->getPrimaryKey()){
  288.       pIdx.addIndexColumn(col->getName());
  289.       ndbout << col->getName() <<" ";
  290.     }
  291.   }
  292.   
  293.   pIdx.setStoredIndex(logged);
  294.   ndbout << ") ";
  295.   if (pNdb->getDictionary()->createIndex(pIdx) != 0){
  296.     ndbout << "FAILED!" << endl;
  297.     const NdbError err = pNdb->getDictionary()->getNdbError();
  298.     ERR(err);
  299.     return NDBT_FAILED;
  300.   }
  301.   ndbout << "OK!" << endl;
  302.   return NDBT_OK;
  303. }
  304. int createPkIndex_Drop(NDBT_Context* ctx, NDBT_Step* step){
  305.   const NdbDictionary::Table* pTab = ctx->getTab();
  306.   Ndb* pNdb = GETNDB(step);
  307.   // Drop index
  308.   ndbout << "Dropping index " << pkIdxName << " ";
  309.   if (pNdb->getDictionary()->dropIndex(pkIdxName, 
  310.        pTab->getName()) != 0){
  311.     ndbout << "FAILED!" << endl;
  312.     ERR(pNdb->getDictionary()->getNdbError());
  313.     return NDBT_FAILED;
  314.   } else {
  315.     ndbout << "OK!" << endl;
  316.   }
  317.   
  318.   return NDBT_OK;
  319. }
  320. int
  321. runVerifyIndex(NDBT_Context* ctx, NDBT_Step* step){
  322.   // Verify that data in index match 
  323.   // table data
  324.   Ndb* pNdb = GETNDB(step);
  325.   UtilTransactions utilTrans(*ctx->getTab());
  326.   const int batchSize = ctx->getProperty("BatchSize", 16);
  327.   const int parallelism = batchSize > 240 ? 240 : batchSize;
  328.   do {
  329.     if (utilTrans.verifyIndex(pNdb, idxName, parallelism, true) != 0){
  330.       g_err << "Inconsistent index" << endl;
  331.       return NDBT_FAILED;
  332.     }
  333.   } while(ctx->isTestStopped() == false);
  334.   return NDBT_OK;
  335. }
  336. int
  337. runTransactions1(NDBT_Context* ctx, NDBT_Step* step){
  338.   // Verify that data in index match 
  339.   // table data
  340.   Ndb* pNdb = GETNDB(step);
  341.   HugoTransactions hugoTrans(*ctx->getTab());
  342.   const int batchSize = ctx->getProperty("BatchSize", 50);
  343.   int rows = ctx->getNumRecords();
  344.   while (ctx->isTestStopped() == false) {
  345.     if (hugoTrans.pkUpdateRecords(pNdb, rows, batchSize) != 0){
  346.       g_err << "Updated table failed" << endl;
  347.       return NDBT_FAILED;
  348.     }    
  349.     ctx->sync_down("PauseThreads");
  350.     if(ctx->isTestStopped())
  351.       break;
  352.     
  353.     if (hugoTrans.scanUpdateRecords(pNdb, rows, batchSize) != 0){
  354.       g_err << "Updated table failed" << endl;
  355.       return NDBT_FAILED;
  356.     }    
  357.     
  358.     ctx->sync_down("PauseThreads");
  359.   }
  360.   return NDBT_OK;
  361. }
  362. int
  363. runTransactions2(NDBT_Context* ctx, NDBT_Step* step){
  364.   // Verify that data in index match 
  365.   // table data
  366.   Ndb* pNdb = GETNDB(step);
  367.   HugoTransactions hugoTrans(*ctx->getTab());
  368.   const int batchSize = ctx->getProperty("BatchSize", 50);
  369.   int rows = ctx->getNumRecords();
  370.   while (ctx->isTestStopped() == false) {
  371. #if 1
  372.     if (hugoTrans.indexReadRecords(pNdb, pkIdxName, rows, batchSize) != 0){
  373.       g_err << "Index read failed" << endl;
  374.       return NDBT_FAILED;
  375.     }
  376. #endif
  377.     ctx->sync_down("PauseThreads");
  378.     if(ctx->isTestStopped())
  379.       break;
  380. #if 1
  381.     if (hugoTrans.indexUpdateRecords(pNdb, pkIdxName, rows, batchSize) != 0){
  382.       g_err << "Index update failed" << endl;
  383.       return NDBT_FAILED;
  384.     }
  385. #endif
  386.     ctx->sync_down("PauseThreads");
  387.   }
  388.   return NDBT_OK;
  389. }
  390. int
  391. runTransactions3(NDBT_Context* ctx, NDBT_Step* step){
  392.   // Verify that data in index match 
  393.   // table data
  394.   Ndb* pNdb = GETNDB(step);
  395.   HugoTransactions hugoTrans(*ctx->getTab());
  396.   UtilTransactions utilTrans(*ctx->getTab());
  397.   const int batchSize = ctx->getProperty("BatchSize", 32);
  398.   const int parallel = batchSize > 240 ? 240 : batchSize;
  399.   int rows = ctx->getNumRecords();
  400.   while (ctx->isTestStopped() == false) {
  401.     if(hugoTrans.loadTable(pNdb, rows, batchSize, false) != 0){
  402.       g_err << "Load table failed" << endl;
  403.       return NDBT_FAILED;
  404.     }
  405.     ctx->sync_down("PauseThreads");
  406.     if(ctx->isTestStopped())
  407.       break;
  408.     if (hugoTrans.pkUpdateRecords(pNdb, rows, batchSize) != 0){
  409.       g_err << "Updated table failed" << endl;
  410.       return NDBT_FAILED;
  411.     }    
  412.     ctx->sync_down("PauseThreads");
  413.     if(ctx->isTestStopped())
  414.       break;
  415.     
  416.     if (hugoTrans.indexReadRecords(pNdb, pkIdxName, rows, batchSize) != 0){
  417.       g_err << "Index read failed" << endl;
  418.       return NDBT_FAILED;
  419.     }
  420.     
  421.     ctx->sync_down("PauseThreads");
  422.     if(ctx->isTestStopped())
  423.       break;
  424.     
  425.     if (hugoTrans.indexUpdateRecords(pNdb, pkIdxName, rows, batchSize) != 0){
  426.       g_err << "Index update failed" << endl;
  427.       return NDBT_FAILED;
  428.     }
  429.     
  430.     ctx->sync_down("PauseThreads");
  431.     if(ctx->isTestStopped())
  432.       break;
  433.     if (hugoTrans.scanUpdateRecords(pNdb, rows, 5, parallel) != 0){
  434.       g_err << "Scan updated table failed" << endl;
  435.       return NDBT_FAILED;
  436.     }
  437.     ctx->sync_down("PauseThreads");
  438.     if(ctx->isTestStopped())
  439.       break;
  440.     if(utilTrans.clearTable(pNdb, rows, parallel) != 0){
  441.       g_err << "Clear table failed" << endl;
  442.       return NDBT_FAILED;
  443.     }
  444.     ctx->sync_down("PauseThreads");
  445.     if(ctx->isTestStopped())
  446.       break;
  447.     
  448.     int count = -1;
  449.     if(utilTrans.selectCount(pNdb, 64, &count) != 0 || count != 0)
  450.       return NDBT_FAILED;
  451.     ctx->sync_down("PauseThreads");
  452.   }
  453.   return NDBT_OK;
  454. }
  455. int runRestarts(NDBT_Context* ctx, NDBT_Step* step){
  456.   int result = NDBT_OK;
  457.   int loops = ctx->getNumLoops();
  458.   NDBT_TestCase* pCase = ctx->getCase();
  459.   NdbRestarts restarts;
  460.   int i = 0;
  461.   int timeout = 240;
  462.   int sync_threads = ctx->getProperty("Threads", (unsigned)0);
  463.   while(i<loops && result != NDBT_FAILED && !ctx->isTestStopped()){
  464.     if(restarts.executeRestart("RestartRandomNodeAbort", timeout) != 0){
  465.       g_err << "Failed to executeRestart(" <<pCase->getName() <<")" << endl;
  466.       result = NDBT_FAILED;
  467.       break;
  468.     }    
  469.     ctx->sync_up_and_wait("PauseThreads", sync_threads);
  470.     i++;
  471.   }
  472.   ctx->stopTest();
  473.   return result;
  474. }
  475. int runCreateLoadDropIndex(NDBT_Context* ctx, NDBT_Step* step){
  476.   int loops = ctx->getNumLoops();
  477.   int records = ctx->getNumRecords();
  478.   int l = 0;
  479.   const NdbDictionary::Table* pTab = ctx->getTab();
  480.   Ndb* pNdb = GETNDB(step);
  481.   int result = NDBT_OK;
  482.   int batchSize = ctx->getProperty("BatchSize", 1);
  483.   int parallelism = batchSize > 240? 240: batchSize;
  484.   ndbout << "batchSize="<<batchSize<<endl;
  485.   bool logged = ctx->getProperty("LoggedIndexes", 1);
  486.   HugoTransactions hugoTrans(*pTab);
  487.   UtilTransactions utilTrans(*pTab);
  488.   AttribList attrList;
  489.   attrList.buildAttribList(pTab);
  490.   for (unsigned int i = 0; i < attrList.attriblist.size(); i++){
  491.         
  492.     while (l < loops && result == NDBT_OK){
  493.       if ((l % 2) == 0){
  494. // Create index first and then load
  495. // Try to create index
  496. if (create_index(ctx, i, pTab, pNdb, attrList.attriblist[i], logged) == NDBT_FAILED){
  497.   result = NDBT_FAILED;      
  498. }
  499. // Load the table with data
  500. ndbout << "Loading data after" << endl;
  501. CHECK(hugoTrans.loadTable(pNdb, records, batchSize) == 0);
  502.       } else {
  503. // Load table then create index
  504. // Load the table with data
  505. ndbout << "Loading data before" << endl;
  506. CHECK(hugoTrans.loadTable(pNdb, records, batchSize) == 0);
  507. // Try to create index
  508. if (create_index(ctx, i, pTab, pNdb, attrList.attriblist[i], logged) == NDBT_FAILED)
  509.   result = NDBT_FAILED;      
  510.       }
  511.       
  512.       // Verify that data in index match 
  513.       // table data
  514.       CHECK(utilTrans.verifyIndex(pNdb, idxName, parallelism) == 0);
  515.       
  516.       // Do it all...
  517.       ndbout <<"Doing it all"<<endl;
  518.       int count;
  519.       ndbout << "  pkUpdateRecords" << endl;
  520.       CHECK(hugoTrans.pkUpdateRecords(pNdb, records, batchSize) == 0);
  521.       CHECK(utilTrans.verifyIndex(pNdb, idxName, parallelism) == 0);
  522.       CHECK(hugoTrans.pkUpdateRecords(pNdb, records, batchSize) == 0);
  523.       CHECK(utilTrans.verifyIndex(pNdb, idxName, parallelism) == 0);
  524.       ndbout << "  pkDelRecords half" << endl;
  525.       CHECK(hugoTrans.pkDelRecords(pNdb, records/2, batchSize) == 0);
  526.       CHECK(utilTrans.verifyIndex(pNdb, idxName, parallelism) == 0);
  527.       ndbout << "  scanUpdateRecords" << endl;
  528.       CHECK(hugoTrans.scanUpdateRecords(pNdb, records/2, parallelism) == 0);
  529.       CHECK(utilTrans.verifyIndex(pNdb, idxName, parallelism) == 0);
  530.       ndbout << "  clearTable" << endl;
  531.       CHECK(utilTrans.clearTable(pNdb, records/2, parallelism) == 0);
  532.       CHECK(utilTrans.verifyIndex(pNdb, idxName, parallelism) == 0);
  533.       CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  534.       CHECK(count == 0);
  535.       ndbout << "  loadTable" << endl;
  536.       CHECK(hugoTrans.loadTable(pNdb, records, batchSize) == 0);
  537.       CHECK(utilTrans.verifyIndex(pNdb, idxName, parallelism) == 0);
  538.       ndbout << "  loadTable again" << endl;
  539.       CHECK(hugoTrans.loadTable(pNdb, records, batchSize) == 0);
  540.       CHECK(utilTrans.verifyIndex(pNdb, idxName, parallelism) == 0);
  541.       CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  542.       CHECK(count == records);
  543.       if ((l % 2) == 0){
  544. // Drop index first and then clear
  545. // Try to create index
  546. if (drop_index(i, pNdb, pTab, attrList.attriblist[i]) != NDBT_OK){
  547.   result = NDBT_FAILED;      
  548. }
  549. // Clear table
  550. ndbout << "Clearing table after" << endl;
  551. CHECK(hugoTrans.clearTable(pNdb, records, parallelism) == 0);
  552.       } else {
  553. // Clear table then drop index
  554. //Clear table
  555. ndbout << "Clearing table before" << endl;
  556. CHECK(hugoTrans.clearTable(pNdb, records, parallelism) == 0);
  557. // Try to drop index
  558. if (drop_index(i, pNdb, pTab, attrList.attriblist[i]) != NDBT_OK)
  559.   result = NDBT_FAILED;      
  560.       }
  561.       
  562.       ndbout << "  Done!" << endl;
  563.       l++;
  564.     }
  565.       
  566.     // Make sure index is dropped
  567.     drop_index(i, pNdb, pTab, attrList.attriblist[i]);
  568.   }
  569.   return result;
  570. }
  571. int runInsertDelete(NDBT_Context* ctx, NDBT_Step* step){
  572.   int loops = ctx->getNumLoops();
  573.   int records = ctx->getNumRecords();
  574.   const NdbDictionary::Table* pTab = ctx->getTab();
  575.   Ndb* pNdb = GETNDB(step);
  576.   int result = NDBT_OK;
  577.   int batchSize = ctx->getProperty("BatchSize", 1);
  578.   int parallelism = batchSize > 240? 240: batchSize;
  579.   ndbout << "batchSize="<<batchSize<<endl;
  580.   bool logged = ctx->getProperty("LoggedIndexes", 1);
  581.   HugoTransactions hugoTrans(*pTab);
  582.   UtilTransactions utilTrans(*pTab);  
  583.   AttribList attrList;
  584.   attrList.buildAttribList(pTab);
  585.   for (unsigned int i = 0; i < attrList.attriblist.size(); i++){
  586.     
  587.     Attrib* attr = attrList.attriblist[i]; 
  588.     // Create index
  589.     if (create_index(ctx, i, pTab, pNdb, attr, logged) == NDBT_OK){
  590.       int l = 1;
  591.       while (l <= loops && result == NDBT_OK){
  592.   
  593. CHECK(hugoTrans.loadTable(pNdb, records, batchSize) == 0);
  594. CHECK(utilTrans.verifyIndex(pNdb, idxName, parallelism) == 0);
  595. CHECK(utilTrans.clearTable(pNdb, records, parallelism) == 0);
  596. CHECK(utilTrans.verifyIndex(pNdb, idxName, parallelism) == 0);
  597. l++;     
  598.       }            
  599.       
  600.       // Drop index
  601.       if (drop_index(i, pNdb, pTab, attr) != NDBT_OK)
  602. result = NDBT_FAILED;            
  603.     }    
  604.   }
  605.   
  606.   return result;
  607. }
  608. int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
  609.   int records = ctx->getNumRecords();
  610.   
  611.   HugoTransactions hugoTrans(*ctx->getTab());
  612.   int batchSize = ctx->getProperty("BatchSize", 1);
  613.   if(hugoTrans.loadTable(GETNDB(step), records, batchSize) != 0){
  614.     return NDBT_FAILED;
  615.   }
  616.   return NDBT_OK;
  617. }
  618. int runClearTable(NDBT_Context* ctx, NDBT_Step* step){
  619.   int records = ctx->getNumRecords();
  620.   
  621.   UtilTransactions utilTrans(*ctx->getTab());
  622.   if (utilTrans.clearTable(GETNDB(step),  records) != 0){
  623.     return NDBT_FAILED;
  624.   }
  625.   return NDBT_OK;
  626. }
  627. int runSystemRestart1(NDBT_Context* ctx, NDBT_Step* step){
  628.   Ndb* pNdb = GETNDB(step);
  629.   int result = NDBT_OK;
  630.   int timeout = 300;
  631.   Uint32 loops = ctx->getNumLoops();
  632.   int records = ctx->getNumRecords();
  633.   int count;
  634.   NdbRestarter restarter;
  635.   Uint32 i = 1;
  636.   UtilTransactions utilTrans(*ctx->getTab());
  637.   HugoTransactions hugoTrans(*ctx->getTab());
  638.   const char * name = ctx->getTab()->getName();
  639.   while(i<=loops && result != NDBT_FAILED){
  640.     ndbout << "Loop " << i << "/"<< loops <<" started" << endl;
  641.     /*
  642.       1. Load data
  643.       2. Restart cluster and verify records
  644.       3. Update records
  645.       4. Restart cluster and verify records
  646.       5. Delete half of the records
  647.       6. Restart cluster and verify records
  648.       7. Delete all records
  649.       8. Restart cluster and verify records
  650.       9. Insert, update, delete records
  651.       10. Restart cluster and verify records
  652.       11. Insert, update, delete records
  653.       12. Restart cluster with error insert 5020 and verify records
  654.     */
  655.     ndbout << "Loading records..." << endl;
  656.     CHECK(hugoTrans.loadTable(pNdb, records, 1) == 0);
  657.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  658.     
  659.     ndbout << "Restarting cluster" << endl;
  660.     CHECK(restarter.restartAll() == 0);
  661.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  662.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  663.     ndbout << "Verifying records..." << endl;
  664.     CHECK(hugoTrans.pkReadRecords(pNdb, records) == 0);
  665.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  666.     CHECK(count == records);
  667.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  668.     ndbout << "Updating records..." << endl;
  669.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  670.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  671.     ndbout << "Restarting cluster..." << endl;
  672.     CHECK(restarter.restartAll() == 0);
  673.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  674.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  675.     ndbout << "Verifying records..." << endl;
  676.     CHECK(hugoTrans.pkReadRecords(pNdb, records) == 0);
  677.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  678.     CHECK(count == records);
  679.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  680.     
  681.     ndbout << "Deleting 50% of records..." << endl;
  682.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  683.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  684.     ndbout << "Restarting cluster..." << endl;
  685.     CHECK(restarter.restartAll() == 0);
  686.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  687.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  688.     ndbout << "Verifying records..." << endl;
  689.     CHECK(hugoTrans.scanReadRecords(pNdb, records/2, 0, 64) == 0);
  690.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  691.     CHECK(count == (records/2));
  692.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  693.     ndbout << "Deleting all records..." << endl;
  694.     CHECK(utilTrans.clearTable(pNdb, records/2) == 0);
  695.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  696.     ndbout << "Restarting cluster..." << endl;
  697.     CHECK(restarter.restartAll() == 0);
  698.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  699.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  700.     ndbout << "Verifying records..." << endl;
  701.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  702.     CHECK(count == 0);
  703.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  704.     ndbout << "Doing it all..." << endl;
  705.     CHECK(hugoTrans.loadTable(pNdb, records, 1) == 0);
  706.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  707.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  708.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  709.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  710.     CHECK(hugoTrans.scanUpdateRecords(pNdb, records) == 0);
  711.     CHECK(utilTrans.verifyIndex(pNdb, idxName, 16, false) == 0);
  712.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  713.     CHECK(hugoTrans.loadTable(pNdb, records, 1) == 0);
  714.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  715.     CHECK(hugoTrans.loadTable(pNdb, records, 1) == 0);
  716.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  717.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  718.     ndbout << "Restarting cluster..." << endl;
  719.     CHECK(restarter.restartAll() == 0);
  720.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  721.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  722.     ndbout << "Verifying records..." << endl;
  723.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  724.     CHECK(count == 0);
  725.     ndbout << "Doing it all..." << endl;
  726.     CHECK(hugoTrans.loadTable(pNdb, records, 1) == 0);
  727.     CHECK(utilTrans.verifyIndex(pNdb, idxName,  16, false) == 0);
  728.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  729.     CHECK(utilTrans.verifyIndex(pNdb, idxName,  16, false) == 0);
  730.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  731.     CHECK(utilTrans.verifyIndex(pNdb, idxName,  16, false) == 0);
  732.     CHECK(hugoTrans.scanUpdateRecords(pNdb, records) == 0);
  733.     CHECK(utilTrans.verifyIndex(pNdb, idxName,  16, false) == 0);
  734.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  735.     CHECK(hugoTrans.loadTable(pNdb, records, 1) == 0);
  736.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  737.     ndbout << "Restarting cluster with error insert 5020..." << endl;
  738.     CHECK(restarter.restartAll(false, true) == 0);
  739.     CHECK(restarter.waitClusterNoStart(timeout) == 0);
  740.     CHECK(restarter.insertErrorInAllNodes(5020) == 0);
  741.     CHECK(restarter.startAll() == 0);
  742.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  743.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  744.     
  745.     i++;
  746.   }
  747.   ctx->stopTest();
  748.   ndbout << "runSystemRestart1 finished" << endl;  
  749.   return result;
  750. }
  751. #define CHECK2(b, t) if(!b){ g_err << __LINE__ << ": " << t << endl; break;}
  752. int
  753. runMixed1(NDBT_Context* ctx, NDBT_Step* step){
  754.   // Verify that data in index match 
  755.   // table data
  756.   Ndb* pNdb = GETNDB(step);
  757.   HugoOperations hugoOps(*ctx->getTab());
  758.   do {
  759.     // TC1
  760.     g_err << "pkRead, indexRead, Commit" << endl;
  761.     CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction");
  762.     CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0) == 0, "indexReadRecords");
  763.     CHECK2(hugoOps.pkReadRecord(pNdb, 0) == 0, "pkReadRecord");
  764.     CHECK2(hugoOps.execute_Commit(pNdb) == 0, "executeCommit");
  765.     CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction");
  766.     // TC1
  767.     g_err << "pkRead, indexRead, Commit" << endl;
  768.     CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction");
  769.     CHECK2(hugoOps.pkReadRecord(pNdb, 0) == 0, "pkReadRecord");
  770.     CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0) == 0, "indexReadRecords");
  771.     CHECK2(hugoOps.execute_Commit(pNdb) == 0, "executeCommit");
  772.     CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction");
  773.     
  774.     // TC2
  775.     g_err << "pkRead, indexRead, NoCommit, Commit" << endl;
  776.     CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction");
  777.     CHECK2(hugoOps.pkReadRecord(pNdb, 0) == 0, "pkReadRecord");
  778.     CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0) == 0,
  779.    "indexReadRecords");
  780.     CHECK2(hugoOps.execute_NoCommit(pNdb) == 0, "executeNoCommit");
  781.     CHECK2(hugoOps.execute_Commit(pNdb) == 0, "executeCommit");
  782.     CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction");
  783.     // TC3
  784.     g_err << "pkRead, pkRead, Commit" << endl;
  785.     CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction ");
  786.     CHECK2(hugoOps.pkReadRecord(pNdb, 0) == 0, "pkReadRecords ");
  787.     CHECK2(hugoOps.pkReadRecord(pNdb, 0) == 0, "pkReadRecords ");
  788.     CHECK2(hugoOps.execute_Commit(pNdb) == 0, "executeCommit");
  789.     CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction ");
  790.     // TC4
  791.     g_err << "indexRead, indexRead, Commit" << endl;
  792.     CHECK2(hugoOps.startTransaction(pNdb) == 0, "startTransaction ");
  793.     CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0) == 0, "indexReadRecords");
  794.     CHECK2(hugoOps.indexReadRecords(pNdb, pkIdxName, 0) == 0, "indexReadRecords");
  795.     CHECK2(hugoOps.execute_Commit(pNdb) == 0, "executeCommit");
  796.     CHECK2(hugoOps.closeTransaction(pNdb) == 0, "closeTransaction ");
  797.     return NDBT_OK;
  798.   } while(false);
  799.   hugoOps.closeTransaction(pNdb);
  800.   return NDBT_FAILED;
  801. }
  802. int
  803. runBuildDuring(NDBT_Context* ctx, NDBT_Step* step){
  804.   // Verify that data in index match 
  805.   // table data
  806.   const int Threads = ctx->getProperty("Threads", (Uint32)0);
  807.   const int loops = ctx->getNumLoops();
  808.   for(int i = 0; i<loops; i++){
  809. #if 1
  810.     if(createPkIndex(ctx, step) != NDBT_OK){
  811.       g_err << "Failed to create index" << endl;
  812.       return NDBT_FAILED;
  813.     }
  814. #endif
  815.     if(ctx->isTestStopped())
  816.       break;
  817. #if 1
  818.     if(createRandomIndex(ctx, step) != NDBT_OK){
  819.       g_err << "Failed to create index" << endl;
  820.       return NDBT_FAILED;
  821.     }
  822. #endif
  823.     if(ctx->isTestStopped())
  824.       break;
  825.     ctx->setProperty("pause", 1);
  826.     int count = 0;
  827.     for(int j = 0; count < Threads && !ctx->isTestStopped(); 
  828. j = (j+1) % Threads){
  829.       char buf[255];
  830.       sprintf(buf, "Thread%d_paused", j);
  831.       int tmp = ctx->getProperty(buf, (Uint32)0);
  832.       count += tmp;
  833.     }
  834.     
  835.     if(ctx->isTestStopped())
  836.       break;
  837. #if 1
  838.     if(createPkIndex_Drop(ctx, step) != NDBT_OK){
  839.       g_err << "Failed to drop index" << endl;
  840.       return NDBT_FAILED;
  841.     }
  842. #endif
  843.     if(ctx->isTestStopped())
  844.       break;
  845.     
  846. #if 1
  847.     if(createRandomIndex_Drop(ctx, step) != NDBT_OK){
  848.       g_err << "Failed to drop index" << endl;
  849.       return NDBT_FAILED;
  850.     }
  851. #endif
  852.     ctx->setProperty("pause", (Uint32)0);
  853.     NdbSleep_SecSleep(2);
  854.   }
  855.   ctx->stopTest();
  856.   return NDBT_OK;
  857. }
  858. static NdbLockable g_lock;
  859. static int threadCounter = 0;
  860. void
  861. wait_paused(NDBT_Context* ctx, int id){
  862.   if(ctx->getProperty("pause", (Uint32)0) == 1){
  863.     char buf[255];
  864.     sprintf(buf, "Thread%d_paused", id);
  865.     ctx->setProperty(buf, 1);
  866.     while(!ctx->isTestStopped() && ctx->getProperty("pause", (Uint32)0) == 1){
  867.       NdbSleep_MilliSleep(250);
  868.     }
  869.     ctx->setProperty(buf, (Uint32)0);
  870.   }
  871. }
  872. int
  873. runTransactions4(NDBT_Context* ctx, NDBT_Step* step){
  874.   g_lock.lock();
  875.   const int ThreadId = threadCounter++;
  876.   g_lock.unlock();
  877.   
  878.   // Verify that data in index match 
  879.   // table data
  880.   Ndb* pNdb = GETNDB(step);
  881.   HugoTransactions hugoTrans(*ctx->getTab());
  882.   UtilTransactions utilTrans(*ctx->getTab());
  883.   const int batchSize = ctx->getProperty("BatchSize", 32);
  884.   const int parallel = batchSize > 240 ? 240 : batchSize;
  885.   int rows = ctx->getNumRecords();
  886.   while (ctx->isTestStopped() == false) {
  887.     if(hugoTrans.loadTable(pNdb, rows, batchSize, false) != 0){
  888.       g_err << "Load table failed" << endl;
  889.       return NDBT_FAILED;
  890.     }
  891.     wait_paused(ctx, ThreadId);
  892.     if(ctx->isTestStopped())
  893.       break;
  894.     if (hugoTrans.pkUpdateRecords(pNdb, rows, batchSize) != 0){
  895.       g_err << "Updated table failed" << endl;
  896.       return NDBT_FAILED;
  897.     }    
  898.     wait_paused(ctx, ThreadId);
  899.     
  900.     if(ctx->isTestStopped())
  901.       break;
  902.     
  903.     if (hugoTrans.scanUpdateRecords(pNdb, rows, 5, parallel) != 0){
  904.       g_err << "Scan updated table failed" << endl;
  905.       return NDBT_FAILED;
  906.     }
  907.     wait_paused(ctx, ThreadId);
  908.     if(ctx->isTestStopped())
  909.       break;
  910.     if(utilTrans.clearTable(pNdb, rows, parallel) != 0){
  911.       g_err << "Clear table failed" << endl;
  912.       return NDBT_FAILED;
  913.     }
  914.   }
  915.   return NDBT_OK;
  916. }
  917. int
  918. runUniqueNullTransactions(NDBT_Context* ctx, NDBT_Step* step){
  919.   Ndb* pNdb = GETNDB(step);
  920.   bool logged = ctx->getProperty("LoggedIndexes", 1);
  921.   bool orderedIndex = ctx->getProperty("OrderedIndex", (unsigned)0);
  922.   NdbConnection * pTrans = 0;
  923.   const NdbDictionary::Table* pTab = ctx->getTab();
  924.   // Create index    
  925.   char nullIndex[255];
  926.   BaseString::snprintf(nullIndex, 255, "IDC_PK_%s_NULL", pTab->getName());
  927.   if (orderedIndex)
  928.     ndbout << "Creating " << ((logged)?"logged ": "temporary ") << "ordered index "
  929.    << pkIdxName << " (";
  930.   else
  931.     ndbout << "Creating " << ((logged)?"logged ": "temporary ") << "unique index "
  932.    << pkIdxName << " (";
  933.   NdbDictionary::Index pIdx(pkIdxName);
  934.   pIdx.setTable(pTab->getName());
  935.   if (orderedIndex)
  936.     pIdx.setType(NdbDictionary::Index::OrderedIndex);
  937.   else
  938.     pIdx.setType(NdbDictionary::Index::UniqueHashIndex);
  939.   pIdx.setStoredIndex(logged);
  940.   int c;
  941.   for (c = 0; c< pTab->getNoOfColumns(); c++){
  942.     const NdbDictionary::Column * col = pTab->getColumn(c);
  943.     if(col->getPrimaryKey()){
  944.       pIdx.addIndexColumn(col->getName());
  945.       ndbout << col->getName() <<" ";
  946.     }
  947.   }
  948.   
  949.   int colId = -1;
  950.   for (c = 0; c< pTab->getNoOfColumns(); c++){
  951.     const NdbDictionary::Column * col = pTab->getColumn(c);
  952.     if(col->getNullable()){
  953.       pIdx.addIndexColumn(col->getName());
  954.       ndbout << col->getName() <<" ";
  955.       colId = c;
  956.       break;
  957.     }
  958.   }
  959.   ndbout << ") ";
  960.   if(colId == -1){
  961.     ndbout << endl << "No nullable column found -> NDBT_FAILED" << endl; 
  962.     return NDBT_FAILED;
  963.   }
  964.   
  965.   if (pNdb->getDictionary()->createIndex(pIdx) != 0){
  966.     ndbout << "FAILED!" << endl;
  967.     const NdbError err = pNdb->getDictionary()->getNdbError();
  968.     ERR(err);
  969.     return NDBT_FAILED;
  970.   }
  971.   
  972.   int result = NDBT_OK;
  973.   HugoTransactions hugoTrans(*ctx->getTab());
  974.   const int batchSize = ctx->getProperty("BatchSize", 50);
  975.   int loops = ctx->getNumLoops();
  976.   int rows = ctx->getNumRecords();
  977.   while (loops-- > 0 && ctx->isTestStopped() == false) {
  978.     if (hugoTrans.pkUpdateRecords(pNdb, rows, batchSize) != 0){
  979.       g_err << "Updated table failed" << endl;
  980.       result = NDBT_FAILED;
  981.       goto done;
  982.     }    
  983.   }
  984.   if(ctx->isTestStopped()){
  985.     goto done;
  986.   }
  987.   ctx->stopTest();
  988.   while(ctx->getNoOfRunningSteps() > 1){
  989.     NdbSleep_MilliSleep(100);
  990.   }
  991.   result = NDBT_FAILED;
  992.   pTrans = pNdb->startTransaction();
  993.   NdbScanOperation * sOp;
  994.   NdbOperation * uOp;
  995.   NdbResultSet * rs;
  996.   int eof;
  997.   if(!pTrans) goto done;
  998.   sOp = pTrans->getNdbScanOperation(pTab->getName());
  999.   if(!sOp) goto done;
  1000.   rs = sOp->readTuples(NdbScanOperation::LM_Exclusive);
  1001.   if(!rs) goto done;
  1002.   if(pTrans->execute(NoCommit) == -1) goto done;
  1003.   while((eof = rs->nextResult(true)) == 0){
  1004.     do {
  1005.       NdbOperation * uOp = rs->updateTuple();
  1006.       if(uOp == 0) goto done;
  1007.       uOp->setValue(colId, 0);
  1008.     } while((eof = rs->nextResult(false)) == 0);
  1009.     eof = pTrans->execute(Commit);
  1010.     if(eof == -1) goto done;
  1011.   }
  1012.   
  1013.  done:
  1014.   if(pTrans) pNdb->closeTransaction(pTrans);
  1015.   pNdb->getDictionary()->dropIndex(nullIndex, pTab->getName());
  1016.   return result;
  1017. }
  1018. int runLQHKEYREF(NDBT_Context* ctx, NDBT_Step* step){
  1019.   int result = NDBT_OK;
  1020.   int loops = ctx->getNumLoops() * 100;
  1021.   NdbRestarter restarter;
  1022.   
  1023.   myRandom48Init(NdbTick_CurrentMillisecond());
  1024. #if 0
  1025.   int val = DumpStateOrd::DihMinTimeBetweenLCP;
  1026.   if(restarter.dumpStateAllNodes(&val, 1) != 0){
  1027.     g_err << "Failed to dump DihMinTimeBetweenLCP" << endl;
  1028.     return NDBT_FAILED;
  1029.   }
  1030. #endif
  1031.   for(int i = 0; i<loops && !ctx->isTestStopped(); i++){
  1032.     int randomId = myRandom48(restarter.getNumDbNodes());
  1033.     int nodeId = restarter.getDbNodeId(randomId);
  1034.     const Uint32 error = 5031 + (i % 3);
  1035.     
  1036.     if(restarter.insertErrorInNode(nodeId, error) != 0){
  1037.       g_err << "Failed to error insert( " << error << ") in node "
  1038.     << nodeId << endl;
  1039.       return NDBT_FAILED;
  1040.     }
  1041.   }
  1042.   
  1043.   ctx->stopTest();
  1044.   return NDBT_OK;
  1045. }
  1046. NDBT_TESTSUITE(testIndex);
  1047. TESTCASE("CreateAll", 
  1048.  "Test that we can create all various indexes on each tablen"
  1049.  "Then drop the indexesn"){
  1050.   INITIALIZER(runCreateIndexes);
  1051. }
  1052. TESTCASE("CreateAll_O",
  1053.  "Test that we can create all various indexes on each tablen"
  1054.  "Then drop the indexesn"){
  1055.   TC_PROPERTY("OrderedIndex", 1);
  1056.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1057.   INITIALIZER(runCreateIndexes);
  1058. }
  1059. TESTCASE("InsertDeleteGentle", 
  1060.  "Create one index, then perform insert and delete in the tablen"
  1061.  "loop number of times. Use batch size 1."){
  1062.   TC_PROPERTY("BatchSize", 1);
  1063.   INITIALIZER(runInsertDelete);
  1064.   FINALIZER(runClearTable);
  1065. }
  1066. TESTCASE("InsertDeleteGentle_O",
  1067.  "Create one index, then perform insert and delete in the tablen"
  1068.  "loop number of times. Use batch size 1."){
  1069.   TC_PROPERTY("OrderedIndex", 1);
  1070.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1071.   TC_PROPERTY("BatchSize", 1);
  1072.   INITIALIZER(runInsertDelete);
  1073.   FINALIZER(runClearTable);
  1074. }
  1075. TESTCASE("InsertDelete", 
  1076.  "Create one index, then perform insert and delete in the tablen"
  1077.  "loop number of times. Use batchsize 512 to stress db more"){
  1078.   TC_PROPERTY("BatchSize", 512);
  1079.   INITIALIZER(runInsertDelete);
  1080.   FINALIZER(runClearTable);
  1081. }
  1082. TESTCASE("InsertDelete_O", 
  1083.  "Create one index, then perform insert and delete in the tablen"
  1084.  "loop number of times. Use batchsize 512 to stress db more"){
  1085.   TC_PROPERTY("OrderedIndex", 1);
  1086.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1087.   TC_PROPERTY("BatchSize", 512);
  1088.   INITIALIZER(runInsertDelete);
  1089.   FINALIZER(runClearTable);
  1090. }
  1091. TESTCASE("CreateLoadDropGentle", 
  1092.  "Try to create, drop and load various indexes n"
  1093.  "on table loop number of times.Usa batch size 1.n"){
  1094.   TC_PROPERTY("BatchSize", 1);
  1095.   INITIALIZER(runCreateLoadDropIndex);
  1096. }
  1097. TESTCASE("CreateLoadDropGentle_O", 
  1098.  "Try to create, drop and load various indexes n"
  1099.  "on table loop number of times.Usa batch size 1.n"){
  1100.   TC_PROPERTY("OrderedIndex", 1);
  1101.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1102.   TC_PROPERTY("BatchSize", 1);
  1103.   INITIALIZER(runCreateLoadDropIndex);
  1104. }
  1105. TESTCASE("CreateLoadDrop", 
  1106.  "Try to create, drop and load various indexes n"
  1107.  "on table loop number of times. Use batchsize 512 to stress db moren"){
  1108.   TC_PROPERTY("BatchSize", 512);
  1109.   INITIALIZER(runCreateLoadDropIndex);
  1110. }
  1111. TESTCASE("CreateLoadDrop_O", 
  1112.  "Try to create, drop and load various indexes n"
  1113.  "on table loop number of times. Use batchsize 512 to stress db moren"){
  1114.   TC_PROPERTY("OrderedIndex", 1);
  1115.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1116.   TC_PROPERTY("BatchSize", 512);
  1117.   INITIALIZER(runCreateLoadDropIndex);
  1118. }
  1119. TESTCASE("NFNR1", 
  1120.  "Test that indexes are correctly maintained during node fail and node restart"){ 
  1121.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1122.   //TC_PROPERTY("Threads", 2);
  1123.   INITIALIZER(runClearTable);
  1124.   INITIALIZER(createRandomIndex);
  1125.   INITIALIZER(runLoadTable);
  1126.   STEP(runRestarts);
  1127.   STEP(runTransactions1);
  1128.   STEP(runTransactions1);
  1129.   FINALIZER(runVerifyIndex);
  1130.   FINALIZER(createRandomIndex_Drop);
  1131.   FINALIZER(runClearTable);
  1132. }
  1133. TESTCASE("NFNR1_O", 
  1134.  "Test that indexes are correctly maintained during node fail and node restart"){ 
  1135.   TC_PROPERTY("OrderedIndex", 1);
  1136.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1137.   INITIALIZER(runClearTable);
  1138.   INITIALIZER(createRandomIndex);
  1139.   INITIALIZER(runLoadTable);
  1140.   STEP(runRestarts);
  1141.   STEP(runTransactions1);
  1142.   STEP(runTransactions1);
  1143.   FINALIZER(runVerifyIndex);
  1144.   FINALIZER(createRandomIndex_Drop);
  1145.   FINALIZER(runClearTable);
  1146. }
  1147. TESTCASE("NFNR2", 
  1148.  "Test that indexes are correctly maintained during node fail and node restart"){ 
  1149.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1150.   INITIALIZER(runClearTable);
  1151.   INITIALIZER(createRandomIndex);
  1152.   INITIALIZER(createPkIndex);
  1153.   INITIALIZER(runLoadTable);
  1154.   STEP(runRestarts);
  1155.   STEP(runTransactions2);
  1156.   STEP(runTransactions2);
  1157.   FINALIZER(runVerifyIndex);
  1158.   FINALIZER(createRandomIndex_Drop);
  1159.   FINALIZER(createPkIndex_Drop);
  1160.   FINALIZER(runClearTable);
  1161. }
  1162. TESTCASE("NFNR2_O", 
  1163.  "Test that indexes are correctly maintained during node fail and node restart"){ 
  1164.   TC_PROPERTY("OrderedIndex", 1);
  1165.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1166.   INITIALIZER(runClearTable);
  1167.   INITIALIZER(createRandomIndex);
  1168.   INITIALIZER(createPkIndex);
  1169.   INITIALIZER(runLoadTable);
  1170.   STEP(runRestarts);
  1171.   STEP(runTransactions2);
  1172.   //STEP(runTransactions2);
  1173.   FINALIZER(runVerifyIndex);
  1174.   FINALIZER(createRandomIndex_Drop);
  1175.   FINALIZER(createPkIndex_Drop);
  1176.   FINALIZER(runClearTable);
  1177. }
  1178. TESTCASE("NFNR3", 
  1179.  "Test that indexes are correctly maintained during node fail and node restart"){ 
  1180.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1181.   INITIALIZER(runClearTable);
  1182.   INITIALIZER(createRandomIndex);
  1183.   INITIALIZER(createPkIndex);
  1184.   STEP(runRestarts);
  1185.   STEP(runTransactions3);
  1186.   STEP(runVerifyIndex);
  1187.   FINALIZER(runVerifyIndex);
  1188.   FINALIZER(createPkIndex_Drop);
  1189.   FINALIZER(createRandomIndex_Drop);
  1190.   FINALIZER(runClearTable);
  1191. }
  1192. TESTCASE("NFNR3_O", 
  1193.  "Test that indexes are correctly maintained during node fail and node restart"){ 
  1194.   TC_PROPERTY("OrderedIndex", 1);
  1195.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1196.   INITIALIZER(runClearTable);
  1197.   INITIALIZER(createRandomIndex);
  1198.   INITIALIZER(createPkIndex);
  1199.   STEP(runRestarts);
  1200.   STEP(runTransactions3);
  1201.   STEP(runVerifyIndex);
  1202.   FINALIZER(runVerifyIndex);
  1203.   FINALIZER(createPkIndex_Drop);
  1204.   FINALIZER(createRandomIndex_Drop);
  1205.   FINALIZER(runClearTable);
  1206. }
  1207. TESTCASE("NFNR4", 
  1208.  "Test that indexes are correctly maintained during node fail and node restart"){ 
  1209.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1210.   INITIALIZER(runClearTable);
  1211.   INITIALIZER(createRandomIndex);
  1212.   INITIALIZER(createPkIndex);
  1213.   INITIALIZER(runLoadTable);
  1214.   STEP(runRestarts);
  1215.   STEP(runTransactions1);
  1216.   STEP(runTransactions1);
  1217.   STEP(runTransactions2);
  1218.   STEP(runTransactions2);
  1219.   FINALIZER(runVerifyIndex);
  1220.   FINALIZER(createRandomIndex_Drop);
  1221.   FINALIZER(createPkIndex_Drop);
  1222.   FINALIZER(runClearTable);
  1223. }
  1224. TESTCASE("NFNR4_O", 
  1225.  "Test that indexes are correctly maintained during node fail and node restart"){ 
  1226.   TC_PROPERTY("OrderedIndex", 1);
  1227.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1228.   INITIALIZER(runClearTable);
  1229.   INITIALIZER(createRandomIndex);
  1230.   INITIALIZER(createPkIndex);
  1231.   INITIALIZER(runLoadTable);
  1232.   STEP(runRestarts);
  1233.   STEP(runTransactions1);
  1234.   STEP(runTransactions1);
  1235.   STEP(runTransactions2);
  1236.   STEP(runTransactions2);
  1237.   FINALIZER(runVerifyIndex);
  1238.   FINALIZER(createRandomIndex_Drop);
  1239.   FINALIZER(createPkIndex_Drop);
  1240.   FINALIZER(runClearTable);
  1241. }
  1242. TESTCASE("NFNR5", 
  1243.  "Test that indexes are correctly maintained during node fail and node restart"){ 
  1244.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1245.   TC_PROPERTY("BatchSize", (unsigned)1);
  1246.   INITIALIZER(runClearTable);
  1247.   INITIALIZER(createRandomIndex);
  1248.   INITIALIZER(createPkIndex);
  1249.   INITIALIZER(runLoadTable);
  1250.   STEP(runLQHKEYREF);
  1251.   STEP(runTransactions1);
  1252.   STEP(runTransactions1);
  1253.   STEP(runTransactions2);
  1254.   STEP(runTransactions2);
  1255.   FINALIZER(runVerifyIndex);
  1256.   FINALIZER(createRandomIndex_Drop);
  1257.   FINALIZER(createPkIndex_Drop);
  1258.   FINALIZER(runClearTable);
  1259. }
  1260. TESTCASE("NFNR5_O", 
  1261.  "Test that indexes are correctly maintained during node fail and node restart"){ 
  1262.   TC_PROPERTY("OrderedIndex", 1);
  1263.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1264.   TC_PROPERTY("BatchSize", (unsigned)1);
  1265.   INITIALIZER(runClearTable);
  1266.   INITIALIZER(createRandomIndex);
  1267.   INITIALIZER(createPkIndex);
  1268.   INITIALIZER(runLoadTable);
  1269.   STEP(runLQHKEYREF);
  1270.   STEP(runTransactions1);
  1271.   STEP(runTransactions1);
  1272.   STEP(runTransactions2);
  1273.   STEP(runTransactions2);
  1274.   FINALIZER(runVerifyIndex);
  1275.   FINALIZER(createRandomIndex_Drop);
  1276.   FINALIZER(createPkIndex_Drop);
  1277.   FINALIZER(runClearTable);
  1278. }
  1279. TESTCASE("SR1", 
  1280.  "Test that indexes are correctly maintained during SR"){ 
  1281.   INITIALIZER(runClearTable);
  1282.   INITIALIZER(createRandomIndex);
  1283.   INITIALIZER(createPkIndex);
  1284.   STEP(runSystemRestart1);
  1285.   FINALIZER(runVerifyIndex);
  1286.   FINALIZER(createPkIndex_Drop);
  1287.   FINALIZER(createRandomIndex_Drop);
  1288.   FINALIZER(runClearTable);
  1289. }
  1290. TESTCASE("MixedTransaction", 
  1291.  "Test mixing of index and normal operations"){ 
  1292.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1293.   INITIALIZER(runClearTable);
  1294.   INITIALIZER(createPkIndex);
  1295.   INITIALIZER(runLoadTable);
  1296.   STEP(runMixed1);
  1297.   FINALIZER(createPkIndex_Drop);
  1298.   FINALIZER(runClearTable);
  1299. }
  1300. TESTCASE("SR1_O", 
  1301.  "Test that indexes are correctly maintained during SR"){ 
  1302.   TC_PROPERTY("OrderedIndex", 1);
  1303.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1304.   INITIALIZER(runClearTable);
  1305.   INITIALIZER(createRandomIndex);
  1306.   INITIALIZER(createPkIndex);
  1307.   STEP(runSystemRestart1);
  1308.   FINALIZER(runVerifyIndex);
  1309.   FINALIZER(createPkIndex_Drop);
  1310.   FINALIZER(createRandomIndex_Drop);
  1311.   FINALIZER(runClearTable);
  1312. }
  1313. TESTCASE("BuildDuring", 
  1314.  "Test that index build when running transactions work"){ 
  1315.   TC_PROPERTY("OrderedIndex", (unsigned)0);
  1316.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1317.   TC_PROPERTY("Threads", 1); // # runTransactions4
  1318.   INITIALIZER(runClearTable);
  1319.   STEP(runBuildDuring);
  1320.   STEP(runTransactions4);
  1321.   //STEP(runTransactions4);
  1322.   FINALIZER(runClearTable);
  1323. }
  1324. TESTCASE("BuildDuring_O", 
  1325.  "Test that index build when running transactions work"){ 
  1326.   TC_PROPERTY("OrderedIndex", (unsigned)1);
  1327.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1328.   TC_PROPERTY("Threads", 1); // # runTransactions4
  1329.   INITIALIZER(runClearTable);
  1330.   STEP(runBuildDuring);
  1331.   STEP(runTransactions4);
  1332.   //STEP(runTransactions4);
  1333.   FINALIZER(runClearTable);
  1334. }
  1335. TESTCASE("UniqueNull", 
  1336.  "Test that unique indexes and nulls"){ 
  1337.   TC_PROPERTY("LoggedIndexes", (unsigned)0);
  1338.   INITIALIZER(runClearTable);
  1339.   INITIALIZER(createRandomIndex);
  1340.   INITIALIZER(createPkIndex);
  1341.   INITIALIZER(runLoadTable);
  1342.   STEP(runTransactions1);
  1343.   STEP(runTransactions2);
  1344.   STEP(runUniqueNullTransactions);
  1345.   FINALIZER(runVerifyIndex);
  1346.   FINALIZER(createRandomIndex_Drop);
  1347.   FINALIZER(createPkIndex_Drop);
  1348.   FINALIZER(runClearTable);
  1349. }
  1350. NDBT_TESTSUITE_END(testIndex);
  1351. int main(int argc, const char** argv){
  1352.   ndb_init();
  1353.   return testIndex.execute(argc, argv);
  1354. }
  1355. template class Vector<Attrib*>;