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

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 <signaldata/DumpStateOrd.hpp>
  20. int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
  21.   int records = ctx->getNumRecords();
  22.   HugoTransactions hugoTrans(*ctx->getTab());
  23.   if (hugoTrans.loadTable(GETNDB(step), records) != 0){
  24.     return NDBT_FAILED;
  25.   }
  26.   return NDBT_OK;
  27. }
  28. #define CHECK(b) if (!(b)) { 
  29.   g_err << "ERR: "<< step->getName() 
  30.          << " failed on line " << __LINE__ << endl; 
  31.   result = NDBT_FAILED; 
  32.   continue; } 
  33. int runSystemRestart1(NDBT_Context* ctx, NDBT_Step* step){
  34.   Ndb* pNdb = GETNDB(step);
  35.   int result = NDBT_OK;
  36.   int timeout = 300;
  37.   Uint32 loops = ctx->getNumLoops();
  38.   int records = ctx->getNumRecords();
  39.   int count;
  40.   NdbRestarter restarter;
  41.   Uint32 i = 1;
  42.   UtilTransactions utilTrans(*ctx->getTab());
  43.   HugoTransactions hugoTrans(*ctx->getTab());
  44.   while(i<=loops && result != NDBT_FAILED){
  45.     ndbout << "Loop " << i << "/"<< loops <<" started" << endl;
  46.     /*
  47.       1. Load data
  48.       2. Restart cluster and verify records
  49.       3. Update records
  50.       4. Restart cluster and verify records
  51.       5. Delete half of the records
  52.       6. Restart cluster and verify records
  53.       7. Delete all records
  54.       8. Restart cluster and verify records
  55.       9. Insert, update, delete records
  56.       10. Restart cluster and verify records
  57.       11. Insert, update, delete records
  58.       12. Restart cluster with error insert 5020 and verify records
  59.     */
  60.     ndbout << "Loading records..." << endl;
  61.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  62.     ndbout << "Restarting cluster" << endl;
  63.     CHECK(restarter.restartAll() == 0);
  64.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  65.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  66.     ndbout << "Verifying records..." << endl;
  67.     CHECK(hugoTrans.pkReadRecords(pNdb, records) == 0);
  68.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  69.     CHECK(count == records);
  70.     ndbout << "Updating records..." << endl;
  71.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  72.     ndbout << "Restarting cluster..." << endl;
  73.     CHECK(restarter.restartAll() == 0);
  74.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  75.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  76.     ndbout << "Verifying records..." << endl;
  77.     CHECK(hugoTrans.pkReadRecords(pNdb, records) == 0);
  78.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  79.     CHECK(count == records);
  80.     
  81.     ndbout << "Deleting 50% of records..." << endl;
  82.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  83.     ndbout << "Restarting cluster..." << endl;
  84.     CHECK(restarter.restartAll() == 0);
  85.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  86.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  87.     ndbout << "Verifying records..." << endl;
  88.     CHECK(hugoTrans.scanReadRecords(pNdb, records/2, 0, 64) == 0);
  89.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  90.     CHECK(count == (records/2));
  91.     ndbout << "Deleting all records..." << endl;
  92.     CHECK(utilTrans.clearTable(pNdb, records/2) == 0);
  93.     ndbout << "Restarting cluster..." << endl;
  94.     CHECK(restarter.restartAll() == 0);
  95.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  96.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  97.     ndbout << "Verifying records..." << endl;
  98.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  99.     CHECK(count == 0);
  100.     ndbout << "Doing it all..." << endl;
  101.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  102.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  103.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  104.     CHECK(hugoTrans.scanUpdateRecords(pNdb, records) == 0);
  105.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  106.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  107.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  108.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  109.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  110.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  111.     ndbout << "Restarting cluster..." << endl;
  112.     CHECK(restarter.restartAll() == 0);
  113.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  114.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  115.     ndbout << "Verifying records..." << endl;
  116.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  117.     CHECK(count == 0);
  118.     ndbout << "Doing it all..." << endl;
  119.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  120.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  121.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  122.     CHECK(hugoTrans.scanUpdateRecords(pNdb, records) == 0);
  123.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  124.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  125.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  126.     ndbout << "Restarting cluster with error insert 5020..." << endl;
  127.     CHECK(restarter.restartAll(false, true) == 0);
  128.     CHECK(restarter.waitClusterNoStart(timeout) == 0);
  129.     CHECK(restarter.insertErrorInAllNodes(5020) == 0);
  130.     CHECK(restarter.startAll() == 0);
  131.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  132.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  133.     
  134.     i++;
  135.   }
  136.   ndbout << "runSystemRestart1 finished" << endl;  
  137.   return result;
  138. }
  139. int runSystemRestart2(NDBT_Context* ctx, NDBT_Step* step){
  140.   Ndb* pNdb = GETNDB(step);
  141.   int result = NDBT_OK;
  142. ///  int timeout = 300;
  143.   int timeout = 120;
  144.   Uint32 loops = ctx->getNumLoops();
  145.   int records = ctx->getNumRecords();
  146.   int count;
  147.   NdbRestarter restarter;
  148.   Uint32 i = 1;
  149.   UtilTransactions utilTrans(*ctx->getTab());
  150.   HugoTransactions hugoTrans(*ctx->getTab());
  151.   while(i<=loops && result != NDBT_FAILED && !ctx->isTestStopped()){
  152.     ndbout << "Loop " << i << "/"<< loops <<" started" << endl;
  153.     /* Use error 7070 to set time between LCP to it's min value
  154.       1. Load data
  155.       2. Restart cluster and verify records
  156.       3. Update records
  157.       4. Restart cluster and verify records
  158.       5. Delete half of the records
  159.       6. Restart cluster and verify records
  160.       7. Delete all records
  161.       8. Restart cluster and verify records
  162.       9. Insert, update, delete records
  163.       10. Restart cluster and verify records
  164.     */
  165.     int val = DumpStateOrd::DihMinTimeBetweenLCP;
  166.     CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  167.     ndbout << "Loading records..." << endl;
  168.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  169.     ndbout << "Restarting cluster" << endl;
  170.     CHECK(restarter.restartAll() == 0);
  171.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  172.     {
  173.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  174.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  175.     }
  176.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  177.     ndbout << "Verifying records..." << endl;
  178.     CHECK(hugoTrans.pkReadRecords(pNdb, records) == 0);
  179.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  180.     CHECK(count == records);
  181.     ndbout << "Updating records..." << endl;
  182.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  183.     ndbout << "Restarting cluster..." << endl;
  184.     CHECK(restarter.restartAll() == 0);
  185.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  186.     {
  187.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  188.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  189.     }
  190.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  191.     ndbout << "Verifying records..." << endl;
  192.     CHECK(hugoTrans.pkReadRecords(pNdb, records) == 0);
  193.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  194.     CHECK(count == records);
  195.     
  196.     ndbout << "Deleting 50% of records..." << endl;
  197.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  198.     ndbout << "Restarting cluster..." << endl;
  199.     CHECK(restarter.restartAll() == 0);
  200.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  201.     {
  202.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  203.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  204.     }
  205.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  206.     ndbout << "Verifying records..." << endl;
  207.     CHECK(hugoTrans.scanReadRecords(pNdb, records/2, 0, 64) == 0);
  208.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  209.     CHECK(count == (records/2));
  210.     ndbout << "Deleting all records..." << endl;
  211.     CHECK(utilTrans.clearTable(pNdb, records/2) == 0);
  212.     ndbout << "Restarting cluster..." << endl;
  213.     CHECK(restarter.restartAll() == 0);
  214.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  215.     {
  216.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  217.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  218.     }
  219.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  220.     ndbout << "Verifying records..." << endl;
  221.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  222.     CHECK(count == 0);
  223.     ndbout << "Doing it all..." << endl;
  224.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  225.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  226.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  227.     CHECK(hugoTrans.scanUpdateRecords(pNdb, records) == 0);
  228.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  229.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  230.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  231.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  232.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  233.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  234.     ndbout << "Restarting cluster..." << endl;
  235.     CHECK(restarter.restartAll() == 0);
  236.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  237.     {
  238.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  239.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  240.     }
  241.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  242.     ndbout << "Verifying records..." << endl;
  243.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  244.     CHECK(count == 0);
  245.     i++;
  246.   }
  247.   ndbout << "runSystemRestart2 finished" << endl;  
  248.   return result;
  249. }
  250. int runSystemRestartTestUndoLog(NDBT_Context* ctx, NDBT_Step* step){
  251.   Ndb* pNdb = GETNDB(step);
  252.   int result = NDBT_OK;
  253.   int timeout = 300;
  254.   Uint32 loops = ctx->getNumLoops();
  255.   int records = ctx->getNumRecords();
  256.   int count;
  257.   NdbRestarter restarter;
  258.   Uint32 i = 1;
  259.   int dump7080[2];
  260.   dump7080[0] = 7080;
  261.   dump7080[1] = ctx->getTab()->getTableId();
  262.   UtilTransactions utilTrans(*ctx->getTab());
  263.   HugoTransactions hugoTrans(*ctx->getTab());
  264.   while(i<=loops && result != NDBT_FAILED){
  265.     ndbout << "Loop " << i << "/"<< loops <<" started" << endl;
  266.     /*
  267.       1. Start LCP, turn on undologging but delay write of datapages.
  268.       2. Insert, update, delete records
  269.       3. Complete writing of data pages and finish LCP.
  270.       4. Restart cluster and verify records
  271.     */
  272.     // Use dump state 7080 to delay writing of datapages
  273.     // for the current table
  274.     ndbout << "Dump state: "<<dump7080[0]<<", "<<dump7080[1]<<endl;
  275.     CHECK(restarter.dumpStateAllNodes(dump7080, 2) == 0);    
  276.     NdbSleep_SecSleep(10);
  277.     ndbout << "Doing it all..." << endl;
  278.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  279.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  280.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  281.     CHECK(hugoTrans.scanUpdateRecords(pNdb, records) == 0);
  282.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  283.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  284.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  285.     // Reset error and let LCP continue
  286.     CHECK(restarter.insertErrorInAllNodes(0) == 0);
  287.     NdbSleep_SecSleep(60);
  288.     ndbout << "Restarting cluster..." << endl;
  289.     CHECK(restarter.restartAll() == 0);
  290.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  291.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  292.     ndbout << "Verifying records..." << endl;
  293.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  294.     CHECK(count == 0);
  295.     // Use dump state 7080 to delay writing of datapages
  296.     // for the current table
  297.     ndbout << "Dump state: "<<dump7080[0]<<", "<<dump7080[1]<<endl;
  298.     CHECK(restarter.dumpStateAllNodes(dump7080, 2) == 0);
  299.     NdbSleep_SecSleep(10);
  300.     ndbout << "Doing it all, delete 50%..." << endl;
  301.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  302.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  303.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  304.     // Reset error and let LCP continue
  305.     CHECK(restarter.insertErrorInAllNodes(0) == 0);
  306.     NdbSleep_SecSleep(20);
  307.     ndbout << "Restarting cluster..." << endl;
  308.     CHECK(restarter.restartAll() == 0);
  309.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  310.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  311.     ndbout << "Verifying records..." << endl;
  312.     CHECK(hugoTrans.scanReadRecords(pNdb, records/2, 0, 64) == 0);
  313.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  314.     CHECK(count == (records/2));
  315.     CHECK(utilTrans.clearTable(pNdb, records) == 0);
  316.     i++;
  317.   }
  318.   ndbout << "runSystemRestartTestUndoLog finished" << endl;  
  319.   return result;
  320. }
  321. int runSystemRestartTestFullDb(NDBT_Context* ctx, NDBT_Step* step){
  322.   Ndb* pNdb = GETNDB(step);
  323.   int result = NDBT_OK;
  324.   int timeout = 300;
  325.   Uint32 loops = ctx->getNumLoops();
  326.   int count1, count2;
  327.   NdbRestarter restarter;
  328.   Uint32 i = 1;
  329.   UtilTransactions utilTrans(*ctx->getTab());
  330.   HugoTransactions hugoTrans(*ctx->getTab());
  331.   while(i<=loops && result != NDBT_FAILED){
  332.     ndbout << "Loop " << i << "/"<< loops <<" started" << endl;
  333.     /*
  334.       1. Load data until db reports it's full
  335.       2. Restart cluster and verify records
  336.     */
  337.     ndbout << "Filling up table..." << endl;
  338.     CHECK(hugoTrans.fillTable(pNdb) == 0);
  339.     CHECK(utilTrans.selectCount(pNdb, 64, &count1) == 0);
  340.     ndbout << "Db is full. Table has "<<count1 <<" records."<< endl;
  341.     
  342.     ndbout << "Restarting cluster" << endl;
  343.     CHECK(restarter.restartAll() == 0);
  344.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  345.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  346.     ndbout << "Verifying records..." << endl;
  347.     CHECK(hugoTrans.scanReadRecords(pNdb, count1) == 0);
  348.     CHECK(utilTrans.selectCount(pNdb, 64, &count2) == 0);
  349.     CHECK(count1 == count2);
  350.     ndbout << "Deleting all records..." << endl;
  351.     CHECK(utilTrans.clearTable2(pNdb, count1) == 0);
  352.     ndbout << "Restarting cluster..." << endl;
  353.     CHECK(restarter.restartAll() == 0);
  354.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  355.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  356.     ndbout << "Verifying records..." << endl;
  357.     CHECK(utilTrans.selectCount(pNdb, 64, &count1) == 0);
  358.     CHECK(count1 == 0);
  359.     i++;
  360.   }
  361.   ndbout << "runSystemRestartTestFullDb finished" << endl;  
  362.   return result;
  363. }
  364. int runSystemRestart3(NDBT_Context* ctx, NDBT_Step* step){
  365.   Ndb* pNdb = GETNDB(step);
  366.   int result = NDBT_OK;
  367.   int timeout = 300;
  368.   Uint32 loops = ctx->getNumLoops();
  369.   int records = ctx->getNumRecords();
  370.   int count;
  371.   NdbRestarter restarter;
  372.   Uint32 i = 1;
  373.   const Uint32 nodeCount = restarter.getNumDbNodes();
  374.   if(nodeCount < 2){
  375.     g_info << "SR3 - Needs atleast 2 nodes to test" << endl;
  376.     return NDBT_OK;
  377.   }
  378.   Vector<int> nodeIds;
  379.   for(i = 0; i<nodeCount; i++)
  380.     nodeIds.push_back(restarter.getDbNodeId(i));
  381.   
  382.   Uint32 currentRestartNodeIndex = 0;
  383.   UtilTransactions utilTrans(*ctx->getTab());
  384.   HugoTransactions hugoTrans(*ctx->getTab());
  385.   
  386.   while(i<=loops && result != NDBT_FAILED){
  387.     
  388.     g_info << "Loop " << i << "/"<< loops <<" started" << endl;
  389.     /**
  390.      * 1. Load data
  391.      * 2. Restart 1 node -nostart
  392.      * 3. Update records
  393.      * 4. Restart cluster and verify records
  394.      * 5. Restart 1 node -nostart
  395.      * 6. Delete half of the records
  396.      * 7. Restart cluster and verify records
  397.      * 8. Restart 1 node -nostart
  398.      * 9. Delete all records
  399.      * 10. Restart cluster and verify records
  400.      */
  401.     g_info << "Loading records..." << endl;
  402.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  403.     /*** 1 ***/
  404.     g_info << "1 - Stopping one node" << endl;
  405.     CHECK(restarter.restartOneDbNode(nodeIds[currentRestartNodeIndex],
  406.      false, 
  407.      true,
  408.      false) == 0);
  409.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  410.     g_info << "Updating records..." << endl;
  411.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  412.     
  413.     g_info << "Restarting cluster..." << endl;
  414.     CHECK(restarter.restartAll() == 0);
  415.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  416.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  417.     g_info << "Verifying records..." << endl;
  418.     CHECK(hugoTrans.pkReadRecords(pNdb, records) == 0);
  419.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  420.     CHECK(count == records);
  421.     g_info << "2 - Stopping one node" << endl;
  422.     CHECK(restarter.restartOneDbNode(nodeIds[currentRestartNodeIndex],
  423.      false, 
  424.      true,
  425.      false) == 0);
  426.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  427.     g_info << "Deleting 50% of records..." << endl;
  428.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  429.     
  430.     g_info << "Restarting cluster..." << endl;
  431.     CHECK(restarter.restartAll() == 0);
  432.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  433.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  434.     g_info << "Verifying records..." << endl;
  435.     CHECK(hugoTrans.scanReadRecords(pNdb, records/2, 0, 64) == 0);
  436.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  437.     CHECK(count == (records/2));
  438.     g_info << "3 - Stopping one node" << endl;
  439.     CHECK(restarter.restartOneDbNode(nodeIds[currentRestartNodeIndex],
  440.      false, 
  441.      true,
  442.      false) == 0);
  443.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  444.     g_info << "Deleting all records..." << endl;
  445.     CHECK(utilTrans.clearTable(pNdb, records/2) == 0);
  446.     g_info << "Restarting cluster..." << endl;
  447.     CHECK(restarter.restartAll() == 0);
  448.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  449.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  450.     
  451.     ndbout << "Verifying records..." << endl;
  452.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  453.     CHECK(count == 0);
  454.     
  455.     i++;
  456.   }
  457.   g_info << "runSystemRestart3 finished" << endl;  
  458.   return result;
  459. }
  460. int runSystemRestart4(NDBT_Context* ctx, NDBT_Step* step){
  461.   Ndb* pNdb = GETNDB(step);
  462.   int result = NDBT_OK;
  463.   int timeout = 300;
  464.   Uint32 loops = ctx->getNumLoops();
  465.   int records = ctx->getNumRecords();
  466.   int count;
  467.   NdbRestarter restarter;
  468.   Uint32 i = 1;
  469.   const Uint32 nodeCount = restarter.getNumDbNodes();
  470.   if(nodeCount < 2){
  471.     g_info << "SR4 - Needs atleast 2 nodes to test" << endl;
  472.     return NDBT_OK;
  473.   }
  474.   Vector<int> nodeIds;
  475.   for(i = 0; i<nodeCount; i++)
  476.     nodeIds.push_back(restarter.getDbNodeId(i));
  477.   
  478.   Uint32 currentRestartNodeIndex = 0;
  479.   UtilTransactions utilTrans(*ctx->getTab());
  480.   HugoTransactions hugoTrans(*ctx->getTab());
  481.   {
  482.     int val = DumpStateOrd::DihMinTimeBetweenLCP;
  483.     if(restarter.dumpStateAllNodes(&val, 1) != 0){
  484.       g_err << "ERR: "<< step->getName() 
  485.     << " failed on line " << __LINE__ << endl; 
  486.       return NDBT_FAILED;
  487.     }
  488.   }
  489.   
  490.   while(i<=loops && result != NDBT_FAILED){
  491.     
  492.     g_info << "Loop " << i << "/"<< loops <<" started" << endl;
  493.     /**
  494.      * 1. Load data
  495.      * 2. Restart 1 node -nostart
  496.      * 3. Update records
  497.      * 4. Restart cluster and verify records
  498.      * 5. Restart 1 node -nostart
  499.      * 6. Delete half of the records
  500.      * 7. Restart cluster and verify records
  501.      * 8. Restart 1 node -nostart
  502.      * 9. Delete all records
  503.      * 10. Restart cluster and verify records
  504.      */
  505.     g_info << "Loading records..." << endl;
  506.     CHECK(hugoTrans.loadTable(pNdb, records) == 0);
  507.     /*** 1 ***/
  508.     g_info << "1 - Stopping one node" << endl;
  509.     CHECK(restarter.restartOneDbNode(nodeIds[currentRestartNodeIndex],
  510.      false, 
  511.      true,
  512.      false) == 0);
  513.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  514.     g_info << "Updating records..." << endl;
  515.     CHECK(hugoTrans.pkUpdateRecords(pNdb, records) == 0);
  516.     
  517.     g_info << "Restarting cluster..." << endl;
  518.     CHECK(restarter.restartAll() == 0);
  519.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  520.     {
  521.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  522.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  523.     }
  524.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  525.     g_info << "Verifying records..." << endl;
  526.     CHECK(hugoTrans.pkReadRecords(pNdb, records) == 0);
  527.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  528.     CHECK(count == records);
  529.     g_info << "2 - Stopping one node" << endl;
  530.     CHECK(restarter.restartOneDbNode(nodeIds[currentRestartNodeIndex],
  531.      false, 
  532.      true,
  533.      false) == 0);
  534.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  535.     g_info << "Deleting 50% of records..." << endl;
  536.     CHECK(hugoTrans.pkDelRecords(pNdb, records/2) == 0);
  537.     
  538.     g_info << "Restarting cluster..." << endl;
  539.     CHECK(restarter.restartAll() == 0);
  540.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  541.     {
  542.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  543.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  544.     }
  545.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  546.     g_info << "Verifying records..." << endl;
  547.     CHECK(hugoTrans.scanReadRecords(pNdb, records/2, 0, 64) == 0);
  548.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  549.     CHECK(count == (records/2));
  550.     g_info << "3 - Stopping one node" << endl;
  551.     CHECK(restarter.restartOneDbNode(nodeIds[currentRestartNodeIndex],
  552.      false, 
  553.      true,
  554.      false) == 0);
  555.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  556.     g_info << "Deleting all records..." << endl;
  557.     CHECK(utilTrans.clearTable(pNdb, records/2) == 0);
  558.     g_info << "Restarting cluster..." << endl;
  559.     CHECK(restarter.restartAll() == 0);
  560.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  561.     {
  562.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  563.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  564.     }
  565.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  566.     
  567.     ndbout << "Verifying records..." << endl;
  568.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  569.     CHECK(count == 0);
  570.     
  571.     i++;
  572.   }
  573.   g_info << "runSystemRestart4 finished" << endl;  
  574.   return result;
  575. }
  576. int runSystemRestart5(NDBT_Context* ctx, NDBT_Step* step){
  577.   Ndb* pNdb = GETNDB(step);
  578.   int result = NDBT_OK;
  579.   int timeout = 300;
  580.   Uint32 loops = ctx->getNumLoops();
  581.   int records = ctx->getNumRecords();
  582.   int count;
  583.   NdbRestarter restarter;
  584.   Uint32 i = 1;
  585.   const Uint32 nodeCount = restarter.getNumDbNodes();
  586.   if(nodeCount < 2){
  587.     g_info << "SR5 - Needs atleast 2 nodes to test" << endl;
  588.     return NDBT_OK;
  589.   }
  590.   Vector<int> nodeIds;
  591.   for(i = 0; i<nodeCount; i++)
  592.     nodeIds.push_back(restarter.getDbNodeId(i));
  593.   
  594.   Uint32 currentRestartNodeIndex = 0;
  595.   UtilTransactions utilTrans(*ctx->getTab());
  596.   HugoTransactions hugoTrans(*ctx->getTab());
  597.   {
  598.     int val = DumpStateOrd::DihMinTimeBetweenLCP;
  599.     if(restarter.dumpStateAllNodes(&val, 1) != 0){
  600.       g_err << "ERR: "<< step->getName() 
  601.     << " failed on line " << __LINE__ << endl; 
  602.       return NDBT_FAILED;
  603.     }
  604.   }
  605.   
  606.   while(i<=loops && result != NDBT_FAILED){
  607.     
  608.     g_info << "Loop " << i << "/"<< loops <<" started" << endl;
  609.     /**
  610.      * 1. Load data
  611.      * 2. Restart 1 node -nostart
  612.      * 3. Update records
  613.      * 4. Restart cluster and verify records
  614.      * 5. Restart 1 node -nostart
  615.      * 6. Delete half of the records
  616.      * 7. Restart cluster and verify records
  617.      * 8. Restart 1 node -nostart
  618.      * 9. Delete all records
  619.      * 10. Restart cluster and verify records
  620.      */
  621.     g_info << "Loading records..." << endl;
  622.     hugoTrans.loadTable(pNdb, records);
  623.     /*** 1 ***/
  624.     g_info << "1 - Stopping one node" << endl;
  625.     CHECK(restarter.restartOneDbNode(nodeIds[currentRestartNodeIndex],
  626.      false, 
  627.      true,
  628.      false) == 0);
  629.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  630.     g_info << "Updating records..." << endl;
  631.     hugoTrans.pkUpdateRecords(pNdb, records);
  632.     
  633.     g_info << "Restarting cluster..." << endl;
  634.     CHECK(restarter.restartAll(false, false, true) == 0);
  635.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  636.     {
  637.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  638.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  639.     }
  640.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  641.     g_info << "Verifying records..." << endl;
  642.     hugoTrans.pkReadRecords(pNdb, records);
  643.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  644.     //CHECK(count == records);
  645.     g_info << "2 - Stopping one node" << endl;
  646.     CHECK(restarter.restartOneDbNode(nodeIds[currentRestartNodeIndex],
  647.      false, 
  648.      true,
  649.      false) == 0);
  650.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  651.     g_info << "Deleting 50% of records..." << endl;
  652.     hugoTrans.pkDelRecords(pNdb, records/2);
  653.     
  654.     g_info << "Restarting cluster..." << endl;
  655.     CHECK(restarter.restartAll(false, false, true) == 0);
  656.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  657.     {
  658.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  659.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  660.     }
  661.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  662.     g_info << "Verifying records..." << endl;
  663.     hugoTrans.scanReadRecords(pNdb, records/2, 0, 64);
  664.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  665.     //CHECK(count == (records/2));
  666.     g_info << "3 - Stopping one node" << endl;
  667.     CHECK(restarter.restartOneDbNode(nodeIds[currentRestartNodeIndex],
  668.      false, 
  669.      true,
  670.      false) == 0);
  671.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  672.     g_info << "Deleting all records..." << endl;
  673.     utilTrans.clearTable(pNdb, records/2);
  674.     g_info << "Restarting cluster..." << endl;
  675.     CHECK(restarter.restartAll(false, false, true) == 0);
  676.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  677.     {
  678.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  679.       CHECK(restarter.dumpStateAllNodes(&val, 1) == 0);
  680.     }
  681.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  682.     
  683.     ndbout << "Verifying records..." << endl;
  684.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  685.     //CHECK(count == 0);
  686.     
  687.     CHECK(utilTrans.clearTable(pNdb) == 0);    
  688.     i++;
  689.   }
  690.   g_info << "runSystemRestart5 finished" << endl;  
  691.   return result;
  692. }
  693. int runSystemRestart6(NDBT_Context* ctx, NDBT_Step* step){
  694.   Ndb* pNdb = GETNDB(step);
  695.   int result = NDBT_OK;
  696.   int timeout = 300;
  697.   Uint32 loops = ctx->getNumLoops();
  698.   int records = ctx->getNumRecords();
  699.   NdbRestarter restarter;
  700.   Uint32 i = 1;
  701.   const Uint32 nodeCount = restarter.getNumDbNodes();
  702.   if(nodeCount < 2){
  703.     g_info << "SR6 - Needs atleast 2 nodes to test" << endl;
  704.     return NDBT_OK;
  705.   }
  706.   Vector<int> nodeIds;
  707.   for(i = 0; i<nodeCount; i++)
  708.     nodeIds.push_back(restarter.getDbNodeId(i));
  709.   
  710.   Uint32 currentRestartNodeIndex = 0;
  711.   UtilTransactions utilTrans(*ctx->getTab());
  712.   HugoTransactions hugoTrans(*ctx->getTab());
  713.   while(i<=loops && result != NDBT_FAILED){
  714.     
  715.     g_info << "Loop " << i << "/"<< loops <<" started" << endl;
  716.     /**
  717.      * 1. Load data
  718.      * 2. Restart all node -nostart
  719.      * 3. Restart some nodes -i -nostart
  720.      * 4. Start all nodes verify records
  721.      */
  722.     g_info << "Loading records..." << endl;
  723.     hugoTrans.loadTable(pNdb, records);
  724.     CHECK(restarter.restartAll(false, true, false) == 0);
  725.     Uint32 nodeId = nodeIds[currentRestartNodeIndex];
  726.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  727.     
  728.     CHECK(restarter.restartOneDbNode(nodeId, true, true,false) == 0);
  729.     CHECK(restarter.waitClusterNoStart(timeout) == 0);
  730.     CHECK(restarter.startAll() == 0);
  731.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  732.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  733.     int count = records - 1;
  734.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  735.     CHECK(count == records);
  736.     CHECK(utilTrans.clearTable(pNdb) == 0);    
  737.     i++;
  738.   }
  739.   g_info << "runSystemRestart6 finished" << endl;  
  740.   return result;
  741. }
  742. int runSystemRestart7(NDBT_Context* ctx, NDBT_Step* step){
  743.   Ndb* pNdb = GETNDB(step);
  744.   int result = NDBT_OK;
  745.   Uint32 loops = ctx->getNumLoops();
  746.   int records = ctx->getNumRecords();
  747.   NdbRestarter restarter;
  748.   Uint32 i = 1;
  749.   const Uint32 nodeCount = restarter.getNumDbNodes();
  750.   if(nodeCount < 2){
  751.     g_info << "SR7 - Needs atleast 2 nodes to test" << endl;
  752.     return NDBT_OK;
  753.   }
  754.   Vector<int> nodeIds;
  755.   for(i = 0; i<nodeCount; i++)
  756.     nodeIds.push_back(restarter.getDbNodeId(i));
  757.   int a_nodeIds[64];
  758.   if(nodeCount > 64)
  759.     abort();
  760.   Uint32 currentRestartNodeIndex = 1;
  761.   UtilTransactions utilTrans(*ctx->getTab());
  762.   HugoTransactions hugoTrans(*ctx->getTab());
  763.   while(i<=loops && result != NDBT_FAILED){
  764.     
  765.     g_info << "Loop " << i << "/"<< loops <<" started" << endl;
  766.     /**
  767.      * 1. Load data
  768.      * 2. Restart all node -nostart
  769.      * 3. Start all but one node
  770.      * 4. Wait for startphase >= 2
  771.      * 5. Start last node
  772.      * 6. Verify records
  773.      */
  774.     g_info << "Loading records..." << endl;
  775.     hugoTrans.loadTable(pNdb, records);
  776.     
  777.     CHECK(restarter.restartAll(false, true, false) == 0);
  778.     
  779.     int nodeId = nodeIds[currentRestartNodeIndex];
  780.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  781.     Uint32 j = 0;
  782.     for(Uint32 k = 0; k<nodeCount; k++){
  783.       if(nodeIds[k] != nodeId){
  784. a_nodeIds[j++] = nodeIds[k];
  785.       }
  786.     }
  787.     CHECK(restarter.startNodes(a_nodeIds, nodeCount - 1) == 0);
  788.     CHECK(restarter.waitNodesStarted(a_nodeIds, nodeCount - 1, 120) == 0);
  789.     CHECK(pNdb->waitUntilReady(5) == 0);
  790.     int count = records - 1;
  791.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  792.     CHECK(count == records);
  793.     
  794.     CHECK(restarter.startNodes(&nodeId, 1) == 0);
  795.     CHECK(restarter.waitNodesStarted(&nodeId, 1, 120) == 0);
  796.     
  797.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  798.     CHECK(count == records);
  799.     CHECK(utilTrans.clearTable(pNdb) == 0);    
  800.     i++;
  801.   }
  802.   
  803.   g_info << "runSystemRestart7 finished" << endl;  
  804.   return result;
  805. }
  806. int runSystemRestart8(NDBT_Context* ctx, NDBT_Step* step){
  807.   Ndb* pNdb = GETNDB(step);
  808.   int result = NDBT_OK;
  809.   int timeout = 300;
  810.   Uint32 loops = ctx->getNumLoops();
  811.   int records = ctx->getNumRecords();
  812.   NdbRestarter restarter;
  813.   Uint32 i = 1;
  814.   const Uint32 nodeCount = restarter.getNumDbNodes();
  815.   if(nodeCount < 2){
  816.     g_info << "SR8 - Needs atleast 2 nodes to test" << endl;
  817.     return NDBT_OK;
  818.   }
  819.   Vector<int> nodeIds;
  820.   for(i = 0; i<nodeCount; i++)
  821.     nodeIds.push_back(restarter.getDbNodeId(i));
  822.   int a_nodeIds[64];
  823.   if(nodeCount > 64)
  824.     abort();
  825.   Uint32 currentRestartNodeIndex = 1;
  826.   UtilTransactions utilTrans(*ctx->getTab());
  827.   HugoTransactions hugoTrans(*ctx->getTab());
  828.   while(i<=loops && result != NDBT_FAILED){
  829.     
  830.     g_info << "Loop " << i << "/"<< loops <<" started" << endl;
  831.     /**
  832.      * 1. Load data
  833.      * 2. Restart all node -nostart
  834.      * 3. Start all but one node
  835.      * 4. Verify records
  836.      * 5. Start last node
  837.      * 6. Verify records
  838.      */
  839.     g_info << "Loading records..." << endl;
  840.     hugoTrans.loadTable(pNdb, records);
  841.     
  842.     CHECK(restarter.restartAll(false, true, false) == 0);
  843.     
  844.     int nodeId = nodeIds[currentRestartNodeIndex];
  845.     currentRestartNodeIndex = (currentRestartNodeIndex + 1 ) % nodeCount;
  846.     Uint32 j = 0;
  847.     for(Uint32 k = 0; k<nodeCount; k++){
  848.       if(nodeIds[k] != nodeId){
  849. a_nodeIds[j++] = nodeIds[k];
  850.       }
  851.     }
  852.     
  853.     CHECK(restarter.startNodes(a_nodeIds, nodeCount-1) == 0);
  854.     CHECK(restarter.waitNodesStartPhase(a_nodeIds, nodeCount-1, 3, 120) == 0);
  855.     CHECK(restarter.startNodes(&nodeId, 1) == 0);
  856.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  857.     
  858.     int count = records - 1;
  859.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  860.     CHECK(count == records);
  861.     CHECK(utilTrans.clearTable(pNdb) == 0);    
  862.     i++;
  863.   }
  864.   
  865.   g_info << "runSystemRestart8 finished" << endl;  
  866.   return result;
  867. }
  868. int runSystemRestart9(NDBT_Context* ctx, NDBT_Step* step){
  869.   Ndb* pNdb = GETNDB(step);
  870.   int result = NDBT_OK;
  871.   int timeout = 300;
  872.   Uint32 loops = ctx->getNumLoops();
  873.   int records = ctx->getNumRecords();
  874.   NdbRestarter restarter;
  875.   Uint32 i = 1;
  876.   
  877.   Uint32 currentRestartNodeIndex = 1;
  878.   UtilTransactions utilTrans(*ctx->getTab());
  879.   HugoTransactions hugoTrans(*ctx->getTab());
  880.   int args[] = { DumpStateOrd::DihMaxTimeBetweenLCP };
  881.   int dump[] = { DumpStateOrd::DihStartLcpImmediately };
  882.   
  883.   do {
  884.     CHECK(restarter.dumpStateAllNodes(args, 1) == 0);
  885.     
  886.     HugoOperations ops(* ctx->getTab());
  887.     CHECK(ops.startTransaction(pNdb) == 0);
  888.     for(i = 0; i<10; i++){
  889.       CHECK(ops.pkInsertRecord(pNdb, i, 1, 1) == 0);
  890.       CHECK(ops.execute_NoCommit(pNdb) == 0);
  891.     }
  892.     for(i = 0; i<10; i++){
  893.       CHECK(ops.pkUpdateRecord(pNdb, i, 1) == 0);
  894.       CHECK(ops.execute_NoCommit(pNdb) == 0);
  895.     }
  896.     NdbSleep_SecSleep(10);
  897.     CHECK(restarter.dumpStateAllNodes(dump, 1) == 0);
  898.     NdbSleep_SecSleep(10);
  899.     CHECK(ops.execute_Commit(pNdb) == 0);  
  900.     
  901.     CHECK(restarter.restartAll() == 0);
  902.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  903.     CHECK(pNdb->waitUntilReady(timeout) == 0);
  904.     ops.closeTransaction(pNdb);
  905.   } while(0);
  906.   
  907.   g_info << "runSystemRestart9 finished" << endl;  
  908.   return result;
  909. }
  910. int runWaitStarted(NDBT_Context* ctx, NDBT_Step* step){
  911.   NdbRestarter restarter;
  912.   restarter.waitClusterStarted(300);
  913.   NdbSleep_SecSleep(3);
  914.   return NDBT_OK;
  915. }
  916. int runClearTable(NDBT_Context* ctx, NDBT_Step* step){
  917.   int records = ctx->getNumRecords();
  918.   
  919.   Ndb* pNdb = GETNDB(step);
  920.   if(pNdb->waitUntilReady(5) != 0){
  921.     return NDBT_FAILED;
  922.   }
  923.   UtilTransactions utilTrans(*ctx->getTab());  
  924.   if (utilTrans.clearTable2(pNdb,  records) != 0){
  925.     return NDBT_FAILED;
  926.   }
  927.   return NDBT_OK;
  928. }
  929. NDBT_TESTSUITE(testSystemRestart);
  930. TESTCASE("SR1", 
  931.  "Basic system restart test. Focus on testing restart from REDO log.n"
  932.  "NOTE! Time between lcp's and gcp's should be left at default, n"
  933.  "so that Ndb  uses the Redo log when restartingn" 
  934.  "1. Load recordsn"
  935.  "2. Restart cluster and verify records n"
  936.  "3. Update recordsn"
  937.  "4. Restart cluster and verify records n"
  938.  "5. Delete half of the records n"
  939.  "6. Restart cluster and verify records n"
  940.  "7. Delete all records n"
  941.  "8. Restart cluster and verify records n"
  942.  "9. Insert, update, delete records n"
  943.  "10. Restart cluster and verify recordsn"
  944.  "11. Insert, update, delete records n"
  945.  "12. Restart cluster with error insert 5020 and verify recordsn"){ 
  946.   INITIALIZER(runWaitStarted);
  947.   STEP(runSystemRestart1);
  948.   FINALIZER(runClearTable);
  949. }
  950. TESTCASE("SR2", 
  951.  "Basic system restart test. Focus on testing restart from LCPn"
  952.  "NOTE! Time between lcp's is automatically set to it's  min valuen"
  953.  "so that Ndb  uses LCP's when restarting.n" 
  954.  "1. Load recordsn"
  955.  "2. Restart cluster and verify records n"
  956.  "3. Update recordsn"
  957.  "4. Restart cluster and verify records n"
  958.  "5. Delete half of the records n"
  959.  "6. Restart cluster and verify records n"
  960.  "7. Delete all records n"
  961.  "8. Restart cluster and verify records n"
  962.  "9. Insert, update, delete records n"
  963.  "10. Restart cluster and verify recordsn"){
  964.   INITIALIZER(runWaitStarted);
  965.   STEP(runSystemRestart2);
  966.   FINALIZER(runClearTable);
  967. }
  968. TESTCASE("SR_UNDO", 
  969.  "System restart test. Focus on testing of undologgingn"
  970.  "in DBACC and DBTUP.n"
  971.  "This is done by starting a LCP, turn on undologging n"
  972.  "but don't start writing the datapages. This will force alln"
  973.  "operations to be written into the undolog.n"
  974.  "Then write datapages and complete LCP.n"
  975.  "Restart the systemn"){
  976.   INITIALIZER(runWaitStarted);
  977.   STEP(runSystemRestartTestUndoLog);
  978.   FINALIZER(runClearTable);
  979. }
  980. TESTCASE("SR_FULLDB", 
  981.  "System restart test. Test to restart when DB is full.n"){
  982.   INITIALIZER(runWaitStarted);
  983.   STEP(runSystemRestartTestFullDb);
  984.   FINALIZER(runClearTable);
  985. }
  986. TESTCASE("SR3", 
  987.  "System restart test. Focus on testing restart from withn"
  988.  "not all nodes alive when system went downn"
  989.  "* 1. Load datan"
  990.  "* 2. Restart 1 node -nostartn"
  991.  "* 3. Update recordsn"
  992.  "* 4. Restart cluster and verify recordsn"
  993.  "* 5. Restart 1 node -nostartn"
  994.  "* 6. Delete half of the recordsn"
  995.  "* 7. Restart cluster and verify recordsn"
  996.  "* 8. Restart 1 node -nostartn"
  997.  "* 9. Delete all recordsn"
  998.  "* 10. Restart cluster and verify recordsn"){
  999.   INITIALIZER(runWaitStarted);
  1000.   STEP(runSystemRestart3);
  1001.   FINALIZER(runClearTable);
  1002. }
  1003. TESTCASE("SR4", 
  1004.  "System restart test. Focus on testing restart from withn"
  1005.  "not all nodes alive when system went down but running LCP atn"
  1006.  "high speed so that sometimes a TO is required to start clustern"
  1007.  "* 1. Load datan"
  1008.  "* 2. Restart 1 node -nostartn"
  1009.  "* 3. Update recordsn"
  1010.  "* 4. Restart cluster and verify recordsn"
  1011.  "* 5. Restart 1 node -nostartn"
  1012.  "* 6. Delete half of the recordsn"
  1013.  "* 7. Restart cluster and verify recordsn"
  1014.  "* 8. Restart 1 node -nostartn"
  1015.  "* 9. Delete all recordsn"
  1016.  "* 10. Restart cluster and verify recordsn"){
  1017.   INITIALIZER(runWaitStarted);
  1018.   STEP(runSystemRestart4);
  1019.   FINALIZER(runClearTable);
  1020. }
  1021. TESTCASE("SR5", 
  1022.  "As SR4 but making restart abortsn"
  1023.  "* 1. Load datan"
  1024.  "* 2. Restart 1 node -nostartn"
  1025.  "* 3. Update recordsn"
  1026.  "* 4. Restart cluster and verify recordsn"
  1027.  "* 5. Restart 1 node -nostartn"
  1028.  "* 6. Delete half of the recordsn"
  1029.  "* 7. Restart cluster and verify recordsn"
  1030.  "* 8. Restart 1 node -nostartn"
  1031.  "* 9. Delete all recordsn"
  1032.  "* 10. Restart cluster and verify recordsn"){
  1033.   INITIALIZER(runWaitStarted);
  1034.   STEP(runSystemRestart5);
  1035.   FINALIZER(runClearTable);
  1036. }
  1037. TESTCASE("SR6", 
  1038.  "Perform system restart with some nodes having FS others wo/n"
  1039.  "* 1. Load datan"
  1040.  "* 2. Restart all node -nostartn"
  1041.  "* 3. Restart some nodes -i -nostartn"
  1042.  "* 4. Start all nodes verify recordsn"){
  1043.   INITIALIZER(runWaitStarted);
  1044.   INITIALIZER(runClearTable);
  1045.   STEP(runSystemRestart6);
  1046.   FINALIZER(runClearTable);
  1047. }
  1048. TESTCASE("SR7", 
  1049.  "Perform partition win system restartn"
  1050.  "* 1. Load datan"
  1051.  "* 2. Restart all node -nostartn"
  1052.  "* 3. Start all but one noden"
  1053.  "* 4. Verify recordsn"
  1054.  "* 5. Start last noden"
  1055.  "* 6. Verify recordsn"){
  1056.   INITIALIZER(runWaitStarted);
  1057.   INITIALIZER(runClearTable);
  1058.   STEP(runSystemRestart7);
  1059.   FINALIZER(runClearTable);
  1060. }
  1061. TESTCASE("SR8", 
  1062.  "Perform partition win system restart with other nodes delayedn"
  1063.  "* 1. Load datan"
  1064.  "* 2. Restart all node -nostartn"
  1065.  "* 3. Start all but one noden"
  1066.  "* 4. Wait for startphase >= 2n"
  1067.  "* 5. Start last noden"
  1068.  "* 6. Verify recordsn"){
  1069.   INITIALIZER(runWaitStarted);
  1070.   INITIALIZER(runClearTable);
  1071.   STEP(runSystemRestart8);
  1072.   FINALIZER(runClearTable);
  1073. }
  1074. TESTCASE("SR9", 
  1075.  "Perform partition win system restart with other nodes delayedn"
  1076.  "* 1. Start transactionn"
  1077.  "* 2. insert (1,1)n"
  1078.  "* 3. update (1,2)n"
  1079.  "* 4. start lcpn"
  1080.  "* 5. commitn"
  1081.  "* 6. restartn"){
  1082.   INITIALIZER(runWaitStarted);
  1083.   INITIALIZER(runClearTable);
  1084.   STEP(runSystemRestart9);
  1085.   FINALIZER(runClearTable);
  1086. }
  1087. NDBT_TESTSUITE_END(testSystemRestart);
  1088. int main(int argc, const char** argv){
  1089.   ndb_init();
  1090.   return testSystemRestart.execute(argc, argv);
  1091. }