]> granicus.if.org Git - icinga2/commitdiff
Close server connections and shutdown coroutines immediately on disconnect 7209/head
authorAlexander A. Klimov <alexander.klimov@icinga.com>
Wed, 5 Jun 2019 08:32:20 +0000 (10:32 +0200)
committerAlexander A. Klimov <alexander.klimov@icinga.com>
Wed, 5 Jun 2019 08:42:03 +0000 (10:42 +0200)
lib/remote/httpserverconnection.cpp
lib/remote/httpserverconnection.hpp
lib/remote/jsonrpcconnection-heartbeat.cpp
lib/remote/jsonrpcconnection.cpp
lib/remote/jsonrpcconnection.hpp

index 9d563af7604da056030ad4f70885f5e82dd624b5..1d407d06285b8a2729d8b336d00dcab3185a1625 100644 (file)
@@ -31,7 +31,8 @@ using namespace icinga;
 auto const l_ServerHeader ("Icinga/" + Application::GetAppVersion());
 
 HttpServerConnection::HttpServerConnection(const String& identity, bool authenticated, const std::shared_ptr<AsioTlsStream>& stream)
-       : m_Stream(stream), m_Seen(Utility::GetTime()), m_IoStrand(stream->get_executor().context()), m_ShuttingDown(false), m_HasStartedStreaming(false)
+       : m_Stream(stream), m_Seen(Utility::GetTime()), m_IoStrand(stream->get_executor().context()), m_ShuttingDown(false), m_HasStartedStreaming(false),
+       m_CheckLivenessTimer(stream->get_executor().context())
 {
        if (authenticated) {
                m_ApiUser = ApiUser::GetByClientCN(identity);
@@ -80,6 +81,13 @@ void HttpServerConnection::Disconnect()
                        } catch (...) {
                        }
 
+                       try {
+                               m_Stream->lowest_layer().cancel();
+                       } catch (...) {
+                       }
+
+                       m_CheckLivenessTimer.cancel();
+
                        auto listener (ApiListener::GetInstance());
 
                        if (listener) {
@@ -529,11 +537,11 @@ void HttpServerConnection::ProcessMessages(boost::asio::yield_context yc)
 
 void HttpServerConnection::CheckLiveness(boost::asio::yield_context yc)
 {
-       boost::asio::deadline_timer timer (m_Stream->get_executor().context());
+       boost::system::error_code ec;
 
        for (;;) {
-               timer.expires_from_now(boost::posix_time::seconds(5));
-               timer.async_wait(yc);
+               m_CheckLivenessTimer.expires_from_now(boost::posix_time::seconds(5));
+               m_CheckLivenessTimer.async_wait(yc[ec]);
 
                if (m_ShuttingDown) {
                        break;
index b32db86a6c91da3e0216280a4572ee2add54852d..6586e0ff1ccdde797b4f0c542da0c224725dd386 100644 (file)
@@ -7,6 +7,7 @@
 #include "base/string.hpp"
 #include "base/tlsstream.hpp"
 #include <memory>
+#include <boost/asio/deadline_timer.hpp>
 #include <boost/asio/io_service_strand.hpp>
 #include <boost/asio/spawn.hpp>
 
@@ -39,6 +40,7 @@ private:
        boost::asio::io_service::strand m_IoStrand;
        bool m_ShuttingDown;
        bool m_HasStartedStreaming;
+       boost::asio::deadline_timer m_CheckLivenessTimer;
 
        void ProcessMessages(boost::asio::yield_context yc);
        void CheckLiveness(boost::asio::yield_context yc);
index 93f2a774c0bca8bb8f326e47514158b413da1fff..993877e4e4099525ccdde864a3307fe1149c6b24 100644 (file)
@@ -7,9 +7,9 @@
 #include "base/configtype.hpp"
 #include "base/logger.hpp"
 #include "base/utility.hpp"
-#include <boost/asio/deadline_timer.hpp>
 #include <boost/asio/spawn.hpp>
 #include <boost/date_time/posix_time/posix_time_duration.hpp>
+#include <boost/system/system_error.hpp>
 
 using namespace icinga;
 
@@ -17,11 +17,11 @@ REGISTER_APIFUNCTION(Heartbeat, event, &JsonRpcConnection::HeartbeatAPIHandler);
 
 void JsonRpcConnection::HandleAndWriteHeartbeats(boost::asio::yield_context yc)
 {
-       boost::asio::deadline_timer timer (m_Stream->get_executor().context());
+       boost::system::error_code ec;
 
        for (;;) {
-               timer.expires_from_now(boost::posix_time::seconds(10));
-               timer.async_wait(yc);
+               m_HeartbeatTimer.expires_from_now(boost::posix_time::seconds(10));
+               m_HeartbeatTimer.async_wait(yc[ec]);
 
                if (m_ShuttingDown) {
                        break;
index 251acbc0404344b329d4905a6e6cd8e5057912c7..53c3c58e5e9cb14b1e2136fb2432af692bee37c9 100644 (file)
@@ -16,9 +16,9 @@
 #include "base/tlsstream.hpp"
 #include <memory>
 #include <utility>
-#include <boost/asio/deadline_timer.hpp>
 #include <boost/asio/spawn.hpp>
 #include <boost/date_time/posix_time/posix_time_duration.hpp>
+#include <boost/system/system_error.hpp>
 #include <boost/thread/once.hpp>
 
 using namespace icinga;
@@ -32,7 +32,8 @@ JsonRpcConnection::JsonRpcConnection(const String& identity, bool authenticated,
        const std::shared_ptr<AsioTlsStream>& stream, ConnectionRole role)
        : m_Identity(identity), m_Authenticated(authenticated), m_Stream(stream),
        m_Role(role), m_Timestamp(Utility::GetTime()), m_Seen(Utility::GetTime()), m_NextHeartbeat(0), m_IoStrand(stream->get_executor().context()),
-       m_OutgoingMessagesQueued(stream->get_executor().context()), m_WriterDone(stream->get_executor().context()), m_ShuttingDown(false)
+       m_OutgoingMessagesQueued(stream->get_executor().context()), m_WriterDone(stream->get_executor().context()), m_ShuttingDown(false),
+       m_CheckLivenessTimer(stream->get_executor().context()), m_HeartbeatTimer(stream->get_executor().context())
 {
        if (authenticated)
                m_Endpoint = Endpoint::GetByName(identity);
@@ -206,6 +207,14 @@ void JsonRpcConnection::Disconnect()
                        } catch (...) {
                        }
 
+                       try {
+                               m_Stream->lowest_layer().cancel();
+                       } catch (...) {
+                       }
+
+                       m_CheckLivenessTimer.cancel();
+                       m_HeartbeatTimer.cancel();
+
                        CpuBoundWork removeClient (yc);
 
                        if (m_Endpoint) {
@@ -310,11 +319,11 @@ Value SetLogPositionHandler(const MessageOrigin::Ptr& origin, const Dictionary::
 
 void JsonRpcConnection::CheckLiveness(boost::asio::yield_context yc)
 {
-       boost::asio::deadline_timer timer (m_Stream->get_executor().context());
+       boost::system::error_code ec;
 
        for (;;) {
-               timer.expires_from_now(boost::posix_time::seconds(30));
-               timer.async_wait(yc);
+               m_CheckLivenessTimer.expires_from_now(boost::posix_time::seconds(30));
+               m_CheckLivenessTimer.async_wait(yc[ec]);
 
                if (m_ShuttingDown) {
                        break;
index 994dd7368110aa5b668b03ad959b25aafcf9acd3..caca1cb72f7c603dc50e904deacd95082acd9306 100644 (file)
@@ -11,6 +11,7 @@
 #include "base/workqueue.hpp"
 #include <memory>
 #include <vector>
+#include <boost/asio/deadline_timer.hpp>
 #include <boost/asio/io_service_strand.hpp>
 #include <boost/asio/spawn.hpp>
 
@@ -77,6 +78,7 @@ private:
        AsioConditionVariable m_OutgoingMessagesQueued;
        AsioConditionVariable m_WriterDone;
        bool m_ShuttingDown;
+       boost::asio::deadline_timer m_CheckLivenessTimer, m_HeartbeatTimer;
 
        void HandleIncomingMessages(boost::asio::yield_context yc);
        void WriteOutgoingMessages(boost::asio::yield_context yc);