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

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 "Emulator.hpp"
  15. #include <FastScheduler.hpp>
  16. #include <SignalLoggerManager.hpp>
  17. #include <TransporterRegistry.hpp>
  18. #include <TimeQueue.hpp>
  19. #include "Configuration.hpp"
  20. #include "WatchDog.hpp"
  21. #include "ThreadConfig.hpp"
  22. #include "SimBlockList.hpp"
  23. #include <NodeState.hpp>
  24. #include <NdbMem.h>
  25. #include <NdbMutex.h>
  26. #include <NdbSleep.h>
  27. #include <EventLogger.hpp>
  28. extern "C" {
  29.   extern void (* ndb_new_handler)();
  30. }
  31. extern EventLogger g_eventLogger;
  32. extern my_bool opt_core;
  33. /**
  34.  * Declare the global variables 
  35.  */
  36. #ifndef NO_EMULATED_JAM
  37. Uint8 theEmulatedJam[EMULATED_JAM_SIZE * 4];
  38. Uint32 theEmulatedJamIndex = 0;
  39. Uint32 theEmulatedJamBlockNumber = 0;
  40. #endif
  41.    GlobalData globalData;
  42.    TimeQueue globalTimeQueue;
  43.    FastScheduler globalScheduler;
  44.    TransporterRegistry globalTransporterRegistry;
  45. #ifdef VM_TRACE
  46.    SignalLoggerManager globalSignalLoggers;
  47. #endif
  48. EmulatorData globalEmulatorData;
  49. NdbMutex * theShutdownMutex = 0;
  50. int simulate_error_during_shutdown= 0;
  51. EmulatorData::EmulatorData(){
  52.   theConfiguration = 0;
  53.   theWatchDog      = 0;
  54.   theThreadConfig  = 0;
  55.   theSimBlockList  = 0;
  56.   theShutdownMutex = 0;
  57.   m_socket_server = 0;
  58. }
  59. void
  60. ndb_new_handler_impl(){
  61.   ERROR_SET(fatal, ERR_MEMALLOC, "New handler", "");
  62. }
  63. void
  64. EmulatorData::create(){
  65.   NdbMem_Create();
  66.   theConfiguration = new Configuration();
  67.   theWatchDog      = new WatchDog();
  68.   theThreadConfig  = new ThreadConfig();
  69.   theSimBlockList  = new SimBlockList();
  70.   m_socket_server  = new SocketServer();
  71.   theShutdownMutex = NdbMutex_Create();
  72.   ndb_new_handler = ndb_new_handler_impl;
  73. }
  74. void
  75. EmulatorData::destroy(){
  76.   if(theConfiguration)
  77.     delete theConfiguration; theConfiguration = 0;
  78.   if(theWatchDog)
  79.     delete theWatchDog; theWatchDog = 0;
  80.   if(theThreadConfig)
  81.     delete theThreadConfig; theThreadConfig = 0;
  82.   if(theSimBlockList)
  83.     delete theSimBlockList; theSimBlockList = 0;
  84.   if(m_socket_server)
  85.     delete m_socket_server; m_socket_server = 0;
  86.   NdbMem_Destroy();
  87. }
  88. void
  89. NdbShutdown(NdbShutdownType type,
  90.     NdbRestartType restartType){
  91.   
  92.   if(type == NST_ErrorInsert){
  93.     type = NST_Restart;
  94.     restartType = (NdbRestartType)
  95.       globalEmulatorData.theConfiguration->getRestartOnErrorInsert();
  96.     if(restartType == NRT_Default){
  97.       type = NST_ErrorHandler;
  98.       globalEmulatorData.theConfiguration->stopOnError(true);
  99.     }
  100.   }
  101.   
  102.   if((type == NST_ErrorHandlerSignal) || // Signal handler has already locked mutex
  103.      (NdbMutex_Trylock(theShutdownMutex) == 0)){
  104.     globalData.theRestartFlag = perform_stop;
  105.     bool restart = false;
  106. #if ! ( defined NDB_OSE || defined NDB_SOFTOSE) 
  107.     if((type != NST_Normal && 
  108. globalEmulatorData.theConfiguration->stopOnError() == false) ||
  109.        type == NST_Restart) {
  110.       
  111.       restart  = true;
  112.     }
  113. #endif
  114.     
  115.     const char * shutting = "shutting down";
  116.     if(restart){
  117.       shutting = "restarting";
  118.     }
  119.     
  120.     switch(type){
  121.     case NST_Normal:
  122.       g_eventLogger.info("Shutdown initiated");
  123.       break;
  124.     case NST_Watchdog:
  125.       g_eventLogger.info("Watchdog %s system", shutting);
  126.       break;
  127.     case NST_ErrorHandler:
  128.       g_eventLogger.info("Error handler %s system", shutting);
  129.       break;
  130.     case NST_ErrorHandlerSignal:
  131.       g_eventLogger.info("Error handler signal %s system", shutting);
  132.       break;
  133.     case NST_ErrorHandlerStartup:
  134.       g_eventLogger.info("Error handler startup %s system", shutting);
  135.       break;
  136.     case NST_Restart:
  137.       g_eventLogger.info("Restarting system");
  138.       break;
  139.     default:
  140.       g_eventLogger.info("Error handler %s system (unknown type: %u)",
  141.  shutting, (unsigned)type);
  142.       type = NST_ErrorHandler;
  143.       break;
  144.     }
  145.     
  146.     const char * exitAbort = 0;
  147.     if (opt_core)
  148.       exitAbort = "aborting";
  149.     else
  150.       exitAbort = "exiting";
  151.     
  152.     if(type == NST_Watchdog){
  153.       /**
  154.        * Very serious, don't attempt to free, just die!!
  155.        */
  156.       g_eventLogger.info("Watchdog shutdown completed - %s", exitAbort);
  157.       if (opt_core)
  158.       {
  159. signal(6, SIG_DFL);
  160. abort();
  161.       }
  162.       else
  163.       {
  164. exit(-1);
  165.       }
  166.     }
  167. #ifndef NDB_WIN32
  168.     if (simulate_error_during_shutdown) {
  169.       kill(getpid(), simulate_error_during_shutdown);
  170.       while(true)
  171. NdbSleep_MilliSleep(10);
  172.     }
  173. #endif
  174.     globalEmulatorData.theWatchDog->doStop();
  175.     
  176. #ifdef VM_TRACE
  177.     FILE * outputStream = globalSignalLoggers.setOutputStream(0);
  178.     if(outputStream != 0)
  179.       fclose(outputStream);
  180. #endif
  181.     
  182.     /**
  183.      * Stop all transporter connection attempts and accepts
  184.      */
  185.     globalEmulatorData.m_socket_server->stopServer();
  186.     globalEmulatorData.m_socket_server->stopSessions();
  187.     globalTransporterRegistry.stop_clients();
  188.     /**
  189.      * Stop transporter communication with other nodes
  190.      */
  191.     globalTransporterRegistry.stopSending();
  192.     globalTransporterRegistry.stopReceiving();
  193.     
  194.     /**
  195.      * Remove all transporters
  196.      */
  197.     globalTransporterRegistry.removeAll();
  198.     
  199. #ifdef VM_TRACE
  200. #define UNLOAD (type != NST_ErrorHandler && type != NST_Watchdog)
  201. #else
  202. #define UNLOAD true
  203. #endif
  204.     if(UNLOAD){
  205.       globalEmulatorData.theSimBlockList->unload();    
  206.       globalEmulatorData.destroy();
  207.     }
  208.     
  209.     if(type != NST_Normal && type != NST_Restart){
  210.       // Signal parent that error occured during startup
  211.       if (type == NST_ErrorHandlerStartup)
  212. kill(getppid(), SIGUSR1);
  213.       g_eventLogger.info("Error handler shutdown completed - %s", exitAbort);
  214.       if (opt_core)
  215.       {
  216. signal(6, SIG_DFL);
  217. abort();
  218.       }
  219.       else
  220.       {
  221. exit(-1);
  222.       }
  223.     }
  224.     
  225.     /**
  226.      * This is a normal restart, depend on angel
  227.      */
  228.     if(type == NST_Restart){
  229.       exit(restartType);
  230.     }
  231.     
  232.     g_eventLogger.info("Shutdown completed - exiting");
  233.   } else {
  234.     /**
  235.      * Shutdown is already in progress
  236.      */
  237.     
  238.     /** 
  239.      * If this is the watchdog, kill system the hard way
  240.      */
  241.     if (type== NST_Watchdog){
  242.       g_eventLogger.info("Watchdog is killing system the hard way");
  243. #if defined VM_TRACE && ( ! ( defined NDB_OSE || defined NDB_SOFTOSE) )
  244.       signal(6, SIG_DFL);
  245.       abort();
  246. #else
  247.       exit(-1);
  248. #endif
  249.     }
  250.     
  251.     while(true)
  252.       NdbSleep_MilliSleep(10);
  253.   }
  254. }