Skip to content

Commit 0af2a51

Browse files
committed
Merge branch 'bugfix/last-reload-attempt-failed-8428' into feature/icinga-check-output-error-last-reload-failed-7263
2 parents c46a30c + 733d032 commit 0af2a51

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

lib/base/application.cpp

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#ifdef _WIN32
3030
#include <windows.h>
3131
#else /* _WIN32 */
32+
#include <sys/mman.h>
3233
#include <signal.h>
3334
#endif /* _WIN32 */
3435

@@ -53,7 +54,26 @@ int Application::m_ArgC;
5354
char **Application::m_ArgV;
5455
double Application::m_StartTime;
5556
bool Application::m_ScriptDebuggerEnabled = false;
56-
double Application::m_LastReloadFailed;
57+
58+
#ifdef _WIN32
59+
double Application::m_LastReloadFailed = 0;
60+
#else /* _WIN32 */
61+
std::atomic<double>* Application::m_LastReloadFailed = ([]() -> std::atomic<double>* {
62+
auto memory (mmap(
63+
nullptr, sizeof(std::atomic<double>),
64+
PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_SHARED, -1, 0
65+
));
66+
if (memory == MAP_FAILED) {
67+
BOOST_THROW_EXCEPTION(posix_error()
68+
<< boost::errinfo_api_function("mmap")
69+
<< boost::errinfo_errno(errno));
70+
}
71+
72+
auto lrf ((std::atomic<double>*)memory);
73+
lrf->store(0);
74+
return lrf;
75+
})();
76+
#endif /* _WIN32 */
5777

5878
/**
5979
* Constructor for the Application class.
@@ -1170,12 +1190,20 @@ void Application::SetScriptDebuggerEnabled(bool enabled)
11701190

11711191
double Application::GetLastReloadFailed()
11721192
{
1193+
#ifdef _WIN32
11731194
return m_LastReloadFailed;
1195+
#else /* _WIN32 */
1196+
return m_LastReloadFailed->load();
1197+
#endif /* _WIN32 */
11741198
}
11751199

11761200
void Application::SetLastReloadFailed(double ts)
11771201
{
1202+
#ifdef _WIN32
11781203
m_LastReloadFailed = ts;
1204+
#else /* _WIN32 */
1205+
m_LastReloadFailed->store(ts);
1206+
#endif /* _WIN32 */
11791207
}
11801208

11811209
void Application::ValidateName(const Lazy<String>& lvalue, const ValidationUtils& utils)

lib/base/application.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "base/application-ti.hpp"
88
#include "base/logger.hpp"
99
#include "base/configuration.hpp"
10+
#include <atomic>
1011
#include <iosfwd>
1112

1213
namespace icinga
@@ -137,7 +138,11 @@ class Application : public ObjectImpl<Application> {
137138
static double m_StartTime;
138139
static double m_MainTime;
139140
static bool m_ScriptDebuggerEnabled;
141+
#ifdef _WIN32
140142
static double m_LastReloadFailed;
143+
#else /* _WIN32 */
144+
static std::atomic<double> *m_LastReloadFailed;
145+
#endif /* _WIN32 */
141146

142147
#ifdef _WIN32
143148
static BOOL WINAPI CtrlHandler(DWORD type);

lib/cli/daemoncommand.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,10 +757,12 @@ int DaemonCommand::Run(const po::variables_map& vm, const std::vector<std::strin
757757

758758
if (nextWorker == -1) {
759759
Log(LogCritical, "Application", "Found error in config: reloading aborted");
760+
Application::SetLastReloadFailed(Utility::GetTime());
760761
} else {
761762
Log(LogInformation, "Application")
762763
<< "Reload done, old process shutting down. Child process with PID '" << nextWorker << "' is taking over.";
763764

765+
Application::SetLastReloadFailed(0);
764766
(void)kill(currentWorker, SIGTERM);
765767

766768
{

0 commit comments

Comments
 (0)