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

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 <string.h>
  14. #include <NdbMain.h>
  15. #include <OutputStream.hpp>
  16. #include <NdbOut.hpp>
  17. #include <NdbSleep.h>
  18. #include <getarg.h>
  19. #include <NdbRestarter.hpp>
  20. #include <NDBT.hpp>
  21. int main(int argc, const char** argv){
  22.   ndb_init();
  23.   const char* _hostName = NULL;
  24.   int _loops = 10;
  25.   int _wait = 15;
  26.   int _help = 0;
  27. #if 0
  28.   int _crash = 0;
  29.   int _abort = 0;
  30. #endif
  31.   struct getargs args[] = {
  32.     { "seconds", 's', arg_integer, &_wait, "Seconds to wait between each restart(0=random)", "secs" },
  33.     { "loops", 'l', arg_integer, &_loops, "Number of loops", "loops 0=forever"},
  34. #if 0 
  35.     // Not yet!
  36.     { "abort", 'a', arg_flag, &_abort, "Restart abort"},
  37.     { "crash", 'c', arg_flag, &_crash, "Crash instead of restart"},
  38. #endif
  39.     { "usage", '?', arg_flag, &_help, "Print help", "" }
  40.     
  41.   };
  42.   int num_args = sizeof(args) / sizeof(args[0]);
  43.   int optind = 0;
  44.   char desc[] = 
  45.     "hostname:portn"
  46.     "This program will connect to the mgmsrv of a NDB cluster.n"
  47.     "It will wait for all nodes to be started, then restart all nodesn"
  48.     "into nostart state. Then after a random delay it will tell all nodesn"
  49.     "to start. It will do this loop number of timesn";
  50.   if(getarg(args, num_args, argc, argv, &optind) || _help) {
  51.     arg_printusage(args, num_args, argv[0], desc);
  52.     return NDBT_ProgramExit(NDBT_WRONGARGS);
  53.   }
  54.   _hostName = argv[optind];
  55.   
  56.   NdbRestarter restarter(_hostName);
  57. #if 0  
  58.   if(_abort && _crash){
  59.     g_err << "You can't specify both abort and crash" << endl;
  60.     arg_printusage(args, num_args, argv[0], desc);
  61.     return NDBT_ProgramExit(NDBT_WRONGARGS);
  62.   }
  63.   if(_abort){
  64.     restarter.setRestartType(NdbRestarter::AbortRestart);
  65.   }
  66.   if(_crash){
  67.     restarter.setRestartType(NdbRestarter::Crash);
  68.   }
  69. #endif
  70.   int l = 0;
  71.   while (_loops == 0 || l<_loops){
  72.     g_info << "Waiting for cluster to start" << endl;
  73.     while(restarter.waitClusterStarted(120) != 0){
  74.       g_warning << "Ndb failed to start in 2 minutes" << endl;
  75.     }
  76.     
  77.     int seconds = _wait;
  78.     if(seconds==0)
  79.       seconds = (rand() % 120) + 1; // Create random value max 120 secs
  80.     g_info << "Waiting for "<<seconds<<" secs" << endl;
  81.     NdbSleep_SecSleep(seconds);
  82.     g_info << l << ": restarting all nodes with nostart" << endl;
  83.     const bool b = (restarter.restartAll(false, true, false) == 0);
  84.     assert(b);
  85.     
  86.     g_info << "Waiting for cluster to enter nostart" << endl;
  87.     while(restarter.waitClusterNoStart(120) != 0){
  88.       g_warning << "Ndb failed to enter no start in 2 minutes" << endl;
  89.     }
  90.     seconds = _wait;
  91.     if(seconds==0)
  92.       seconds = (rand() % 120) + 1; // Create random value max 120 secs
  93.     g_info << "Waiting for " <<seconds<<" secs" << endl;
  94.     NdbSleep_SecSleep(seconds);
  95.     g_info << l << ": Telling all nodes to start" << endl;
  96.     const bool b2 = (restarter.startAll() == 0);
  97.     assert(b2);
  98.     l++;
  99.   }
  100.   return NDBT_ProgramExit(NDBT_OK);
  101. }