Fix deadlock in {HttpServerConnection,JsonRpcConnection}::DataAvailableHandler

refs #11014
This commit is contained in:
Gunnar Beutner 2016-02-01 08:35:55 +01:00
parent a49f8f142e
commit 55720f3005
2 changed files with 37 additions and 18 deletions

View File

@ -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,17 +197,25 @@ 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);
try {
while (ProcessMessage())
; /* empty loop body */
} catch (const std::exception& ex) {
Log(LogWarning, "HttpServerConnection")
<< "Error while reading Http request: " << DiagnosticInformation(ex);
close = true;
}
} else
close = true;
if (close)
Disconnect(); Disconnect();
}
} }
void HttpServerConnection::CheckLiveness(void) void HttpServerConnection::CheckLiveness(void)

View File

@ -227,18 +227,28 @@ 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);
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);
Disconnect();
return;
}
} else
close = true;
if (close)
Disconnect(); Disconnect();
}
} }
Value SetLogPositionHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params) Value SetLogPositionHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params)