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

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 <ndb_global.h>
  14. #include <ndb_opts.h>
  15. #include "MgmtSrvr.hpp"
  16. #include "EventLogger.hpp"
  17. #include <Config.hpp>
  18. #include "InitConfigFileParser.hpp"
  19. #include <SocketServer.hpp>
  20. #include "Services.hpp"
  21. #include <version.h>
  22. #include <kernel_types.h>
  23. #include <Properties.hpp>
  24. #include <NdbOut.hpp>
  25. #include <NdbMain.h>
  26. #include <NdbDaemon.h>
  27. #include <NdbConfig.h>
  28. #include <NdbHost.h>
  29. #include <ndb_version.h>
  30. #include <ConfigRetriever.hpp>
  31. #include <mgmapi_config_parameters.h>
  32. #include <NdbAutoPtr.hpp>
  33. #if defined NDB_OSE || defined NDB_SOFTOSE
  34. #include <efs.h>
  35. #else
  36. #include "CommandInterpreter.hpp"
  37. #endif
  38. #undef DEBUG
  39. #define DEBUG(x) ndbout << x << endl;
  40. const char progname[] = "mgmtsrvr";
  41. /**
  42.  * @struct  MgmGlobals
  43.  * @brief   Global Variables used in the management server
  44.  ******************************************************************************/
  45. /** Command line arguments  */
  46. static int opt_daemon;   // NOT bool, bool need not be int
  47. static int opt_non_interactive;
  48. static int opt_interactive;
  49. static const char * opt_config_filename= 0;
  50.   
  51. struct MgmGlobals {
  52.   MgmGlobals();
  53.   ~MgmGlobals();
  54.   
  55.   /** Stuff found in environment or in local config  */
  56.   NodeId localNodeId;
  57.   bool use_specific_ip;
  58.   char * interface_name;
  59.   int port;
  60.   
  61.   /** The Mgmt Server */
  62.   MgmtSrvr * mgmObject;
  63.   
  64.   /** The Socket Server */
  65.   SocketServer * socketServer;
  66. };
  67. int g_no_nodeid_checks= 0;
  68. int g_print_full_config;
  69. static MgmGlobals *glob= 0;
  70. /******************************************************************************
  71.  * Function prototypes
  72.  ******************************************************************************/
  73. /**
  74.  * Global variables
  75.  */
  76. bool g_StopServer;
  77. extern EventLogger g_eventLogger;
  78. extern int global_mgmt_server_check;
  79. enum ndb_mgmd_options {
  80.   OPT_INTERACTIVE = NDB_STD_OPTIONS_LAST,
  81.   OPT_NO_NODEID_CHECKS,
  82.   OPT_NO_DAEMON
  83. };
  84. NDB_STD_OPTS_VARS;
  85. #if NDB_VERSION_MAJOR <= 4
  86. #undef OPT_NDB_CONNECTSTRING
  87. #define OPT_NDB_CONNECTSTRING 1023
  88. #else
  89. #endif
  90. static struct my_option my_long_options[] =
  91. {
  92.   NDB_STD_OPTS("ndb_mgmd"),
  93.   { "config-file", 'f', "Specify cluster configuration file",
  94.     (gptr*) &opt_config_filename, (gptr*) &opt_config_filename, 0,
  95.     GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
  96.   { "print-full-config", 'P', "Print full config and exit",
  97.     (gptr*) &g_print_full_config, (gptr*) &g_print_full_config, 0,
  98.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
  99.   { "daemon", 'd', "Run ndb_mgmd in daemon mode (default)",
  100.     (gptr*) &opt_daemon, (gptr*) &opt_daemon, 0,
  101.     GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0 },
  102.   { "interactive", OPT_INTERACTIVE,
  103.     "Run interactive. Not supported but provided for testing purposes",
  104.     (gptr*) &opt_interactive, (gptr*) &opt_interactive, 0,
  105.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
  106.   { "no-nodeid-checks", OPT_NO_NODEID_CHECKS,
  107.     "Do not provide any node id checks", 
  108.     (gptr*) &g_no_nodeid_checks, (gptr*) &g_no_nodeid_checks, 0,
  109.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
  110.   { "nodaemon", OPT_NO_DAEMON,
  111.     "Don't run as daemon, but don't read from stdin",
  112.     (gptr*) &opt_non_interactive, (gptr*) &opt_non_interactive, 0,
  113.     GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
  114. #if NDB_VERSION_MAJOR <= 4
  115.   { "config-file", 'c',
  116.     "-c provided for backwards compatability, will be removed in 5.0."
  117.     " Use -f instead",
  118.     (gptr*) &opt_config_filename, (gptr*) &opt_config_filename, 0,
  119.     GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
  120. #endif
  121.   { 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
  122. };
  123. static void short_usage_sub(void)
  124. {
  125.   printf("Usage: %s [OPTIONS]n", my_progname);
  126. }
  127. static void usage()
  128. {
  129.   short_usage_sub();
  130.   ndb_std_print_version();
  131.   my_print_help(my_long_options);
  132.   my_print_variables(my_long_options);
  133. }
  134. static my_bool
  135. get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
  136.        char *argument)
  137. {
  138.   ndb_std_get_one_option(optid, opt, argument ? argument :
  139.  "d:t:O,/tmp/ndb_mgmd.trace");
  140. #if NDB_VERSION_MAJOR <= 4
  141.   switch (optid) {
  142.   case 'c':
  143.     printf("Warning: -c will be removed in 5.0, use -f insteadn");
  144.     break;
  145.   }
  146. #endif
  147.   return 0;
  148. }
  149. /*
  150.  *  MAIN 
  151.  */
  152. int main(int argc, char** argv)
  153. {
  154.   NDB_INIT(argv[0]);
  155.   glob= new MgmGlobals;
  156.   /**
  157.    * OSE specific. Enable shared ownership of file system resources. 
  158.    * This is needed in order to use the cluster log since the events 
  159.    * from the cluster is written from the 'ndb_receive'(NDBAPI) thread/process.
  160.    */
  161. #if defined NDB_OSE || defined NDB_SOFTOSE
  162.   efs_segment_share();
  163. #endif
  164.   global_mgmt_server_check = 1;
  165.   const char *load_default_groups[]= { "mysql_cluster","ndb_mgmd",0 };
  166.   load_defaults("my",load_default_groups,&argc,&argv);
  167.   int ho_error;
  168.   if ((ho_error=handle_options(&argc, &argv, my_long_options, get_one_option)))
  169.     exit(ho_error);
  170.   if (opt_interactive ||
  171.       opt_non_interactive ||
  172.       g_print_full_config) {
  173.     opt_daemon= 0;
  174.   }
  175.   glob->socketServer = new SocketServer();
  176.   MgmApiService * mapi = new MgmApiService();
  177.   glob->mgmObject = new MgmtSrvr(glob->socketServer,
  178. opt_config_filename,
  179. opt_connect_str);
  180.   if (g_print_full_config)
  181.     goto the_end;
  182.   if (glob->mgmObject->init())
  183.     goto error_end;
  184.   my_setwd(NdbConfig_get_path(0), MYF(0));
  185.   glob->localNodeId= glob->mgmObject->getOwnNodeId();
  186.   if (glob->localNodeId == 0) {
  187.     goto error_end;
  188.   }
  189.   glob->port= glob->mgmObject->getPort();
  190.   if (glob->port == 0)
  191.     goto error_end;
  192.   glob->interface_name = 0;
  193.   glob->use_specific_ip = false;
  194.   if(!glob->use_specific_ip){
  195.     int count= 5; // no of retries for tryBind
  196.     while(!glob->socketServer->tryBind(glob->port, glob->interface_name)){
  197.       if (--count > 0) {
  198. NdbSleep_MilliSleep(1000);
  199. continue;
  200.       }
  201.       ndbout_c("Unable to setup port: %s:%d!n"
  202.        "Please check if the port is already used,n"
  203.        "(perhaps a ndb_mgmd is already running),n"
  204.        "and if you are executing on the correct computer", 
  205.        (glob->interface_name ? glob->interface_name : "*"), glob->port);
  206.       goto error_end;
  207.     }
  208.     free(glob->interface_name);
  209.     glob->interface_name = 0;
  210.   }
  211.   if(!glob->socketServer->setup(mapi, glob->port, glob->interface_name)){
  212.     ndbout_c("Unable to setup management port: %d!n"
  213.      "Please check if the port is already used,n"
  214.      "(perhaps a ndb_mgmd is already running),n"
  215.      "and if you are executing on the correct computer", 
  216.      glob->port);
  217.     delete mapi;
  218.     goto error_end;
  219.   }
  220.   
  221.   if(!glob->mgmObject->check_start()){
  222.     ndbout_c("Unable to check start management server.");
  223.     ndbout_c("Probably caused by illegal initial configuration file.");
  224.     goto error_end;
  225.   }
  226.   if (opt_daemon) {
  227.     // Become a daemon
  228.     char *lockfile= NdbConfig_PidFileName(glob->localNodeId);
  229.     char *logfile=  NdbConfig_StdoutFileName(glob->localNodeId);
  230.     NdbAutoPtr<char> tmp_aptr1(lockfile), tmp_aptr2(logfile);
  231.     if (NdbDaemon_Make(lockfile, logfile, 0) == -1) {
  232.       ndbout << "Cannot become daemon: " << NdbDaemon_ErrorText << endl;
  233.       return 1;
  234.     }
  235.   }
  236. #ifndef NDB_WIN32
  237.   signal(SIGPIPE, SIG_IGN);
  238. #endif
  239.   {
  240.     BaseString error_string;
  241.     if(!glob->mgmObject->start(error_string)){
  242.       ndbout_c("Unable to start management server.");
  243.       ndbout_c("Probably caused by illegal initial configuration file.");
  244.       ndbout_c(error_string.c_str());
  245.       goto error_end;
  246.     }
  247.   }
  248.   //glob->mgmObject->saveConfig();
  249.   mapi->setMgm(glob->mgmObject);
  250.   char msg[256];
  251.   BaseString::snprintf(msg, sizeof(msg),
  252.    "NDB Cluster Management Server. %s", NDB_VERSION_STRING);
  253.   ndbout_c(msg);
  254.   g_eventLogger.info(msg);
  255.   BaseString::snprintf(msg, 256, "Id: %d, Command port: %d",
  256.    glob->localNodeId, glob->port);
  257.   ndbout_c(msg);
  258.   g_eventLogger.info(msg);
  259.   
  260.   g_StopServer = false;
  261.   glob->socketServer->startServer();
  262. #if ! defined NDB_OSE && ! defined NDB_SOFTOSE
  263.   if(opt_interactive) {
  264.     CommandInterpreter com(* glob->mgmObject);
  265.     while(com.readAndExecute());
  266.   } else 
  267. #endif
  268.     {
  269.       while(g_StopServer != true)
  270. NdbSleep_MilliSleep(500);
  271.     }
  272.   
  273.   g_eventLogger.info("Shutting down server...");
  274.   glob->socketServer->stopServer();
  275.   glob->socketServer->stopSessions(true);
  276.   g_eventLogger.info("Shutdown complete");
  277.  the_end:
  278.   delete glob;
  279.   ndb_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
  280.   return 0;
  281.  error_end:
  282.   delete glob;
  283.   ndb_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
  284.   return 1;
  285. }
  286. MgmGlobals::MgmGlobals(){
  287.   // Default values
  288.   port = 0;
  289.   interface_name = 0;
  290.   socketServer = 0;
  291.   mgmObject = 0;
  292. }
  293. MgmGlobals::~MgmGlobals(){
  294.   if (socketServer)
  295.     delete socketServer;
  296.   if (mgmObject)
  297.     delete mgmObject;
  298.   if (interface_name)
  299.     free(interface_name);
  300. }