📄 emulator.cpp
字号:
/* Copyright (C) 2003 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <ndb_global.h>#include "Emulator.hpp"#include <FastScheduler.hpp>#include <SignalLoggerManager.hpp>#include <TransporterRegistry.hpp>#include <TimeQueue.hpp>#include "Configuration.hpp"#include "WatchDog.hpp"#include "ThreadConfig.hpp"#include "SimBlockList.hpp"#include <NodeState.hpp>#include <NdbMem.h>#include <NdbMutex.h>#include <NdbSleep.h>#include <EventLogger.hpp>void childExit(int code, Uint32 currentStartPhase);void childAbort(int code, Uint32 currentStartPhase);extern "C" { extern void (* ndb_new_handler)();}extern EventLogger g_eventLogger;extern my_bool opt_core;// instantiated and updated in NdbcntrMain.cppextern Uint32 g_currentStartPhase;/** * Declare the global variables */#ifndef NO_EMULATED_JAMUint8 theEmulatedJam[EMULATED_JAM_SIZE * 4];Uint32 theEmulatedJamIndex = 0;Uint32 theEmulatedJamBlockNumber = 0;#endif GlobalData globalData; TimeQueue globalTimeQueue; FastScheduler globalScheduler; TransporterRegistry globalTransporterRegistry;#ifdef VM_TRACE SignalLoggerManager globalSignalLoggers;#endifEmulatorData globalEmulatorData;NdbMutex * theShutdownMutex = 0;int simulate_error_during_shutdown= 0;EmulatorData::EmulatorData(){ theConfiguration = 0; theWatchDog = 0; theThreadConfig = 0; theSimBlockList = 0; theShutdownMutex = 0; m_socket_server = 0;}voidndb_new_handler_impl(){ ERROR_SET(fatal, NDBD_EXIT_MEMALLOC, "New handler", "");}voidEmulatorData::create(){ NdbMem_Create(); theConfiguration = new Configuration(); theWatchDog = new WatchDog(); theThreadConfig = new ThreadConfig(); theSimBlockList = new SimBlockList(); m_socket_server = new SocketServer(); theShutdownMutex = NdbMutex_Create(); ndb_new_handler = ndb_new_handler_impl;}voidEmulatorData::destroy(){ if(theConfiguration) delete theConfiguration; theConfiguration = 0; if(theWatchDog) delete theWatchDog; theWatchDog = 0; if(theThreadConfig) delete theThreadConfig; theThreadConfig = 0; if(theSimBlockList) delete theSimBlockList; theSimBlockList = 0; if(m_socket_server) delete m_socket_server; m_socket_server = 0; NdbMutex_Destroy(theShutdownMutex); NdbMem_Destroy();}voidNdbShutdown(NdbShutdownType type, NdbRestartType restartType){ if(type == NST_ErrorInsert){ type = NST_Restart; restartType = (NdbRestartType) globalEmulatorData.theConfiguration->getRestartOnErrorInsert(); if(restartType == NRT_Default){ type = NST_ErrorHandler; globalEmulatorData.theConfiguration->stopOnError(true); } } if((type == NST_ErrorHandlerSignal) || // Signal handler has already locked mutex (NdbMutex_Trylock(theShutdownMutex) == 0)){ globalData.theRestartFlag = perform_stop; bool restart = false;#if ! ( defined NDB_OSE || defined NDB_SOFTOSE) if((type != NST_Normal && globalEmulatorData.theConfiguration->stopOnError() == false) || type == NST_Restart) { restart = true; }#endif const char * shutting = "shutting down"; if(restart){ shutting = "restarting"; } switch(type){ case NST_Normal: g_eventLogger.info("Shutdown initiated"); break; case NST_Watchdog: g_eventLogger.info("Watchdog %s system", shutting); break; case NST_ErrorHandler: g_eventLogger.info("Error handler %s system", shutting); break; case NST_ErrorHandlerSignal: g_eventLogger.info("Error handler signal %s system", shutting); break; case NST_ErrorHandlerStartup: g_eventLogger.info("Error handler startup %s system", shutting); break; case NST_Restart: g_eventLogger.info("Restarting system"); break; default: g_eventLogger.info("Error handler %s system (unknown type: %u)", shutting, (unsigned)type); type = NST_ErrorHandler; break; } const char * exitAbort = 0; if (opt_core) exitAbort = "aborting"; else exitAbort = "exiting"; if(type == NST_Watchdog){ /** * Very serious, don't attempt to free, just die!! */ g_eventLogger.info("Watchdog shutdown completed - %s", exitAbort); if (opt_core) { childAbort(-1,g_currentStartPhase); } else { childExit(-1,g_currentStartPhase); } }#ifndef NDB_WIN32 if (simulate_error_during_shutdown) { kill(getpid(), simulate_error_during_shutdown); while(true) NdbSleep_MilliSleep(10); }#endif globalEmulatorData.theWatchDog->doStop(); #ifdef VM_TRACE FILE * outputStream = globalSignalLoggers.setOutputStream(0); if(outputStream != 0) fclose(outputStream);#endif /** * Stop all transporter connection attempts and accepts */ globalEmulatorData.m_socket_server->stopServer(); globalEmulatorData.m_socket_server->stopSessions(); globalTransporterRegistry.stop_clients(); /** * Stop transporter communication with other nodes */ globalTransporterRegistry.stopSending(); globalTransporterRegistry.stopReceiving(); /** * Remove all transporters */ globalTransporterRegistry.removeAll(); #ifdef VM_TRACE#define UNLOAD (type != NST_ErrorHandler && type != NST_Watchdog)#else#define UNLOAD true#endif if(UNLOAD){ globalEmulatorData.theSimBlockList->unload(); globalEmulatorData.destroy(); } if(type != NST_Normal && type != NST_Restart){ // Signal parent that error occured during startup if (type == NST_ErrorHandlerStartup) kill(getppid(), SIGUSR1); g_eventLogger.info("Error handler shutdown completed - %s", exitAbort); if (opt_core) { childAbort(-1,g_currentStartPhase); } else { childExit(-1,g_currentStartPhase); } } /** * This is a normal restart, depend on angel */ if(type == NST_Restart){ childExit(restartType,g_currentStartPhase); } g_eventLogger.info("Shutdown completed - exiting"); } else { /** * Shutdown is already in progress */ /** * If this is the watchdog, kill system the hard way */ if (type== NST_Watchdog){ g_eventLogger.info("Watchdog is killing system the hard way");#if defined VM_TRACE && ( ! ( defined NDB_OSE || defined NDB_SOFTOSE) ) childAbort(-1,g_currentStartPhase);#else childExit(-1,g_currentStartPhase);#endif } while(true) NdbSleep_MilliSleep(10); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -