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

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 <NdbBackup.hpp>
  18. #define CHECK(b) if (!(b)) { 
  19.   g_err << "ERR: "<< step->getName() 
  20.          << " failed on line " << __LINE__ << endl; 
  21.   result = NDBT_FAILED; 
  22.   continue; } 
  23. int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
  24.   int records = ctx->getNumRecords();
  25.   HugoTransactions hugoTrans(*ctx->getTab());
  26.   if (hugoTrans.loadTable(GETNDB(step), records) != 0){
  27.     return NDBT_FAILED;
  28.   }
  29.   return NDBT_OK;
  30. }
  31. bool testMaster = true;
  32. bool testSlave = false;
  33. int setMaster(NDBT_Context* ctx, NDBT_Step* step){
  34.   testMaster = true;
  35.   testSlave = false;
  36.   return NDBT_OK;
  37. }
  38. int setMasterAsSlave(NDBT_Context* ctx, NDBT_Step* step){
  39.   testMaster = true;
  40.   testSlave = true;
  41.   return NDBT_OK;
  42. }
  43. int setSlave(NDBT_Context* ctx, NDBT_Step* step){
  44.   testMaster = false;
  45.   testSlave = true;
  46.   return NDBT_OK;
  47. }
  48. int runAbort(NDBT_Context* ctx, NDBT_Step* step){
  49.   NdbBackup backup(GETNDB(step)->getNodeId()+1);
  50.   NdbRestarter restarter;
  51.   if (restarter.getNumDbNodes() < 2){
  52.     ctx->stopTest();
  53.     return NDBT_OK;
  54.   }
  55.   if(restarter.waitClusterStarted(60) != 0){
  56.     g_err << "Cluster failed to start" << endl;
  57.     return NDBT_FAILED;
  58.   }
  59.   if (testMaster) {
  60.     if (testSlave) {
  61.       if (backup.NFMasterAsSlave(restarter) != NDBT_OK){
  62. return NDBT_FAILED;
  63.       }
  64.     } else {
  65.       if (backup.NFMaster(restarter) != NDBT_OK){
  66. return NDBT_FAILED;
  67.       }
  68.     }
  69.   } else {
  70.     if (backup.NFSlave(restarter) != NDBT_OK){
  71.       return NDBT_FAILED;
  72.     }
  73.   }
  74.   
  75.   return NDBT_OK;
  76. }
  77. int runFail(NDBT_Context* ctx, NDBT_Step* step){
  78.   NdbBackup backup(GETNDB(step)->getNodeId()+1);
  79.   NdbRestarter restarter;
  80.   if (restarter.getNumDbNodes() < 2){
  81.     ctx->stopTest();
  82.     return NDBT_OK;
  83.   }
  84.   if(restarter.waitClusterStarted(60) != 0){
  85.     g_err << "Cluster failed to start" << endl;
  86.     return NDBT_FAILED;
  87.   }
  88.   if (testMaster) {
  89.     if (testSlave) {
  90.       if (backup.FailMasterAsSlave(restarter) != NDBT_OK){
  91. return NDBT_FAILED;
  92.       }
  93.     } else {
  94.       if (backup.FailMaster(restarter) != NDBT_OK){
  95. return NDBT_FAILED;
  96.       }
  97.     }
  98.   } else {
  99.     if (backup.FailSlave(restarter) != NDBT_OK){
  100.       return NDBT_FAILED;
  101.     }
  102.   }
  103.   return NDBT_OK;
  104. }
  105. int runBackupOne(NDBT_Context* ctx, NDBT_Step* step){
  106.   NdbBackup backup(GETNDB(step)->getNodeId()+1);
  107.   unsigned backupId = 0;
  108.   if (backup.start(backupId) == -1){
  109.     return NDBT_FAILED;
  110.   }
  111.   ndbout << "Started backup " << backupId << endl;
  112.   ctx->setProperty("BackupId", backupId);
  113.   return NDBT_OK;
  114. }
  115. int
  116. runBackupLoop(NDBT_Context* ctx, NDBT_Step* step){
  117.   NdbBackup backup(GETNDB(step)->getNodeId()+1);
  118.   unsigned backupId = 0;
  119.   
  120.   int loops = ctx->getNumLoops();
  121.   while(!ctx->isTestStopped() && loops--)
  122.   {
  123.     if (backup.start(backupId) == -1)
  124.     {
  125.       sleep(1);
  126.       loops++;
  127.     }
  128.     else
  129.     {
  130.       sleep(3);
  131.     }
  132.   }
  133.   ctx->stopTest();
  134.   return NDBT_OK;
  135. }
  136. int
  137. runDDL(NDBT_Context* ctx, NDBT_Step* step){
  138.   Ndb* pNdb= GETNDB(step);
  139.   NdbDictionary::Dictionary* pDict = pNdb->getDictionary();
  140.   
  141.   const int tables = NDBT_Tables::getNumTables();
  142.   while(!ctx->isTestStopped())
  143.   {
  144.     const int tab_no = rand() % (tables);
  145.     NdbDictionary::Table tab = *NDBT_Tables::getTable(tab_no);
  146.     BaseString name= tab.getName();
  147.     name.appfmt("-%d", step->getStepNo());
  148.     tab.setName(name.c_str());
  149.     if(pDict->createTable(tab) == 0)
  150.     {
  151.       HugoTransactions hugoTrans(* pDict->getTable(name.c_str()));
  152.       if (hugoTrans.loadTable(pNdb, 10000) != 0){
  153. return NDBT_FAILED;
  154.       }
  155.       
  156.       while(pDict->dropTable(tab.getName()) != 0 &&
  157.     pDict->getNdbError().code != 4009)
  158. g_err << pDict->getNdbError() << endl;
  159.       
  160.       sleep(1);
  161.     }
  162.   }
  163.   return NDBT_OK;
  164. }
  165. int runRestartInitial(NDBT_Context* ctx, NDBT_Step* step){
  166.   NdbRestarter restarter;
  167.   Ndb* pNdb = GETNDB(step);
  168.   const NdbDictionary::Table *tab = ctx->getTab();
  169.   pNdb->getDictionary()->dropTable(tab->getName());
  170.   if (restarter.restartAll(true) != 0)
  171.     return NDBT_FAILED;
  172.   if (restarter.waitClusterStarted() != 0)
  173.     return NDBT_FAILED;
  174.   
  175.   return NDBT_OK;
  176. }
  177. int runRestoreOne(NDBT_Context* ctx, NDBT_Step* step){
  178.   NdbBackup backup(GETNDB(step)->getNodeId()+1);
  179.   unsigned backupId = ctx->getProperty("BackupId"); 
  180.   ndbout << "Restoring backup " << backupId << endl;
  181.   if (backup.restore(backupId) == -1){
  182.     return NDBT_FAILED;
  183.   }
  184.   return NDBT_OK;
  185. }
  186. int runVerifyOne(NDBT_Context* ctx, NDBT_Step* step){
  187.   int records = ctx->getNumRecords();
  188.   Ndb* pNdb = GETNDB(step);
  189.   int result = NDBT_OK;
  190.   int count = 0;
  191.   ndbout << *(const NDBT_Table*)ctx->getTab() << endl;
  192.   UtilTransactions utilTrans(*ctx->getTab());
  193.   HugoTransactions hugoTrans(*ctx->getTab());
  194.   do{
  195.     // Check that there are as many records as we expected
  196.     CHECK(utilTrans.selectCount(pNdb, 64, &count) == 0);
  197.     g_err << "count = " << count;
  198.     g_err << " records = " << records;
  199.     g_err << endl;
  200.     CHECK(count == records);
  201.     // Read and verify every record
  202.     CHECK(hugoTrans.pkReadRecords(pNdb, records) == 0);
  203.     
  204.   } while (false);
  205.   return result;
  206. }
  207. int runClearTable(NDBT_Context* ctx, NDBT_Step* step){
  208.   int records = ctx->getNumRecords();
  209.   
  210.   UtilTransactions utilTrans(*ctx->getTab());
  211.   if (utilTrans.clearTable2(GETNDB(step),  records) != 0){
  212.     return NDBT_FAILED;
  213.   }
  214.   return NDBT_OK;
  215. }
  216. int runDropTable(NDBT_Context* ctx, NDBT_Step* step){
  217.   GETNDB(step)->getDictionary()->dropTable(ctx->getTab()->getName());
  218.   return NDBT_OK;
  219. }
  220. #include "bank/Bank.hpp"
  221. int runCreateBank(NDBT_Context* ctx, NDBT_Step* step){
  222.   Bank bank;
  223.   int overWriteExisting = true;
  224.   if (bank.createAndLoadBank(overWriteExisting, 10) != NDBT_OK)
  225.     return NDBT_FAILED;
  226.   return NDBT_OK;
  227. }
  228. int runBankTimer(NDBT_Context* ctx, NDBT_Step* step){
  229.   Bank bank;
  230.   int wait = 30; // Max seconds between each "day"
  231.   int yield = 1; // Loops before bank returns 
  232.   while (ctx->isTestStopped() == false) {
  233.     bank.performIncreaseTime(wait, yield);
  234.   }
  235.   return NDBT_OK;
  236. }
  237. int runBankTransactions(NDBT_Context* ctx, NDBT_Step* step){
  238.   Bank bank;
  239.   int wait = 10; // Max ms between each transaction
  240.   int yield = 100; // Loops before bank returns 
  241.   while (ctx->isTestStopped() == false) {
  242.     bank.performTransactions(wait, yield);
  243.   }
  244.   return NDBT_OK;
  245. }
  246. int runBankGL(NDBT_Context* ctx, NDBT_Step* step){
  247.   Bank bank;
  248.   int yield = 20; // Loops before bank returns 
  249.   int result = NDBT_OK;
  250.   while (ctx->isTestStopped() == false) {
  251.     if (bank.performMakeGLs(yield) != NDBT_OK){
  252.       ndbout << "bank.performMakeGLs FAILED" << endl;
  253.       result = NDBT_FAILED;
  254.     }
  255.   }
  256.   return NDBT_OK;
  257. }
  258. int runBankSum(NDBT_Context* ctx, NDBT_Step* step){
  259.   Bank bank;
  260.   int wait = 2000; // Max ms between each sum of accounts
  261.   int yield = 1; // Loops before bank returns 
  262.   int result = NDBT_OK;
  263.   while (ctx->isTestStopped() == false) {
  264.     if (bank.performSumAccounts(wait, yield) != NDBT_OK){
  265.       ndbout << "bank.performSumAccounts FAILED" << endl;
  266.       result = NDBT_FAILED;
  267.     }
  268.   }
  269.   return result ;
  270. }
  271. int runDropBank(NDBT_Context* ctx, NDBT_Step* step){
  272.   Bank bank;
  273.   if (bank.dropBank() != NDBT_OK)
  274.     return NDBT_FAILED;
  275.   return NDBT_OK;
  276. }
  277. int runBackupBank(NDBT_Context* ctx, NDBT_Step* step){
  278.   int loops = ctx->getNumLoops();
  279.   int l = 0;
  280.   int maxSleep = 30; // Max seconds between each backup
  281.   Ndb* pNdb = GETNDB(step);
  282.   NdbBackup backup(GETNDB(step)->getNodeId()+1);
  283.   unsigned minBackupId = ~0;
  284.   unsigned maxBackupId = 0;
  285.   unsigned backupId = 0;
  286.   int result = NDBT_OK;
  287.   while (l < loops && result != NDBT_FAILED){
  288.     if (pNdb->waitUntilReady() != 0){
  289.       result = NDBT_FAILED;
  290.       continue;
  291.     }
  292.     // Sleep for a while
  293.     NdbSleep_SecSleep(maxSleep);
  294.     
  295.     // Perform backup
  296.     if (backup.start(backupId) != 0){
  297.       ndbout << "backup.start failed" << endl;
  298.       result = NDBT_FAILED;
  299.       continue;
  300.     }
  301.     ndbout << "Started backup " << backupId << endl;
  302.     // Remember min and max backupid
  303.     if (backupId < minBackupId)
  304.       minBackupId = backupId;
  305.     if (backupId > maxBackupId)
  306.       maxBackupId = backupId;
  307.     
  308.     ndbout << " maxBackupId = " << maxBackupId 
  309.    << ", minBackupId = " << minBackupId << endl;
  310.     ctx->setProperty("MinBackupId", minBackupId);    
  311.     ctx->setProperty("MaxBackupId", maxBackupId);    
  312.     
  313.     l++;
  314.   }
  315.   ctx->stopTest();
  316.   return result;
  317. }
  318. int runRestoreBankAndVerify(NDBT_Context* ctx, NDBT_Step* step){
  319.   NdbRestarter restarter;
  320.   NdbBackup backup(GETNDB(step)->getNodeId()+1);
  321.   unsigned minBackupId = ctx->getProperty("MinBackupId");
  322.   unsigned maxBackupId = ctx->getProperty("MaxBackupId");
  323.   unsigned backupId = minBackupId;
  324.   int result = NDBT_OK;
  325.   int errSumAccounts = 0;
  326.   int errValidateGL = 0;
  327.   ndbout << " maxBackupId = " << maxBackupId << endl;
  328.   ndbout << " minBackupId = " << minBackupId << endl;
  329.   
  330.   while (backupId <= maxBackupId){
  331.     // TEMPORARY FIX
  332.     // To erase all tables from cache(s)
  333.     // To be removed, maybe replaced by ndb.invalidate();
  334.     {
  335.       Bank bank;
  336.       
  337.       if (bank.dropBank() != NDBT_OK){
  338. result = NDBT_FAILED;
  339. break;
  340.       }
  341.     }
  342.     // END TEMPORARY FIX
  343.     ndbout << "Performing initial restart" << endl;
  344.     if (restarter.restartAll(true) != 0)
  345.       return NDBT_FAILED;
  346.     if (restarter.waitClusterStarted() != 0)
  347.       return NDBT_FAILED;
  348.     ndbout << "Restoring backup " << backupId << endl;
  349.     if (backup.restore(backupId) == -1){
  350.       return NDBT_FAILED;
  351.     }
  352.     ndbout << "Backup " << backupId << " restored" << endl;
  353.     // Let bank verify
  354.     Bank bank;
  355.     int wait = 0;
  356.     int yield = 1;
  357.     if (bank.performSumAccounts(wait, yield) != 0){
  358.       ndbout << "bank.performSumAccounts FAILED" << endl;
  359.       ndbout << "  backupId = " << backupId << endl << endl;
  360.       result = NDBT_FAILED;
  361.       errSumAccounts++;
  362.     }
  363.     if (bank.performValidateAllGLs() != 0){
  364.       ndbout << "bank.performValidateAllGLs FAILED" << endl;
  365.       ndbout << "  backupId = " << backupId << endl << endl;
  366.       result = NDBT_FAILED;
  367.       errValidateGL++;
  368.     }
  369.     backupId++;
  370.   }
  371.   
  372.   if (result != NDBT_OK){
  373.     ndbout << "Verification of backup failed" << endl
  374.    << "  errValidateGL="<<errValidateGL<<endl
  375.    << "  errSumAccounts="<<errSumAccounts<<endl << endl;
  376.   }
  377.   
  378.   return result;
  379. }
  380. NDBT_TESTSUITE(testBackup);
  381. TESTCASE("BackupOne", 
  382.  "Test that backup and restore works on one table n"
  383.  "1. Load tablen"
  384.  "2. Backupn"
  385.  "3. Restart -in"
  386.  "4. Restoren"
  387.  "5. Verify count and content of tablen"){
  388.   INITIALIZER(runLoadTable);
  389.   INITIALIZER(runBackupOne);
  390.   INITIALIZER(runRestartInitial);
  391.   INITIALIZER(runRestoreOne);
  392.   VERIFIER(runVerifyOne);
  393.   FINALIZER(runClearTable);
  394. }
  395. TESTCASE("BackupDDL", 
  396.  "Test that backup and restore works on with DDL ongoingn"
  397.  "1. Backups and DDL (create,drop,table.index)"){
  398.   INITIALIZER(runLoadTable);
  399.   STEP(runBackupLoop);
  400.   STEP(runDDL);
  401.   STEP(runDDL);
  402.   FINALIZER(runClearTable);
  403. }
  404. TESTCASE("BackupBank", 
  405.  "Test that backup and restore works during transaction loadn"
  406.  " by backing up the bank"
  407.  "1.  Create bankn"
  408.  "2a. Start bank and let it runn"
  409.  "2b. Perform loop number of backups of the bankn"
  410.  "    when backups are finished tell bank to closen"
  411.  "3.  Restart ndb -i and reload each backupn"
  412.  "    let bank verify that the backup is consistentn"
  413.  "4.  Drop bankn"){
  414.   INITIALIZER(runCreateBank);
  415.   STEP(runBankTimer);
  416.   STEP(runBankTransactions);
  417.   STEP(runBankTransactions);
  418.   STEP(runBankTransactions);
  419.   STEP(runBankTransactions);
  420.   STEP(runBankTransactions);
  421.   STEP(runBankTransactions);
  422.   STEP(runBankTransactions);
  423.   STEP(runBankTransactions);
  424.   STEP(runBankTransactions);
  425.   STEP(runBankTransactions);
  426.   STEP(runBankGL);
  427.   // TODO  STEP(runBankSum);
  428.   STEP(runBackupBank);
  429.   VERIFIER(runRestoreBankAndVerify);
  430.   //  FINALIZER(runDropBank);
  431. }
  432. TESTCASE("NFMaster", 
  433.  "Test that backup behaves during node failiuren"){
  434.   INITIALIZER(setMaster);
  435.   STEP(runAbort);
  436. }
  437. TESTCASE("NFMasterAsSlave", 
  438.  "Test that backup behaves during node failiuren"){
  439.   INITIALIZER(setMasterAsSlave);
  440.   STEP(runAbort);
  441. }
  442. TESTCASE("NFSlave", 
  443.  "Test that backup behaves during node failiuren"){
  444.   INITIALIZER(setSlave);
  445.   STEP(runAbort);
  446. }
  447. TESTCASE("FailMaster", 
  448.  "Test that backup behaves during node failiuren"){
  449.   INITIALIZER(setMaster);
  450.   STEP(runFail);
  451. }
  452. TESTCASE("FailMasterAsSlave", 
  453.  "Test that backup behaves during node failiuren"){
  454.   INITIALIZER(setMasterAsSlave);
  455.   STEP(runFail);
  456. }
  457. TESTCASE("FailSlave", 
  458.  "Test that backup behaves during node failiuren"){
  459.   INITIALIZER(setSlave);
  460.   STEP(runFail);
  461. }
  462. NDBT_TESTSUITE_END(testBackup);
  463. int main(int argc, const char** argv){
  464.   ndb_init();
  465.   return testBackup.execute(argc, argv);
  466. }