summaryrefslogtreecommitdiff
path: root/ndb/src/kernel
diff options
context:
space:
mode:
authorunknown <msvensson@neptunus.(none)>2005-09-05 22:49:36 +0200
committerunknown <msvensson@neptunus.(none)>2005-09-05 22:49:36 +0200
commitdd45e416895b3d1750f255720c82efbdf1a54100 (patch)
treed5f43652ad712b85680265585764b6d466022887 /ndb/src/kernel
parent4c8361f6838d6186f201c3d7705df5748c4ea859 (diff)
parent8b1751e5c35bbde1af36a104f1cf7b3c2ab4e919 (diff)
downloadmariadb-git-dd45e416895b3d1750f255720c82efbdf1a54100.tar.gz
Merge neptunus.(none):/home/msvensson/mysql/mysql-4.1
into neptunus.(none):/home/msvensson/mysql/mysql-5.0 client/mysqltest.c: Auto merged mysql-test/r/func_gconcat.result: Auto merged mysql-test/r/mysqltest.result: Auto merged mysql-test/t/func_gconcat.test: Auto merged mysql-test/t/mysqltest.test: Auto merged ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp: Auto merged ndb/src/kernel/error/ErrorReporter.cpp: Auto merged ndb/src/kernel/main.cpp: Auto merged ndb/src/kernel/vm/Emulator.cpp: Auto merged ndb/src/kernel/vm/Emulator.hpp: Auto merged ndb/src/mgmsrv/ConfigInfo.cpp: Auto merged ndb/src/mgmsrv/MgmtSrvr.cpp: Auto merged ndb/src/mgmsrv/Services.cpp: Auto merged ndb/tools/ndb_config.cpp: Auto merged ndb/tools/restore/consumer_restore.cpp: Auto merged mysql-test/t/openssl_1.test: Manual merge ndb/include/util/ndb_opts.h: Manual merge ndb/tools/Makefile.am: Manual merge ndb/tools/restore/restore_main.cpp: Manual merge
Diffstat (limited to 'ndb/src/kernel')
-rw-r--r--ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp8
-rw-r--r--ndb/src/kernel/error/ErrorReporter.cpp14
-rw-r--r--ndb/src/kernel/error/ErrorReporter.hpp2
-rw-r--r--ndb/src/kernel/main.cpp37
-rw-r--r--ndb/src/kernel/vm/Emulator.cpp46
-rw-r--r--ndb/src/kernel/vm/Emulator.hpp3
6 files changed, 90 insertions, 20 deletions
diff --git a/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp b/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
index 6f28bb03537..97b16f1dbc4 100644
--- a/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
+++ b/ndb/src/kernel/blocks/ndbcntr/NdbcntrMain.cpp
@@ -2489,6 +2489,14 @@ void Ndbcntr::Missra::sendNextSTTOR(Signal* signal){
const Uint32 start = currentBlockIndex;
+ if (currentStartPhase == ZSTART_PHASE_6)
+ {
+ // Ndbd has passed the critical startphases.
+ // Change error handler from "startup" state
+ // to normal state.
+ ErrorReporter::setErrorHandlerShutdownType();
+ }
+
for(; currentBlockIndex < ALL_BLOCKS_SZ; currentBlockIndex++){
jam();
if(ALL_BLOCKS[currentBlockIndex].NextSP == currentStartPhase){
diff --git a/ndb/src/kernel/error/ErrorReporter.cpp b/ndb/src/kernel/error/ErrorReporter.cpp
index e4ead4ce34d..25409db48a8 100644
--- a/ndb/src/kernel/error/ErrorReporter.cpp
+++ b/ndb/src/kernel/error/ErrorReporter.cpp
@@ -152,6 +152,14 @@ ErrorReporter::formatMessage(ErrorCategory type,
return;
}
+NdbShutdownType ErrorReporter::s_errorHandlerShutdownType = NST_ErrorHandler;
+
+void
+ErrorReporter::setErrorHandlerShutdownType(NdbShutdownType nst)
+{
+ s_errorHandlerShutdownType = nst;
+}
+
void
ErrorReporter::handleAssert(const char* message, const char* file, int line)
{
@@ -170,7 +178,7 @@ ErrorReporter::handleAssert(const char* message, const char* file, int line)
WriteMessage(assert, ERR_ERROR_PRGERR, message, refMessage,
theEmulatedJamIndex, theEmulatedJam);
- NdbShutdown(NST_ErrorHandler);
+ NdbShutdown(s_errorHandlerShutdownType);
}
void
@@ -182,7 +190,7 @@ ErrorReporter::handleThreadAssert(const char* message,
BaseString::snprintf(refMessage, 100, "file: %s lineNo: %d - %s",
file, line, message);
- NdbShutdown(NST_ErrorHandler);
+ NdbShutdown(s_errorHandlerShutdownType);
}//ErrorReporter::handleThreadAssert()
@@ -201,6 +209,8 @@ ErrorReporter::handleError(ErrorCategory type, int messageID,
if(messageID == ERR_ERROR_INSERT){
NdbShutdown(NST_ErrorInsert);
} else {
+ if (nst == NST_ErrorHandler)
+ nst = s_errorHandlerShutdownType;
NdbShutdown(nst);
}
}
diff --git a/ndb/src/kernel/error/ErrorReporter.hpp b/ndb/src/kernel/error/ErrorReporter.hpp
index 2c79f242eea..c5533df46f4 100644
--- a/ndb/src/kernel/error/ErrorReporter.hpp
+++ b/ndb/src/kernel/error/ErrorReporter.hpp
@@ -26,6 +26,7 @@
class ErrorReporter
{
public:
+ static void setErrorHandlerShutdownType(NdbShutdownType nst = NST_ErrorHandler);
static void handleAssert(const char* message,
const char* file,
int line);
@@ -57,6 +58,7 @@ public:
static const char* formatTimeStampString();
private:
+ static enum NdbShutdownType s_errorHandlerShutdownType;
};
#endif
diff --git a/ndb/src/kernel/main.cpp b/ndb/src/kernel/main.cpp
index b35929247d9..850cdf37044 100644
--- a/ndb/src/kernel/main.cpp
+++ b/ndb/src/kernel/main.cpp
@@ -48,8 +48,14 @@ extern NdbMutex * theShutdownMutex;
void catchsigs(bool ignore); // for process signal handling
+#define MAX_FAILED_STARTUPS 3
+// Flag set by child through SIGUSR1 to signal a failed startup
+static bool failed_startup_flag = false;
+// Counter for consecutive failed startups
+static Uint32 failed_startups = 0;
extern "C" void handler_shutdown(int signum); // for process signal handling
extern "C" void handler_error(int signum); // for process signal handling
+extern "C" void handler_sigusr1(int signum); // child signalling failed restart
// Shows system information
void systemInfo(const Configuration & conf,
@@ -95,6 +101,8 @@ int main(int argc, char** argv)
}
#ifndef NDB_WIN32
+ signal(SIGUSR1, handler_sigusr1);
+
for(pid_t child = fork(); child != 0; child = fork()){
/**
* Parent
@@ -146,6 +154,20 @@ int main(int argc, char** argv)
*/
exit(0);
}
+ if (!failed_startup_flag)
+ {
+ // Reset the counter for consecutive failed startups
+ failed_startups = 0;
+ }
+ else if (failed_startups >= MAX_FAILED_STARTUPS && !theConfig->stopOnError())
+ {
+ /**
+ * Error shutdown && stopOnError()
+ */
+ g_eventLogger.alert("Ndbd has failed %u consecutive startups. Not restarting", failed_startups);
+ exit(0);
+ }
+ failed_startup_flag = false;
g_eventLogger.info("Ndb has terminated (pid %d) restarting", child);
theConfig->fetch_configuration();
}
@@ -179,6 +201,9 @@ int main(int argc, char** argv)
/**
* Do startup
*/
+
+ ErrorReporter::setErrorHandlerShutdownType(NST_ErrorHandlerStartup);
+
switch(globalData.theRestartFlag){
case initial_state:
globalEmulatorData.theThreadConfig->doStart(NodeState::SL_CMVMI);
@@ -375,3 +400,15 @@ handler_error(int signum){
BaseString::snprintf(errorData, 40, "Signal %d received", signum);
ERROR_SET_SIGNAL(fatal, 0, errorData, __FILE__);
}
+
+extern "C"
+void
+handler_sigusr1(int signum)
+{
+ if (!failed_startup_flag)
+ {
+ failed_startups++;
+ failed_startup_flag = true;
+ }
+ g_eventLogger.info("Received signal %d. Ndbd failed startup (%u).", signum, failed_startups);
+}
diff --git a/ndb/src/kernel/vm/Emulator.cpp b/ndb/src/kernel/vm/Emulator.cpp
index f52233fc276..058829e05e2 100644
--- a/ndb/src/kernel/vm/Emulator.cpp
+++ b/ndb/src/kernel/vm/Emulator.cpp
@@ -39,6 +39,7 @@ extern "C" {
extern void (* ndb_new_handler)();
}
extern EventLogger g_eventLogger;
+extern my_bool opt_core;
/**
* Declare the global variables
@@ -154,6 +155,9 @@ NdbShutdown(NdbShutdownType type,
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;
@@ -165,23 +169,25 @@ NdbShutdown(NdbShutdownType type,
}
const char * exitAbort = 0;
-#if defined VM_TRACE && ( ! ( defined NDB_OSE || defined NDB_SOFTOSE) )
- exitAbort = "aborting";
-#else
- exitAbort = "exiting";
-#endif
+ 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 defined VM_TRACE && ( ! ( defined NDB_OSE || defined NDB_SOFTOSE) )
- signal(6, SIG_DFL);
- abort();
-#else
- exit(-1);
-#endif
+ if (opt_core)
+ {
+ signal(6, SIG_DFL);
+ abort();
+ }
+ else
+ {
+ exit(-1);
+ }
}
#ifndef NDB_WIN32
@@ -229,13 +235,19 @@ NdbShutdown(NdbShutdownType type,
}
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 ( defined VM_TRACE || defined ERROR_INSERT ) && ( ! ( defined NDB_OSE || defined NDB_SOFTOSE) )
- signal(6, SIG_DFL);
- abort();
-#else
- exit(-1);
-#endif
+ if (opt_core)
+ {
+ signal(6, SIG_DFL);
+ abort();
+ }
+ else
+ {
+ exit(-1);
+ }
}
/**
diff --git a/ndb/src/kernel/vm/Emulator.hpp b/ndb/src/kernel/vm/Emulator.hpp
index dba8cb3ab9b..cd194202d85 100644
--- a/ndb/src/kernel/vm/Emulator.hpp
+++ b/ndb/src/kernel/vm/Emulator.hpp
@@ -83,7 +83,8 @@ enum NdbShutdownType {
NST_ErrorHandler,
NST_ErrorHandlerSignal,
NST_Restart,
- NST_ErrorInsert
+ NST_ErrorInsert,
+ NST_ErrorHandlerStartup
};
enum NdbRestartType {