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

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 <signaldata/DumpStateOrd.hpp>
  14. #include <NdbGrep.hpp>
  15. #include <NdbOut.hpp>
  16. #include <NDBT_Output.hpp>
  17. #include <NdbConfig.h>
  18. #include <ConfigRetriever.hpp>
  19. #include <ndb_version.h>
  20. #include <NDBT.hpp>
  21. #include <NdbSleep.h>
  22. #include <random.h>
  23. #include <NdbTick.h>
  24. #define CHECK(b, m) { int _xx = b; if (!(_xx)) { 
  25.   ndbout << "ERR: "<< m 
  26.            << "   " << "File: " << __FILE__ 
  27.            << " (Line: " << __LINE__ << ")" << "- " << _xx << endl; 
  28.   return NDBT_FAILED; } }
  29. int 
  30. NdbGrep::start(){
  31.   return 1;
  32. }
  33. int 
  34. NdbGrep::stop(){
  35.   return 1;
  36. }
  37. int 
  38. NdbGrep::query(){
  39.   return 1;
  40. }
  41. int 
  42. NdbGrep::verify(NDBT_Context * ctx){
  43.   
  44.   if (!isConnected())
  45.     return -1;
  46.   char cheat_table[255];
  47.   BaseString::snprintf(cheat_table, 255, "TEST_DB/def/%s",ctx->getTab()->getName());
  48.   char buf[255];
  49.   BaseString::snprintf(buf, 255, "testGrepVerify -c "nodeid=%d;host=%s" -t %s -r %d", 
  50.    4,  //cheat. Hardcoded nodeid....
  51.    ctx->getRemoteMgm(),
  52.    cheat_table,
  53.    ctx->getNumRecords());
  54.   
  55.   ndbout << "buf: "<< buf <<endl;
  56.   int res = system(buf);  
  57.   ndbout << "res: " << res << endl;
  58.   return res;
  59.   
  60.   
  61. }
  62. // Master failure
  63. int
  64. NFDuringGrepM_codes[] = {
  65.   10003,
  66.   10004,
  67.   10005,
  68.   10007,
  69.   10008,
  70.   10009,
  71.   10010,
  72.   10012,
  73.   10013
  74. };
  75. // Slave failure
  76. int
  77. NFDuringGrepS_codes[] = {
  78.   10014,
  79.   10015,
  80.   10016,
  81.   10017,
  82.   10018,
  83.   10020
  84. };
  85. // Master takeover etc...
  86. int
  87. NFDuringGrepSL_codes[] = {
  88.   10001,
  89.   10002,
  90.   10021
  91. };
  92. int 
  93. NdbGrep::NFMaster(NdbRestarter& _restarter){
  94.   const int sz = sizeof(NFDuringGrepM_codes)/sizeof(NFDuringGrepM_codes[0]);
  95.   return NF(_restarter, NFDuringGrepM_codes, sz, true);
  96. }
  97. int 
  98. NdbGrep::NFMasterAsSlave(NdbRestarter& _restarter){
  99.   const int sz = sizeof(NFDuringGrepS_codes)/sizeof(NFDuringGrepS_codes[0]);
  100.   return NF(_restarter, NFDuringGrepS_codes, sz, true);
  101. }
  102. int 
  103. NdbGrep::NFSlave(NdbRestarter& _restarter){
  104.   const int sz = sizeof(NFDuringGrepS_codes)/sizeof(NFDuringGrepS_codes[0]);
  105.   return NF(_restarter, NFDuringGrepS_codes, sz, false);
  106. }
  107. int 
  108. NdbGrep::NF(NdbRestarter& _restarter, int *NFDuringGrep_codes, const int sz, bool onMaster){
  109.   {
  110.     int nodeId = _restarter.getMasterNodeId();
  111.     CHECK(_restarter.restartOneDbNode(nodeId, false, true, true) == 0,
  112.   "Could not restart node "<< nodeId);
  113.     
  114.     CHECK(_restarter.waitNodesNoStart(&nodeId, 1) == 0,
  115.   "waitNodesNoStart failed");
  116.     
  117.     CHECK(_restarter.startNodes(&nodeId, 1) == 0,
  118.   "failed to start node");
  119.     NdbSleep_SecSleep(10);
  120.   }
  121.   CHECK(_restarter.waitClusterStarted() == 0,
  122. "waitClusterStarted failed");
  123.   int nNodes = _restarter.getNumDbNodes();
  124.   myRandom48Init(NdbTick_CurrentMillisecond());
  125.   for(int i = 0; i<sz; i++){
  126.     int error = NFDuringGrep_codes[i];
  127.     unsigned int backupId;
  128.     const int masterNodeId = _restarter.getMasterNodeId();
  129.     CHECK(masterNodeId > 0, "getMasterNodeId failed");
  130.     int nodeId;
  131.     nodeId = masterNodeId;
  132.     if (!onMaster) {
  133.       int randomId;
  134.       while (nodeId == masterNodeId) {
  135. randomId = myRandom48(nNodes);
  136. nodeId = _restarter.getDbNodeId(randomId);
  137.       }
  138.     }
  139.     g_err << "NdbGrep::NF node = " << nodeId 
  140.    << " error code = " << error << " masterNodeId = "
  141.    << masterNodeId << endl;
  142.     int val = DumpStateOrd::CmvmiSetRestartOnErrorInsert;
  143.     CHECK(_restarter.dumpStateOneNode(nodeId, &val, 1) == 0,
  144.   "failed to set RestartOnErrorInsert");
  145.     CHECK(_restarter.insertErrorInNode(nodeId, error) == 0,
  146.   "failed to set error insert");
  147.    
  148.     g_info << "error inserted"  << endl;
  149.     g_info << "starting backup"  << endl;
  150.     int r = start();
  151.     g_info << "r = " << r
  152.    << " (which should fail) started with id = "  << backupId << endl;
  153.     if (r == 0) {
  154.       g_err << "Grep should have failed on error_insertion " << error << endl
  155.     << "Master = " << masterNodeId << "Node = " << nodeId << endl;
  156.     }
  157.     CHECK(_restarter.waitNodesNoStart(&nodeId, 1) == 0,
  158.   "waitNodesNoStart failed");
  159.     g_info << "number of nodes running " << _restarter.getNumDbNodes() << endl;
  160.     if (_restarter.getNumDbNodes() != nNodes) {
  161.       g_err << "Failure: cluster not up" << endl;
  162.       return NDBT_FAILED;
  163.     }
  164.     NdbSleep_SecSleep(1);
  165.     g_info << "starting new backup"  << endl;
  166.     CHECK(start() == 0,
  167.   "failed to start backup");
  168.     g_info << "(which should succeed) started with id = "  << backupId << endl;
  169.     g_info << "starting node"  << endl;
  170.     CHECK(_restarter.startNodes(&nodeId, 1) == 0,
  171.   "failed to start node");
  172.     CHECK(_restarter.waitClusterStarted() == 0,
  173.   "waitClusterStarted failed");
  174.     g_info << "node started"  << endl;
  175.     CHECK(_restarter.insertErrorInNode(nodeId, 10099) == 0,
  176.   "failed to set error insert");
  177.   }
  178.   return NDBT_OK;
  179. }
  180. int
  181. FailS_codes[] = {
  182.   10023,
  183.   10024,
  184.   10025,
  185.   10026,
  186.   10027,
  187.   10028,
  188.  10029,
  189.   10030,
  190.   10031
  191. };
  192. int
  193. FailM_codes[] = {
  194.   10023,
  195.   10024,
  196.   10025,
  197.   10026,
  198.   10027,
  199.   10028,
  200.   10029,
  201.   10030,
  202.   10031
  203. };
  204. int 
  205. NdbGrep::FailMaster(NdbRestarter& _restarter){
  206.   const int sz = sizeof(FailM_codes)/sizeof(FailM_codes[0]);
  207.   return Fail(_restarter, FailM_codes, sz, true);
  208. }
  209. int 
  210. NdbGrep::FailMasterAsSlave(NdbRestarter& _restarter){
  211.   const int sz = sizeof(FailS_codes)/sizeof(FailS_codes[0]);
  212.   return Fail(_restarter, FailS_codes, sz, true);
  213. }
  214. int 
  215. NdbGrep::FailSlave(NdbRestarter& _restarter){
  216.   const int sz = sizeof(FailS_codes)/sizeof(FailS_codes[0]);
  217.   return Fail(_restarter, FailS_codes, sz, false);
  218. }
  219. int 
  220. NdbGrep::Fail(NdbRestarter& _restarter, int *Fail_codes, const int sz, bool onMaster){
  221.   CHECK(_restarter.waitClusterStarted() == 0,
  222. "waitClusterStarted failed");
  223.   int nNodes = _restarter.getNumDbNodes();
  224.   myRandom48Init(NdbTick_CurrentMillisecond());
  225.   for(int i = 0; i<sz; i++){
  226.     int error = Fail_codes[i];
  227.     unsigned int backupId;
  228.     const int masterNodeId = _restarter.getMasterNodeId();
  229.     CHECK(masterNodeId > 0, "getMasterNodeId failed");
  230.     int nodeId;
  231.     nodeId = masterNodeId;
  232.     if (!onMaster) {
  233.       int randomId;
  234.       while (nodeId == masterNodeId) {
  235. randomId = myRandom48(nNodes);
  236. nodeId = _restarter.getDbNodeId(randomId);
  237.       }
  238.     }
  239.     g_err << "NdbGrep::Fail node = " << nodeId 
  240.    << " error code = " << error << " masterNodeId = "
  241.    << masterNodeId << endl;
  242.     CHECK(_restarter.insertErrorInNode(nodeId, error) == 0,
  243.   "failed to set error insert");
  244.    
  245.     g_info << "error inserted"  << endl;
  246.     g_info << "waiting some before starting backup"  << endl;
  247.     g_info << "starting backup"  << endl;
  248.     int r = start();
  249.     g_info << "r = " << r
  250.    << " (which should fail) started with id = "  << backupId << endl;
  251.     if (r == 0) {
  252.       g_err << "Grep should have failed on error_insertion " << error << endl
  253.     << "Master = " << masterNodeId << "Node = " << nodeId << endl;
  254.     }
  255.     CHECK(_restarter.waitClusterStarted() == 0,
  256.   "waitClusterStarted failed");
  257.     CHECK(_restarter.insertErrorInNode(nodeId, 10099) == 0,
  258.   "failed to set error insert");
  259.   }
  260.   return NDBT_OK;
  261. }