summaryrefslogtreecommitdiff
path: root/ndb/src/kernel/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ndb/src/kernel/main.cpp')
-rw-r--r--ndb/src/kernel/main.cpp37
1 files changed, 37 insertions, 0 deletions
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);
+}