mirror of https://github.com/Icinga/icinga2.git
Fix deadlock in {HttpServerConnection,JsonRpcConnection}::DataAvailableHandler
refs #11014
This commit is contained in:
parent
c2cf614d62
commit
deac316a45
|
@ -78,7 +78,8 @@ void HttpServerConnection::Disconnect(void)
|
||||||
ApiListener::Ptr listener = ApiListener::GetInstance();
|
ApiListener::Ptr listener = ApiListener::GetInstance();
|
||||||
listener->RemoveHttpClient(this);
|
listener->RemoveHttpClient(this);
|
||||||
|
|
||||||
m_Stream->Shutdown();
|
if (!m_Stream->IsEof())
|
||||||
|
m_Stream->Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HttpServerConnection::ProcessMessage(void)
|
bool HttpServerConnection::ProcessMessage(void)
|
||||||
|
@ -196,21 +197,24 @@ void HttpServerConnection::ProcessMessageAsync(HttpRequest& request)
|
||||||
|
|
||||||
void HttpServerConnection::DataAvailableHandler(void)
|
void HttpServerConnection::DataAvailableHandler(void)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_DataHandlerMutex);
|
bool close = false;
|
||||||
|
|
||||||
try {
|
if (!m_Stream->IsEof()) {
|
||||||
while (ProcessMessage())
|
boost::mutex::scoped_lock lock(m_DataHandlerMutex);
|
||||||
; /* empty loop body */
|
|
||||||
} catch (const std::exception& ex) {
|
|
||||||
Log(LogWarning, "HttpServerConnection")
|
|
||||||
<< "Error while reading Http request: " << DiagnosticInformation(ex);
|
|
||||||
|
|
||||||
Disconnect();
|
try {
|
||||||
|
while (ProcessMessage())
|
||||||
|
; /* empty loop body */
|
||||||
|
} catch (const std::exception& ex) {
|
||||||
|
Log(LogWarning, "HttpServerConnection")
|
||||||
|
<< "Error while reading Http request: " << DiagnosticInformation(ex);
|
||||||
|
|
||||||
return;
|
close = true;
|
||||||
}
|
}
|
||||||
|
} else
|
||||||
|
close = true;
|
||||||
|
|
||||||
if (m_Stream->IsEof())
|
if (close)
|
||||||
Disconnect();
|
Disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,22 +227,27 @@ bool JsonRpcConnection::ProcessMessage(void)
|
||||||
|
|
||||||
void JsonRpcConnection::DataAvailableHandler(void)
|
void JsonRpcConnection::DataAvailableHandler(void)
|
||||||
{
|
{
|
||||||
boost::mutex::scoped_lock lock(m_DataHandlerMutex);
|
bool close = false;
|
||||||
|
|
||||||
try {
|
if (!m_Stream->IsEof()) {
|
||||||
while (ProcessMessage())
|
boost::mutex::scoped_lock lock(m_DataHandlerMutex);
|
||||||
; /* empty loop body */
|
|
||||||
} catch (const std::exception& ex) {
|
|
||||||
Log(LogWarning, "JsonRpcConnection")
|
|
||||||
<< "Error while reading JSON-RPC message for identity '" << m_Identity
|
|
||||||
<< "': " << DiagnosticInformation(ex);
|
|
||||||
|
|
||||||
Disconnect();
|
try {
|
||||||
|
while (ProcessMessage())
|
||||||
|
; /* empty loop body */
|
||||||
|
} catch (const std::exception& ex) {
|
||||||
|
Log(LogWarning, "JsonRpcConnection")
|
||||||
|
<< "Error while reading JSON-RPC message for identity '" << m_Identity
|
||||||
|
<< "': " << DiagnosticInformation(ex);
|
||||||
|
|
||||||
return;
|
Disconnect();
|
||||||
}
|
|
||||||
|
|
||||||
if (m_Stream->IsEof())
|
return;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
close = true;
|
||||||
|
|
||||||
|
if (close)
|
||||||
Disconnect();
|
Disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue