summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <tomas@poseidon.(none)>2004-08-30 10:13:09 +0000
committerunknown <tomas@poseidon.(none)>2004-08-30 10:13:09 +0000
commit42a7e96adb650e1db4da0049c06bbf140c6728da (patch)
tree85db6739b022c6917eb5265cd28e6d5d9e0bc006
parent7776439c7b28a35bd4f133eb5225a07166170462 (diff)
downloadmariadb-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.cpp11
-rw-r--r--ndb/src/kernel/error/ErrorHandlingMacros.hpp2
-rw-r--r--ndb/src/kernel/main.cpp10
-rw-r--r--ndb/src/kernel/vm/Emulator.cpp13
-rw-r--r--ndb/src/kernel/vm/Emulator.hpp1
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
};