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

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. #include "bank/Bank.hpp"
  19. int runCreateBank(NDBT_Context* ctx, NDBT_Step* step){
  20.   Bank bank;
  21.   int overWriteExisting = true;
  22.   if (bank.createAndLoadBank(overWriteExisting, 10) != NDBT_OK)
  23.     return NDBT_FAILED;
  24.   return NDBT_OK;
  25. }
  26. /**
  27.  *
  28.  * SR 0 - normal
  29.  * SR 1 - shutdown in progress
  30.  * SR 2 - restart in progress
  31.  */
  32. int runBankTimer(NDBT_Context* ctx, NDBT_Step* step){
  33.   int wait = 5; // Max seconds between each "day"
  34.   int yield = 1; // Loops before bank returns 
  35.   ctx->incProperty("ThreadCount");
  36.   while (!ctx->isTestStopped()) 
  37.   {
  38.     Bank bank;
  39.     while(!ctx->isTestStopped() && ctx->getProperty("SR") <= 1)
  40.       if(bank.performIncreaseTime(wait, yield) == NDBT_FAILED)
  41. break;
  42.     ndbout_c("runBankTimer is stopped");
  43.     ctx->incProperty("ThreadStopped");
  44.     if(ctx->getPropertyWait("SR", (Uint32)0))
  45.       break;
  46.   }
  47.   return NDBT_OK;
  48. }
  49. int runBankTransactions(NDBT_Context* ctx, NDBT_Step* step){
  50.   int wait = 0; // Max ms between each transaction
  51.   int yield = 1; // Loops before bank returns 
  52.   ctx->incProperty("ThreadCount");
  53.   while (!ctx->isTestStopped()) 
  54.   {
  55.     Bank bank;
  56.     while(!ctx->isTestStopped() && ctx->getProperty("SR") <= 1)
  57.       if(bank.performTransactions(0, 1) == NDBT_FAILED)
  58. break;
  59.     
  60.     ndbout_c("runBankTransactions is stopped");
  61.     ctx->incProperty("ThreadStopped");
  62.     if(ctx->getPropertyWait("SR", (Uint32)0))
  63.       break;
  64.   }
  65.   return NDBT_OK;
  66. }
  67. int runBankGL(NDBT_Context* ctx, NDBT_Step* step){
  68.   int yield = 1; // Loops before bank returns 
  69.   int result = NDBT_OK;
  70.   ctx->incProperty("ThreadCount");
  71.   while (ctx->isTestStopped() == false) 
  72.   {
  73.     Bank bank;
  74.     while(!ctx->isTestStopped() && ctx->getProperty("SR") <= 1)
  75.       if (bank.performMakeGLs(yield) != NDBT_OK)
  76.       {
  77. if(ctx->getProperty("SR") != 0)
  78.   break;
  79. ndbout << "bank.performMakeGLs FAILED" << endl;
  80. return NDBT_FAILED;
  81.       }
  82.     
  83.     ndbout_c("runBankGL is stopped");
  84.     ctx->incProperty("ThreadStopped");
  85.     if(ctx->getPropertyWait("SR", (Uint32)0))
  86.       break;
  87.   }
  88.   return NDBT_OK;
  89. }
  90. int runBankSum(NDBT_Context* ctx, NDBT_Step* step){
  91.   Bank bank;
  92.   int wait = 2000; // Max ms between each sum of accounts
  93.   int yield = 1; // Loops before bank returns 
  94.   int result = NDBT_OK;
  95.   while (ctx->isTestStopped() == false) {
  96.     if (bank.performSumAccounts(wait, yield) != NDBT_OK){
  97.       ndbout << "bank.performSumAccounts FAILED" << endl;
  98.       result = NDBT_FAILED;
  99.     }
  100.   }
  101.   return result ;
  102. }
  103. #define CHECK(b) if (!(b)) { 
  104.   g_err << "ERR: "<< step->getName() 
  105.          << " failed on line " << __LINE__ << endl; 
  106.   result = NDBT_FAILED; 
  107.   continue; } 
  108. int runSR(NDBT_Context* ctx, NDBT_Step* step)
  109. {
  110.   int result = NDBT_OK;
  111.   int runtime = ctx->getNumLoops();
  112.   int sleeptime = ctx->getNumRecords();
  113.   NdbRestarter restarter;
  114.   bool abort = true;
  115.   int timeout = 180;
  116.   Uint32 now;
  117.   const Uint32 stop = time(0)+ runtime;
  118.   while(!ctx->isTestStopped() && ((now= time(0)) < stop) && result == NDBT_OK)
  119.   {
  120.     ndbout << " -- Sleep " << sleeptime << "s " << endl;
  121.     NdbSleep_SecSleep(sleeptime);
  122.     ndbout << " -- Shutting down " << endl;
  123.     ctx->setProperty("SR", 1);
  124.     CHECK(restarter.restartAll(false, true, abort) == 0);
  125.     ctx->setProperty("SR", 2);
  126.     CHECK(restarter.waitClusterNoStart(timeout) == 0);
  127.     Uint32 cnt = ctx->getProperty("ThreadCount");
  128.     Uint32 curr= ctx->getProperty("ThreadStopped");
  129.     while(curr != cnt)
  130.     {
  131.       ndbout_c("%d %d", curr, cnt);
  132.       NdbSleep_MilliSleep(100);
  133.       curr= ctx->getProperty("ThreadStopped");
  134.     }
  135.     ctx->setProperty("ThreadStopped", (Uint32)0);
  136.     CHECK(restarter.startAll() == 0);
  137.     CHECK(restarter.waitClusterStarted(timeout) == 0);
  138.     
  139.     ndbout << " -- Validating starts " << endl;
  140.     {
  141.       int wait = 0;
  142.       int yield = 1;
  143.       Bank bank;
  144.       if (bank.performSumAccounts(wait, yield) != 0)
  145.       {
  146. ndbout << "bank.performSumAccounts FAILED" << endl;
  147. return NDBT_FAILED;
  148.       }
  149.       if (bank.performValidateAllGLs() != 0)
  150.       {
  151. ndbout << "bank.performValidateAllGLs FAILED" << endl;
  152. return NDBT_FAILED;
  153.       }
  154.     }
  155.     ndbout << " -- Validating complete " << endl;
  156.     ctx->setProperty("SR", (Uint32)0);
  157.     ctx->broadcast();
  158.   }
  159.   ctx->stopTest();
  160.   return NDBT_OK;
  161. }
  162. int runDropBank(NDBT_Context* ctx, NDBT_Step* step){
  163.   Bank bank;
  164.   if (bank.dropBank() != NDBT_OK)
  165.     return NDBT_FAILED;
  166.   return NDBT_OK;
  167. }
  168. NDBT_TESTSUITE(testSRBank);
  169. TESTCASE("Graceful", 
  170.  " Test that a consistent bank is restored after graceful shutdownn"
  171.  "1.  Create bankn"
  172.  "2.  Start bank and let it runn"
  173.  "3.  Restart ndb and verify consistencyn"
  174.  "4.  Drop bankn")
  175. {
  176.   INITIALIZER(runCreateBank);
  177.   STEP(runBankTimer);
  178.   STEP(runBankTransactions);
  179.   STEP(runBankTransactions);
  180.   STEP(runBankTransactions);
  181.   STEP(runBankTransactions);
  182.   STEP(runBankTransactions);
  183.   STEP(runBankTransactions);
  184.   STEP(runBankTransactions);
  185.   STEP(runBankTransactions);
  186.   STEP(runBankTransactions);
  187.   STEP(runBankTransactions);
  188.   STEP(runBankGL);
  189.   STEP(runSR);
  190. }
  191. TESTCASE("Abort", 
  192.  " Test that a consistent bank is restored after graceful shutdownn"
  193.  "1.  Create bankn"
  194.  "2.  Start bank and let it runn"
  195.  "3.  Restart ndb and verify consistencyn"
  196.  "4.  Drop bankn")
  197. {
  198.   INITIALIZER(runCreateBank);
  199.   STEP(runBankTimer);
  200.   STEP(runBankTransactions);
  201.   STEP(runBankTransactions);
  202.   STEP(runBankTransactions);
  203.   STEP(runBankTransactions);
  204.   STEP(runBankTransactions);
  205.   STEP(runBankTransactions);
  206.   STEP(runBankTransactions);
  207.   STEP(runBankTransactions);
  208.   STEP(runBankTransactions);
  209.   STEP(runBankTransactions);
  210.   STEP(runBankGL);
  211.   STEP(runSR);
  212.   FINALIZER(runDropBank);
  213. }
  214. NDBT_TESTSUITE_END(testSRBank);
  215. int main(int argc, const char** argv){
  216.   ndb_init();
  217.   return testSRBank.execute(argc, argv);
  218. }