From 42a7e96adb650e1db4da0049c06bbf140c6728da Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 30 Aug 2004 10:13:09 +0000 Subject: see resp. file ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp: adder error insert for error during shutdown ndb/src/kernel/error/ErrorHandlingMacros.hpp: seeror set method for signal handler ndb/src/kernel/main.cpp: adder error insert for error during shutdown ndb/src/kernel/vm/Emulator.cpp: adder error insert for error during shutdown + check for error handler invoked by signal handler ndb/src/kernel/vm/Emulator.hpp: enum so signal that Shatdown is invoked by signal handler --- ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp | 11 +++++++++++ ndb/src/kernel/error/ErrorHandlingMacros.hpp | 2 ++ ndb/src/kernel/main.cpp | 10 ++++++++-- ndb/src/kernel/vm/Emulator.cpp | 13 ++++++++++++- ndb/src/kernel/vm/Emulator.hpp | 1 + 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp b/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp index e1f199ac411..e2085eb612c 100644 --- a/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp +++ b/ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp @@ -46,6 +46,7 @@ // Used here only to print event reports on stdout/console. EventLogger g_eventLogger; +extern int simulate_error_during_shutdown; Cmvmi::Cmvmi(const Configuration & conf) : SimulatedBlock(CMVMI, conf) @@ -148,6 +149,16 @@ void Cmvmi::execNDB_TAMPER(Signal* signal) if(ERROR_INSERTED(9997)){ ndbrequire(false); } + + if(ERROR_INSERTED(9996)){ + simulate_error_during_shutdown= SIGSEGV; + ndbrequire(false); + } + + if(ERROR_INSERTED(9995)){ + simulate_error_during_shutdown= SIGSEGV; + kill(getpid(), SIGABRT); + } }//execNDB_TAMPER() void Cmvmi::execSET_LOGLEVELORD(Signal* signal) diff --git a/ndb/src/kernel/error/ErrorHandlingMacros.hpp b/ndb/src/kernel/error/ErrorHandlingMacros.hpp index 416507fee23..d8bb7ff759b 100644 --- a/ndb/src/kernel/error/ErrorHandlingMacros.hpp +++ b/ndb/src/kernel/error/ErrorHandlingMacros.hpp @@ -22,6 +22,8 @@ extern const char programName[]; +#define ERROR_SET_SIGNAL(messageCategory, messageID, problemData, objectRef) \ + ErrorReporter::handleError(messageCategory, messageID, problemData, objectRef, NST_ErrorHandlerSignal) #define ERROR_SET(messageCategory, messageID, problemData, objectRef) \ ErrorReporter::handleError(messageCategory, messageID, problemData, objectRef) // Description: diff --git a/ndb/src/kernel/main.cpp b/ndb/src/kernel/main.cpp index 79177e57be0..1f080b003bc 100644 --- a/ndb/src/kernel/main.cpp +++ b/ndb/src/kernel/main.cpp @@ -335,7 +335,13 @@ handler_error(int signum){ static long thread_id= 0; if (thread_id != 0 && thread_id == my_thread_id()) - ; // Shutdown thread received signal + { + // Shutdown thread received signal + signal(signum, SIG_DFL); + kill(getpid(), signum); + while(true) + NdbSleep_MilliSleep(10); + } if(theShutdownMutex && NdbMutex_Trylock(theShutdownMutex) != 0) while(true) NdbSleep_MilliSleep(10); @@ -344,5 +350,5 @@ handler_error(int signum){ // restart the system char errorData[40]; snprintf(errorData, 40, "Signal %d received", signum); - ERROR_SET(fatal, 0, errorData, __FILE__); + ERROR_SET_SIGNAL(fatal, 0, errorData, __FILE__); } diff --git a/ndb/src/kernel/vm/Emulator.cpp b/ndb/src/kernel/vm/Emulator.cpp index 75aea2bda7f..202c6547a81 100644 --- a/ndb/src/kernel/vm/Emulator.cpp +++ b/ndb/src/kernel/vm/Emulator.cpp @@ -61,6 +61,7 @@ Uint32 theEmulatedJamBlockNumber = 0; EmulatorData globalEmulatorData; NdbMutex * theShutdownMutex = 0; +int simulate_error_during_shutdown= 0; EmulatorData::EmulatorData(){ theConfiguration = 0; @@ -117,7 +118,8 @@ NdbShutdown(NdbShutdownType type, } } - if(NdbMutex_Trylock(theShutdownMutex) == 0){ + if((type == NST_ErrorHandlerSignal) || // Signal handler has already locked mutex + (NdbMutex_Trylock(theShutdownMutex) == 0)){ globalData.theRestartFlag = perform_stop; bool restart = false; @@ -145,6 +147,9 @@ NdbShutdown(NdbShutdownType type, case NST_ErrorHandler: ndbout << "Error handler " << shutting << " system" << endl; break; + case NST_ErrorHandlerSignal: + ndbout << "Error handler signal " << shutting << " system" << endl; + break; case NST_Restart: ndbout << "Restarting system" << endl; break; @@ -175,6 +180,12 @@ NdbShutdown(NdbShutdownType type, #endif } + if (simulate_error_during_shutdown) { + kill(getpid(), simulate_error_during_shutdown); + while(true) + NdbSleep_MilliSleep(10); + } + globalEmulatorData.theWatchDog->doStop(); #ifdef VM_TRACE diff --git a/ndb/src/kernel/vm/Emulator.hpp b/ndb/src/kernel/vm/Emulator.hpp index 8c4504b9ba7..bd240f8679b 100644 --- a/ndb/src/kernel/vm/Emulator.hpp +++ b/ndb/src/kernel/vm/Emulator.hpp @@ -79,6 +79,7 @@ enum NdbShutdownType { NST_Normal, NST_Watchdog, NST_ErrorHandler, + NST_ErrorHandlerSignal, NST_Restart, NST_ErrorInsert }; -- cgit v1.2.1