diff options
author | unknown <tomas@poseidon.(none)> | 2004-08-30 10:13:09 +0000 |
---|---|---|
committer | unknown <tomas@poseidon.(none)> | 2004-08-30 10:13:09 +0000 |
commit | 42a7e96adb650e1db4da0049c06bbf140c6728da (patch) | |
tree | 85db6739b022c6917eb5265cd28e6d5d9e0bc006 | |
parent | 7776439c7b28a35bd4f133eb5225a07166170462 (diff) | |
download | mariadb-git-42a7e96adb650e1db4da0049c06bbf140c6728da.tar.gz |
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
-rw-r--r-- | ndb/src/kernel/blocks/cmvmi/Cmvmi.cpp | 11 | ||||
-rw-r--r-- | ndb/src/kernel/error/ErrorHandlingMacros.hpp | 2 | ||||
-rw-r--r-- | ndb/src/kernel/main.cpp | 10 | ||||
-rw-r--r-- | ndb/src/kernel/vm/Emulator.cpp | 13 | ||||
-rw-r--r-- | 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 }; |