Fix crashes when restarting Icinga.

This commit is contained in:
Gunnar Beutner 2013-10-17 10:56:42 +02:00
parent c570593b73
commit fa845775a2
6 changed files with 35 additions and 26 deletions

View File

@ -565,10 +565,6 @@ void ClusterListener::NewClientHandler(const Socket::Ptr& client, TlsRole role)
{ {
ObjectLock olock(endpoint); ObjectLock olock(endpoint);
Stream::Ptr oldClient = endpoint->GetClient();
if (oldClient)
oldClient->Close();
endpoint->SetSyncing(true); endpoint->SetSyncing(true);
endpoint->SetSeen(Utility::GetTime()); endpoint->SetSeen(Utility::GetTime());
endpoint->SetClient(tlsStream); endpoint->SetClient(tlsStream);

View File

@ -38,6 +38,11 @@ Endpoint::Endpoint(void)
: m_Syncing(false) : m_Syncing(false)
{ } { }
Endpoint::~Endpoint(void)
{
SetClient(Stream::Ptr());
}
/** /**
* Checks whether this endpoint is connected. * Checks whether this endpoint is connected.
* *
@ -55,11 +60,17 @@ Stream::Ptr Endpoint::GetClient(void) const
void Endpoint::SetClient(const Stream::Ptr& client) void Endpoint::SetClient(const Stream::Ptr& client)
{ {
if (m_Client)
m_Client->Close();
Log(LogInformation, "cluster", "Joining endpoint message thread.");
m_Thread.join();
m_Client = client; m_Client = client;
if (client) { if (client) {
boost::thread thread(boost::bind(&Endpoint::MessageThreadProc, this, client)); m_Thread = boost::thread(boost::bind(&Endpoint::MessageThreadProc, this, client));
thread.detach();
OnConnected(GetSelf()); OnConnected(GetSelf());
} }

View File

@ -42,6 +42,7 @@ public:
DECLARE_TYPENAME(Endpoint); DECLARE_TYPENAME(Endpoint);
Endpoint(void); Endpoint(void);
~Endpoint(void);
static boost::signals2::signal<void (const Endpoint::Ptr&)> OnConnected; static boost::signals2::signal<void (const Endpoint::Ptr&)> OnConnected;
static boost::signals2::signal<void (const Endpoint::Ptr&, const Dictionary::Ptr&)> OnMessageReceived; static boost::signals2::signal<void (const Endpoint::Ptr&, const Dictionary::Ptr&)> OnMessageReceived;
@ -93,6 +94,8 @@ private:
Dictionary::Ptr m_Features; Dictionary::Ptr m_Features;
bool m_Syncing; bool m_Syncing;
boost::thread m_Thread;
void MessageThreadProc(const Stream::Ptr& stream); void MessageThreadProc(const Stream::Ptr& stream);
}; };

View File

@ -376,5 +376,11 @@ int main(int argc, char **argv)
sigaction(SIGHUP, &sa, NULL); sigaction(SIGHUP, &sa, NULL);
#endif /* _WIN32 */ #endif /* _WIN32 */
return Application::GetInstance()->Run(); int rc = Application::GetInstance()->Run();
#ifdef _DEBUG
exit(rc);
#else /* _DEBUG */
_exit(rc); // Yay, our static destructors are pretty much beyond repair at this point.
#endif /* _DEBUG */
} }

View File

@ -132,18 +132,6 @@ void Application::SetArgV(char **argv)
m_ArgV = argv; m_ArgV = argv;
} }
void Application::ShutdownTimerHandler(void)
{
if (m_ShuttingDown || m_Restarting) {
Log(LogInformation, "base", "Shutting down Icinga...");
Application::GetInstance()->OnShutdown();
DynamicObject::StopObjects();
GetTP().Stop();
m_ShuttingDown = false;
}
}
/** /**
* Processes events for registered sockets and timers and calls whatever * Processes events for registered sockets and timers and calls whatever
* handlers have been set up for these events. * handlers have been set up for these events.
@ -154,17 +142,23 @@ void Application::RunEventLoop(void) const
boost::thread t(&Application::TimeWatchThreadProc); boost::thread t(&Application::TimeWatchThreadProc);
t.detach(); t.detach();
/* Set up a timer that watches the m_Shutdown flag. */
Timer::Ptr shutdownTimer = boost::make_shared<Timer>();
shutdownTimer->OnTimerExpired.connect(boost::bind(&Application::ShutdownTimerHandler));
shutdownTimer->SetInterval(0.5);
shutdownTimer->Start();
Timer::Initialize(); Timer::Initialize();
while (!m_ShuttingDown && !m_Restarting)
Utility::Sleep(0.5);
Log(LogInformation, "base", "Shutting down Icinga...");
Application::GetInstance()->OnShutdown();
#ifdef _DEBUG
DynamicObject::StopObjects();
GetTP().Stop();
m_ShuttingDown = false;
GetTP().Join(); GetTP().Join();
Timer::Uninitialize(); Timer::Uninitialize();
#endif /* _DEBUG */
} }
/** /**

View File

@ -127,7 +127,6 @@ private:
static void TimeWatchThreadProc(void); static void TimeWatchThreadProc(void);
static void NewTxTimerHandler(void); static void NewTxTimerHandler(void);
static void ShutdownTimerHandler(void);
}; };
} }