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

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 <NdbRestarts.hpp>
  14. #include <NDBT.hpp>
  15. #include <string.h>
  16. #include <NdbSleep.h>
  17. #include <kernel/ndb_limits.h>
  18. #include <signaldata/DumpStateOrd.hpp>
  19. #include <NdbEnv.h>
  20. int restartRandomNodeGraceful(NdbRestarter&, const NdbRestarts::NdbRestart*);
  21. int restartRandomNodeAbort(NdbRestarter&, const NdbRestarts::NdbRestart*);
  22. int restartRandomNodeError(NdbRestarter&, const NdbRestarts::NdbRestart*);
  23. int restartRandomNodeInitial(NdbRestarter&, const NdbRestarts::NdbRestart*);
  24. int restartNFDuringNR(NdbRestarter&, const NdbRestarts::NdbRestart*);
  25. int restartMasterNodeError(NdbRestarter&, const NdbRestarts::NdbRestart*);
  26. int twoNodeFailure(NdbRestarter&, const NdbRestarts::NdbRestart*);
  27. int fiftyPercentFail(NdbRestarter&, const NdbRestarts::NdbRestart*);
  28. int twoMasterNodeFailure(NdbRestarter&, const NdbRestarts::NdbRestart*);
  29. int restartAllNodesGracfeul(NdbRestarter&, const NdbRestarts::NdbRestart*);
  30. int restartAllNodesAbort(NdbRestarter&, const NdbRestarts::NdbRestart*);
  31. int restartAllNodesError9999(NdbRestarter&, const NdbRestarts::NdbRestart*);
  32. int fiftyPercentStopAndWait(NdbRestarter&, const NdbRestarts::NdbRestart*);
  33. int restartNodeDuringLCP(NdbRestarter& _restarter,
  34.  const NdbRestarts::NdbRestart* _restart);
  35. int stopOnError(NdbRestarter&, const NdbRestarts::NdbRestart*);
  36. int getRandomNodeId(NdbRestarter& _restarter);
  37. /**
  38.  * Define list of restarts
  39.  *  - name of restart
  40.  *  - function perfoming the restart
  41.  *  - required number of nodes
  42.  *  - ...
  43.  *  - arg1, used depending of restart
  44.  *  - arg2, used depending of restart
  45.  */
  46. const NdbRestarts::NdbRestart NdbRestarts::m_restarts[] = {
  47.   /*********************************************************
  48.    *
  49.    *  NODE RESTARTS with 1 node restarted
  50.    *
  51.    *********************************************************/
  52.   /** 
  53.    * Restart a randomly selected node
  54.    * with graceful shutdown
  55.    */ 
  56.   NdbRestart("RestartRandomNode", 
  57.      NODE_RESTART,
  58.      restartRandomNodeGraceful,
  59.      2),
  60.   /** 
  61.    * Restart a randomly selected node
  62.    * with immediate(abort) shutdown
  63.    */ 
  64.   NdbRestart("RestartRandomNodeAbort", 
  65.      NODE_RESTART,
  66.      restartRandomNodeAbort,
  67.      2),
  68.   /** 
  69.    * Restart a randomly selected node
  70.    * with  error insert
  71.    *
  72.    */ 
  73.   NdbRestart("RestartRandomNodeError",
  74.      NODE_RESTART,
  75.      restartRandomNodeError,
  76.      2),
  77.   /**
  78.    * Restart the master node
  79.    * with  error insert
  80.    */ 
  81.   NdbRestart("RestartMasterNodeError",
  82.      NODE_RESTART,
  83.      restartMasterNodeError,
  84.      2),
  85.   /**
  86.    * Restart a randomly selected node without fileystem
  87.    *
  88.    */ 
  89.   NdbRestart("RestartRandomNodeInitial",
  90.      NODE_RESTART,
  91.      restartRandomNodeInitial,
  92.      2),
  93.   /**
  94.    * Restart a randomly selected node and then 
  95.    * crash it while restarting
  96.    *
  97.    */    
  98.   NdbRestart("RestartNFDuringNR",
  99.      NODE_RESTART,
  100.      restartNFDuringNR,
  101.      2),   
  102.   /**
  103.    * Set StopOnError and crash the node by sending
  104.    * SYSTEM_ERROR to it
  105.    *
  106.    */    
  107.   NdbRestart("StopOnError",
  108.      NODE_RESTART,
  109.      stopOnError,
  110.      1),  
  111.   /*********************************************************
  112.    *
  113.    *  MULTIPLE NODE RESTARTS with more than 1 node
  114.    *
  115.    *********************************************************/
  116.   /**
  117.    * 2 nodes restart, select nodes to restart randomly and restart 
  118.    * with a small random delay between restarts
  119.    */ 
  120.   NdbRestart("TwoNodeFailure",
  121.      MULTIPLE_NODE_RESTART,
  122.      twoNodeFailure,
  123.      4),
  124.   /**
  125.    * 2 nodes restart, select master nodes and restart with 
  126.    * a small random delay between restarts 
  127.    */ 
  128.   
  129.   NdbRestart("TwoMasterNodeFailure",
  130.      MULTIPLE_NODE_RESTART,
  131.      twoMasterNodeFailure,
  132.      4),
  133.   NdbRestart("FiftyPercentFail",
  134.      MULTIPLE_NODE_RESTART,
  135.      fiftyPercentFail,
  136.      2),
  137.   /*********************************************************
  138.    *
  139.    *  SYSTEM RESTARTS
  140.    *
  141.    *********************************************************/
  142.   /**
  143.    * Restart all nodes with graceful shutdown
  144.    *
  145.    */ 
  146.   
  147.   NdbRestart("RestartAllNodes",
  148.      SYSTEM_RESTART,
  149.      restartAllNodesGracfeul,
  150.      1),
  151.   /**
  152.    * Restart all nodes immediately without
  153.    * graful shutdown
  154.    */ 
  155.   NdbRestart("RestartAllNodesAbort",
  156.      SYSTEM_RESTART,
  157.      restartAllNodesAbort,
  158.      1),
  159.   /**
  160.    * Restart all nodes with error insert 9999
  161.    * TODO! We can later add more errors like 9998, 9997 etc.
  162.    */ 
  163.   NdbRestart("RestartAllNodesError9999",
  164.      SYSTEM_RESTART,
  165.      restartAllNodesError9999,
  166.      1),
  167.   /**
  168.    * Stop 50% of all nodes with error insert 9999
  169.    * Wait for a random number of minutes
  170.    * Stop the rest of the nodes and then start all again
  171.    */ 
  172.   NdbRestart("FiftyPercentStopAndWait",
  173.      SYSTEM_RESTART,
  174.      fiftyPercentStopAndWait,
  175.      2),
  176.   /** 
  177.    * Restart a master node during LCP with error inserts.
  178.    */ 
  179.   NdbRestart("RestartNodeDuringLCP", 
  180.      NODE_RESTART,
  181.      restartNodeDuringLCP,
  182.      2),
  183. };
  184. const int NdbRestarts::m_NoOfRestarts = sizeof(m_restarts) / sizeof(NdbRestart);
  185. const NdbRestarts::NdbErrorInsert NdbRestarts::m_errors[] = {
  186.   NdbErrorInsert("Error9999", 9999)
  187. };
  188. const int NdbRestarts::m_NoOfErrors = sizeof(m_errors) / sizeof(NdbErrorInsert);
  189. NdbRestarts::NdbRestart::NdbRestart(const char* _name,
  190.     NdbRestartType _type,
  191.     restartFunc* _func,
  192.     int _requiredNodes,
  193.     int _arg1){
  194.   m_name = _name;
  195.   m_type = _type;
  196.   m_restartFunc = _func;
  197.   m_numRequiredNodes = _requiredNodes;
  198.   //  m_arg1 = arg1;
  199. }
  200. int NdbRestarts::getNumRestarts(){
  201.   return m_NoOfRestarts;
  202. }
  203. const NdbRestarts::NdbRestart* NdbRestarts::getRestart(int _num){
  204.   if (_num >= m_NoOfRestarts)
  205.     return NULL;
  206.   return &m_restarts[_num];
  207. }
  208. const NdbRestarts::NdbRestart* NdbRestarts::getRestart(const char* _name){
  209.   for(int i = 0; i < m_NoOfRestarts; i++){
  210.     if (strcmp(m_restarts[i].m_name, _name) == 0){
  211.       return &m_restarts[i];
  212.     }
  213.   }
  214.   g_err << "The restart ""<< _name << "" not found in NdbRestarts" << endl;
  215.   return NULL;
  216. }
  217. int NdbRestarts::executeRestart(const NdbRestarts::NdbRestart* _restart, 
  218. unsigned int _timeout){
  219.   // Check that there are enough nodes in the cluster
  220.   // for this test
  221.   NdbRestarter restarter;
  222.   if (_restart->m_numRequiredNodes > restarter.getNumDbNodes()){
  223.     g_err << "This test requires " << _restart->m_numRequiredNodes << " nodes "
  224.   << "there are only "<< restarter.getNumDbNodes() <<" nodes in cluster" 
  225.   << endl;
  226.     return NDBT_OK;
  227.   }
  228.   if (restarter.waitClusterStarted(120) != 0){
  229.     // If cluster is not started when we shall peform restart
  230.     // the restart can not be executed and the test fails
  231.     return NDBT_FAILED;
  232.   }
  233.   
  234.   int res = _restart->m_restartFunc(restarter, _restart);
  235.   // Sleep a little waiting for nodes to react to command
  236.   NdbSleep_SecSleep(2);
  237.   if  (_timeout == 0){
  238.     // If timeout == 0 wait for ever
  239.     while(restarter.waitClusterStarted(60) != 0)
  240.       g_err << "Cluster is not started after restart. Waiting 60s more..." 
  241.     << endl;
  242.   } else {
  243.     if (restarter.waitClusterStarted(_timeout) != 0){
  244.       g_err<<"Cluster failed to start" << endl;
  245.       res = NDBT_FAILED; 
  246.     }
  247.   }
  248.   return res;
  249. int NdbRestarts::executeRestart(int _num,
  250. unsigned int _timeout){
  251.   const NdbRestarts::NdbRestart* r = getRestart(_num);
  252.   if (r == NULL)
  253.     return NDBT_FAILED;
  254.   int res = executeRestart(r, _timeout);
  255.   return res;
  256. }
  257. int NdbRestarts::executeRestart(const char* _name,
  258. unsigned int _timeout){
  259.   const NdbRestarts::NdbRestart* r = getRestart(_name);
  260.   if (r == NULL)
  261.     return NDBT_FAILED;
  262.   int res = executeRestart(r, _timeout);
  263.   return res;
  264. }
  265. void NdbRestarts::listRestarts(NdbRestartType _type){
  266.   for(int i = 0; i < m_NoOfRestarts; i++){
  267.     if (m_restarts[i].m_type == _type)
  268.       ndbout << " " << m_restarts[i].m_name << ", min " 
  269.      << m_restarts[i].m_numRequiredNodes 
  270.      << " nodes"<< endl;
  271.   }  
  272. }
  273. void NdbRestarts::listRestarts(){
  274.   ndbout << "NODE RESTARTS" << endl;
  275.   listRestarts(NODE_RESTART);
  276.   ndbout << "MULTIPLE NODE RESTARTS" << endl;
  277.   listRestarts(MULTIPLE_NODE_RESTART);
  278.   ndbout << "SYSTEM RESTARTS" << endl;
  279.   listRestarts(SYSTEM_RESTART);  
  280. }
  281. NdbRestarts::NdbErrorInsert::NdbErrorInsert(const char* _name,
  282.     int _errorNo){
  283.   
  284.   m_name = _name;
  285.   m_errorNo = _errorNo;
  286. }
  287. int NdbRestarts::getNumErrorInserts(){
  288.   return m_NoOfErrors;
  289. }
  290. const NdbRestarts::NdbErrorInsert* NdbRestarts::getError(int _num){
  291.   if (_num >= m_NoOfErrors)
  292.     return NULL;
  293.   return &m_errors[_num];
  294. }
  295. const NdbRestarts::NdbErrorInsert* NdbRestarts::getRandomError(){
  296.   int randomId = myRandom48(m_NoOfErrors);
  297.   return &m_errors[randomId];
  298. }
  299. /**
  300.  *
  301.  * IMPLEMENTATION OF THE DIFFERENT RESTARTS
  302.  * Each function should perform it's action
  303.  * and the returned NDBT_OK or NDBT_FAILED
  304.  *
  305.  */
  306. #define CHECK(b, m) { int _xx = b; if (!(_xx)) { 
  307.   ndbout << "ERR: "<< m 
  308.            << "   " << "File: " << __FILE__ 
  309.            << " (Line: " << __LINE__ << ")" << "- " << _xx << endl; 
  310.   return NDBT_FAILED; } }
  311. int restartRandomNodeGraceful(NdbRestarter& _restarter, 
  312.       const NdbRestarts::NdbRestart* _restart){
  313.   myRandom48Init(NdbTick_CurrentMillisecond());
  314.   int randomId = myRandom48(_restarter.getNumDbNodes());
  315.   int nodeId = _restarter.getDbNodeId(randomId);
  316.   
  317.   g_info << _restart->m_name << ": node = "<<nodeId << endl;
  318.   CHECK(_restarter.restartOneDbNode(nodeId) == 0, 
  319. "Could not restart node "<<nodeId);
  320.   return NDBT_OK;
  321. }
  322. int restartRandomNodeAbort(NdbRestarter& _restarter, 
  323.       const NdbRestarts::NdbRestart* _restart){
  324.   myRandom48Init(NdbTick_CurrentMillisecond());
  325.   int randomId = myRandom48(_restarter.getNumDbNodes());
  326.   int nodeId = _restarter.getDbNodeId(randomId);
  327.   
  328.   g_info << _restart->m_name << ": node = "<<nodeId << endl;
  329.   CHECK(_restarter.restartOneDbNode(nodeId, false, false, true) == 0, 
  330. "Could not restart node "<<nodeId);
  331.   return NDBT_OK;
  332. }
  333. int restartRandomNodeError(NdbRestarter& _restarter, 
  334.    const NdbRestarts::NdbRestart* _restart){
  335.   myRandom48Init(NdbTick_CurrentMillisecond());
  336.   int randomId = myRandom48(_restarter.getNumDbNodes());
  337.   int nodeId = _restarter.getDbNodeId(randomId);
  338.   
  339.   ndbout << _restart->m_name << ": node = "<<nodeId << endl;
  340.   CHECK(_restarter.insertErrorInNode(nodeId, 9999) == 0, 
  341. "Could not restart node "<<nodeId);
  342.   return NDBT_OK;
  343. }
  344. int restartMasterNodeError(NdbRestarter& _restarter, 
  345.    const NdbRestarts::NdbRestart* _restart){
  346.   int nodeId = _restarter.getDbNodeId(0);
  347.   
  348.   g_info << _restart->m_name << ": node = "<<nodeId << endl;
  349.   CHECK(_restarter.insertErrorInNode(nodeId, 39999) == 0, 
  350. "Could not restart node "<<nodeId);
  351.   return NDBT_OK;
  352. }
  353. int restartRandomNodeInitial(NdbRestarter& _restarter, 
  354.      const NdbRestarts::NdbRestart* _restart){
  355.   myRandom48Init(NdbTick_CurrentMillisecond());
  356.   int randomId = myRandom48(_restarter.getNumDbNodes());
  357.   int nodeId = _restarter.getDbNodeId(randomId);
  358.   
  359.   g_info << _restart->m_name << ": node = "<<nodeId << endl;
  360.   CHECK(_restarter.restartOneDbNode(nodeId, true) == 0,
  361. "Could not restart node "<<nodeId);
  362.   return NDBT_OK;
  363. }
  364. int twoNodeFailure(NdbRestarter& _restarter, 
  365.    const NdbRestarts::NdbRestart* _restart){
  366.   myRandom48Init(NdbTick_CurrentMillisecond());
  367.   int randomId = myRandom48(_restarter.getNumDbNodes());
  368.   int nodeId = _restarter.getDbNodeId(randomId);  
  369.   g_info << _restart->m_name << ": node = "<< nodeId << endl;
  370.   CHECK(_restarter.insertErrorInNode(nodeId, 9999) == 0,
  371. "Could not restart node "<< nodeId);
  372.     // Create random value, max 10 secs
  373.   int max = 10;
  374.   int seconds = (myRandom48(max)) + 1;   
  375.   g_info << "Waiting for " << seconds << "(" << max 
  376.  << ") secs " << endl;
  377.   NdbSleep_SecSleep(seconds);
  378.   randomId = (rand() % _restarter.getNumDbNodes());
  379.   nodeId = _restarter.getDbNodeId(randomId);  
  380.   g_info << _restart->m_name << ": node = "<< nodeId << endl;
  381.   CHECK(_restarter.insertErrorInNode(nodeId, 9999) == 0,
  382. "Could not restart node "<< nodeId);
  383.   return NDBT_OK;
  384. }
  385. int twoMasterNodeFailure(NdbRestarter& _restarter, 
  386.  const NdbRestarts::NdbRestart* _restart){
  387.   int nodeId = _restarter.getDbNodeId(0);  
  388.   g_info << _restart->m_name << ": node = "<< nodeId << endl;
  389.   CHECK(_restarter.insertErrorInNode(nodeId, 39999) == 0,
  390. "Could not restart node "<< nodeId);
  391.   // Create random value, max 10 secs
  392.   int max = 10;
  393.   int seconds = (myRandom48(max)) + 1;   
  394.   g_info << "Waiting for " << seconds << "(" << max 
  395.  << ") secs " << endl;
  396.   NdbSleep_SecSleep(seconds);
  397.   nodeId = _restarter.getDbNodeId(0);  
  398.   g_info << _restart->m_name << ": node = "<< nodeId << endl;
  399.   CHECK(_restarter.insertErrorInNode(nodeId, 39999) == 0,
  400. "Could not restart node "<< nodeId);
  401.   return NDBT_OK;
  402. }
  403. int get50PercentOfNodes(NdbRestarter& restarter, 
  404. int * _nodes){
  405.   // For now simply return all nodes with even node id
  406.   // TODO Check nodegroup and return one node from each 
  407.   int num50Percent = restarter.getNumDbNodes() / 2;
  408.   assert(num50Percent <= MAX_NDB_NODES);
  409.   // Calculate which nodes to stop, select all even nodes
  410.   for (int i = 0; i < num50Percent; i++){
  411.     _nodes[i] = restarter.getDbNodeId(i*2);
  412.   }
  413.   return num50Percent;
  414. }
  415. int fiftyPercentFail(NdbRestarter& _restarter, 
  416.     const NdbRestarts::NdbRestart* _restart){
  417.   int nodes[MAX_NDB_NODES];
  418.   int numNodes = get50PercentOfNodes(_restarter, nodes);
  419.   
  420.   // Stop the nodes, with nostart and abort
  421.   for (int i = 0; i < numNodes; i++){
  422.     g_info << "Stopping node "<< nodes[i] << endl;
  423.     int res = _restarter.restartOneDbNode(nodes[i], false, true, true);
  424.     CHECK(res == 0, "Could not stop node: "<< nodes[i]);
  425.   }
  426.   CHECK(_restarter.waitNodesNoStart(nodes, numNodes) == 0, 
  427. "waitNodesNoStart");
  428.   // Order all nodes to start 
  429.   ndbout << "Starting all nodes" << endl;
  430.   CHECK(_restarter.startAll() == 0,
  431. "Could not start all nodes");
  432.   return NDBT_OK;
  433. }
  434. int restartAllNodesGracfeul(NdbRestarter& _restarter, 
  435.     const NdbRestarts::NdbRestart* _restart){
  436.   g_info << _restart->m_name  << endl;
  437.   // Restart graceful
  438.   CHECK(_restarter.restartAll() == 0,
  439. "Could not restart all nodes");
  440.   return NDBT_OK;
  441. }
  442. int restartAllNodesAbort(NdbRestarter& _restarter, 
  443.  const NdbRestarts::NdbRestart* _restart){
  444.   
  445.   g_info << _restart->m_name  << endl;
  446.   // Restart abort
  447.   CHECK(_restarter.restartAll(false, false, true) == 0,
  448. "Could not restart all nodes");
  449.   return NDBT_OK;
  450. }
  451. int restartAllNodesError9999(NdbRestarter& _restarter, 
  452.      const NdbRestarts::NdbRestart* _restart){
  453.   
  454.   g_info << _restart->m_name <<  endl;
  455.   // Restart with error insert
  456.   CHECK(_restarter.insertErrorInAllNodes(9999) == 0,
  457. "Could not restart all nodes ");
  458.   return NDBT_OK;
  459. }
  460. int fiftyPercentStopAndWait(NdbRestarter& _restarter, 
  461.     const NdbRestarts::NdbRestart* _restart){
  462.   int nodes[MAX_NDB_NODES];
  463.   int numNodes = get50PercentOfNodes(_restarter, nodes);
  464.   // Stop the nodes, with nostart and abort
  465.   for (int i = 0; i < numNodes; i++){
  466.     g_info << "Stopping node "<<nodes[i] << endl;
  467.     int res = _restarter.restartOneDbNode(nodes[i], false, true, true);
  468.     CHECK(res == 0, "Could not stop node: "<< nodes[i]);
  469.   }
  470.   CHECK(_restarter.waitNodesNoStart(nodes, numNodes) == 0, 
  471. "waitNodesNoStart");
  472.   // Create random value, max 120 secs
  473.   int max = 120;
  474.   int seconds = (myRandom48(max)) + 1;   
  475.   g_info << "Waiting for " << seconds << "(" << max 
  476.  << ") secs " << endl;
  477.   NdbSleep_SecSleep(seconds);  
  478.   // Restart graceful
  479.   CHECK(_restarter.restartAll() == 0,
  480. "Could not restart all nodes");
  481.   g_info << _restart->m_name <<  endl;
  482.   return NDBT_OK;
  483. }
  484. int
  485. NFDuringNR_codes[] = {
  486.   7121,
  487.   5027,
  488.   7172,
  489.   6000,
  490.   6001,
  491.   6002,
  492.   7171,
  493.   7130,
  494.   7133,
  495.   7138,
  496.   7154,
  497.   7144,
  498.   5026,
  499.   7139,
  500.   7132,
  501.   //LCP
  502.   8000,
  503.   8001,
  504.   5010,
  505.   7022,
  506.   7024,
  507.   7016,
  508.   7017,
  509.   5002
  510. };
  511. int restartNFDuringNR(NdbRestarter& _restarter, 
  512.    const NdbRestarts::NdbRestart* _restart){
  513.   myRandom48Init(NdbTick_CurrentMillisecond());
  514.   int i;
  515.   const int sz = sizeof(NFDuringNR_codes)/sizeof(NFDuringNR_codes[0]);
  516.   for(i = 0; i<sz; i++){
  517.     int randomId = myRandom48(_restarter.getNumDbNodes());
  518.     int nodeId = _restarter.getDbNodeId(randomId);
  519.     int error = NFDuringNR_codes[i];
  520.     
  521.     g_info << _restart->m_name << ": node = " << nodeId 
  522.    << " error code = " << error << endl;
  523.     
  524.     CHECK(_restarter.restartOneDbNode(nodeId, false, true, true) == 0,
  525.   "Could not restart node "<< nodeId);
  526.     
  527.     CHECK(_restarter.waitNodesNoStart(&nodeId, 1) == 0,
  528.   "waitNodesNoStart failed");
  529.     
  530.     int val = DumpStateOrd::CmvmiSetRestartOnErrorInsert;
  531.     CHECK(_restarter.dumpStateOneNode(nodeId, &val, 1) == 0,
  532.   "failed to set RestartOnErrorInsert");
  533.     
  534.     CHECK(_restarter.insertErrorInNode(nodeId, error) == 0,
  535.   "failed to set error insert");
  536.    
  537.     CHECK(_restarter.startNodes(&nodeId, 1) == 0,
  538.   "failed to start node");
  539.     NdbSleep_SecSleep(3);
  540.     //CHECK(_restarter.waitNodesNoStart(&nodeId, 1) == 0,
  541.     //  "waitNodesNoStart failed");
  542.     _restarter.waitNodesNoStart(&nodeId, 1);
  543.     CHECK(_restarter.startNodes(&nodeId, 1) == 0,
  544.   "failed to start node");
  545.     
  546.     CHECK(_restarter.waitNodesStarted(&nodeId, 1) == 0,
  547.   "waitNodesStarted failed");
  548.   }
  549.   return NDBT_OK;
  550.   
  551.   if(_restarter.getNumDbNodes() < 4)
  552.     return NDBT_OK;
  553.   char buf[256];
  554.   if(NdbEnv_GetEnv("USER", buf, 256) == 0 || strcmp(buf, "ejonore") != 0)
  555.     return NDBT_OK;
  556.   
  557.   for(i = 0; i<sz; i++){
  558.     const int randomId = myRandom48(_restarter.getNumDbNodes());
  559.     int nodeId = _restarter.getDbNodeId(randomId);
  560.     const int error = NFDuringNR_codes[i];
  561.     
  562.     const int masterNodeId = _restarter.getMasterNodeId();
  563.     CHECK(masterNodeId > 0, "getMasterNodeId failed");
  564.     int crashNodeId = 0;
  565.     do {
  566.       int rand = myRandom48(1000);
  567.       crashNodeId = _restarter.getRandomNodeOtherNodeGroup(nodeId, rand);
  568.     } while(crashNodeId == masterNodeId);
  569.     CHECK(crashNodeId > 0, "getMasterNodeId failed");
  570.     g_info << _restart->m_name << " restarting node = " << nodeId 
  571.    << " error code = " << error 
  572.    << " crash node = " << crashNodeId << endl;
  573.     
  574.     CHECK(_restarter.restartOneDbNode(nodeId, false, true, true) == 0,
  575.   "Could not restart node "<< nodeId);
  576.     
  577.     CHECK(_restarter.waitNodesNoStart(&nodeId, 1) == 0,
  578.   "waitNodesNoStart failed");
  579.         
  580.     int val = DumpStateOrd::CmvmiSetRestartOnErrorInsert;
  581.     CHECK(_restarter.dumpStateOneNode(crashNodeId, &val, 2) == 0,
  582.   "failed to set RestartOnErrorInsert");
  583.     
  584.     CHECK(_restarter.insertErrorInNode(crashNodeId, error) == 0,
  585.   "failed to set error insert");
  586.    
  587.     CHECK(_restarter.startNodes(&nodeId, 1) == 0,
  588.   "failed to start node");
  589.     CHECK(_restarter.waitClusterStarted() == 0,
  590.   "waitClusterStarted failed");
  591.   }
  592.   return NDBT_OK;
  593. }
  594. int
  595. NRDuringLCP_Master_codes[] = {
  596.   7009, // Insert system error in master when local checkpoint is idle.
  597.   7010, // Insert system error in master when local checkpoint is in the
  598.         // state clcpStatus = CALCULATE_KEEP_GCI.
  599.   7013, // Insert system error in master when local checkpoint is in the
  600.         // state clcpStatus = COPY_GCI before sending COPY_GCIREQ.
  601.   7014, // Insert system error in master when local checkpoint is in the
  602.         // state clcpStatus = TC_CLOPSIZE before sending TC_CLOPSIZEREQ.
  603.   7015, // Insert system error in master when local checkpoint is in the
  604.         // state clcpStatus = START_LCP_ROUND before sending START_LCP_ROUND.
  605.   7019, // Insert system error in master when local checkpoint is in the
  606.         // state clcpStatus = IDLE before sending CONTINUEB(ZCHECK_TC_COUNTER).
  607.   7075, // Master. Don't send any LCP_FRAG_ORD(last=true)
  608.         // And crash when all have "not" been sent
  609.   7021, // Crash in  master when receiving START_LCP_REQ
  610.   7023, // Crash in  master when sending START_LCP_CONF
  611.   7025, // Crash in  master when receiving LCP_FRAG_REP
  612.   7026, // Crash in  master when changing state to LCP_TAB_COMPLETED 
  613.   7027  // Crash in  master when changing state to LCP_TAB_SAVED
  614. };
  615. int
  616. NRDuringLCP_NonMaster_codes[] = {
  617.   7020, // Insert system error in local checkpoint participant at reception 
  618.         // of COPY_GCIREQ.
  619.   8000, // Crash particpant when receiving TCGETOPSIZEREQ
  620.   8001, // Crash particpant when receiving TC_CLOPSIZEREQ
  621.   5010, // Crash any when receiving LCP_FRAGORD
  622.   7022, // Crash in !master when receiving START_LCP_REQ
  623.   7024, // Crash in !master when sending START_LCP_CONF
  624.   7016, // Crash in !master when receiving LCP_FRAG_REP
  625.   7017, // Crash in !master when changing state to LCP_TAB_COMPLETED 
  626.   7018  // Crash in !master when changing state to LCP_TAB_SAVED
  627. };
  628. int restartNodeDuringLCP(NdbRestarter& _restarter, 
  629.  const NdbRestarts::NdbRestart* _restart) {
  630.   int i;
  631.   // Master
  632.   int val = DumpStateOrd::DihMinTimeBetweenLCP;
  633.   CHECK(_restarter.dumpStateAllNodes(&val, 1) == 0,
  634. "Failed to set LCP to min value"); // Set LCP to min val
  635.   int sz = sizeof(NRDuringLCP_Master_codes)/
  636.            sizeof(NRDuringLCP_Master_codes[0]);
  637.   for(i = 0; i<sz; i++) {
  638.     int error = NRDuringLCP_Master_codes[i];
  639.     int masterNodeId = _restarter.getMasterNodeId();
  640.     CHECK(masterNodeId > 0, "getMasterNodeId failed");
  641.     ndbout << _restart->m_name << " restarting master node = " << masterNodeId 
  642.    << " error code = " << error << endl;
  643.     {
  644.       int val = DumpStateOrd::CmvmiSetRestartOnErrorInsert;
  645.       CHECK(_restarter.dumpStateAllNodes(&val, 1) == 0,
  646.     "failed to set RestartOnErrorInsert");
  647.     }
  648.     CHECK(_restarter.insertErrorInNode(masterNodeId, error) == 0,
  649.   "failed to set error insert");
  650.     CHECK(_restarter.waitNodesNoStart(&masterNodeId, 1, 300) == 0,
  651.       "failed to wait no start");
  652.     CHECK(_restarter.startNodes(&masterNodeId, 1) == 0,
  653.   "failed to start node");
  654.     CHECK(_restarter.waitClusterStarted(300) == 0,
  655.   "waitClusterStarted failed");
  656.     {
  657.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  658.       CHECK(_restarter.dumpStateOneNode(masterNodeId, &val, 1) == 0,
  659.     "failed to set error insert");
  660.     }
  661.   }
  662.   // NON-Master
  663.   sz = sizeof(NRDuringLCP_NonMaster_codes)/
  664.        sizeof(NRDuringLCP_NonMaster_codes[0]);
  665.   for(i = 0; i<sz; i++) {
  666.     int error = NRDuringLCP_NonMaster_codes[i];
  667.     int nodeId = getRandomNodeId(_restarter);
  668.     int masterNodeId = _restarter.getMasterNodeId();
  669.     CHECK(masterNodeId > 0, "getMasterNodeId failed");
  670.     while (nodeId == masterNodeId) {
  671.       nodeId = getRandomNodeId(_restarter);
  672.     }
  673.     ndbout << _restart->m_name << " restarting non-master node = " << nodeId
  674.    << " error code = " << error << endl;
  675.     int val = DumpStateOrd::CmvmiSetRestartOnErrorInsert;
  676.     CHECK(_restarter.dumpStateAllNodes(&val, 1) == 0,
  677.   "failed to set RestartOnErrorInsert");
  678.     
  679.     CHECK(_restarter.insertErrorInNode(nodeId, error) == 0,
  680.   "failed to set error insert");
  681.     CHECK(_restarter.waitNodesNoStart(&nodeId, 1, 300) == 0,
  682.       "failed to wait no start");
  683.     CHECK(_restarter.startNodes(&nodeId, 1) == 0,
  684.   "failed to start node");
  685.     CHECK(_restarter.waitClusterStarted(300) == 0,
  686.   "waitClusterStarted failed");
  687.     {
  688.       int val = DumpStateOrd::DihMinTimeBetweenLCP;
  689.       CHECK(_restarter.dumpStateOneNode(nodeId, &val, 1) == 0,
  690.     "failed to set error insert");
  691.     }
  692.   }
  693.   return NDBT_OK;
  694. }
  695. int stopOnError(NdbRestarter& _restarter, 
  696. const NdbRestarts::NdbRestart* _restart){
  697.   myRandom48Init(NdbTick_CurrentMillisecond());
  698.   int randomId = myRandom48(_restarter.getNumDbNodes());
  699.   int nodeId = _restarter.getDbNodeId(randomId);
  700.   
  701.   do {
  702.     g_info << _restart->m_name << ": node = " << nodeId 
  703.    << endl;
  704.     
  705.     CHECK(_restarter.waitClusterStarted(300) == 0,
  706.   "waitClusterStarted failed");
  707.     
  708.     int val = DumpStateOrd::NdbcntrTestStopOnError;
  709.     CHECK(_restarter.dumpStateOneNode(nodeId, &val, 1) == 0,
  710.   "failed to set NdbcntrTestStopOnError");
  711.     
  712.     NdbSleep_SecSleep(3);
  713.     
  714.     CHECK(_restarter.waitClusterStarted(300) == 0,
  715.   "waitClusterStarted failed");
  716.   } while (false);
  717.   
  718.   return NDBT_OK;
  719. }
  720. int getRandomNodeId(NdbRestarter& _restarter) {
  721.   myRandom48Init(NdbTick_CurrentMillisecond());
  722.   int randomId = myRandom48(_restarter.getNumDbNodes());
  723.   int nodeId = _restarter.getDbNodeId(randomId);
  724.   return nodeId;
  725. }