From d6e8de21efb38b69bbaa0a865a07a12efaedb744 Mon Sep 17 00:00:00 2001 From: Thad House Date: Tue, 16 Aug 2016 23:31:02 -0700 Subject: [PATCH] Fixes rpc timeouts and blocking call list error (#95) --- src/RpcServer.cpp | 10 ++++------ src/Storage.cpp | 14 ++++++-------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/RpcServer.cpp b/src/RpcServer.cpp index dc653615a9..76baef6969 100644 --- a/src/RpcServer.cpp +++ b/src/RpcServer.cpp @@ -72,12 +72,10 @@ bool RpcServer::PollRpc(bool blocking, double time_out, RpcCallInfo* call_info) m_poll_cond.wait(lock); } else { auto timeout_time = std::chrono::steady_clock::now() + - std::chrono::duration(time_out); - while (!m_terminating) { - auto timed_out = m_poll_cond.wait_until(lock, timeout_time); - if (timed_out == std::cv_status::timeout) { - return false; - } + std::chrono::duration(time_out); + auto timed_out = m_poll_cond.wait_until(lock, timeout_time); + if (timed_out == std::cv_status::timeout) { + return false; } } if (m_terminating) return false; diff --git a/src/Storage.cpp b/src/Storage.cpp index b43e7deff1..bbf1e99b00 100644 --- a/src/Storage.cpp +++ b/src/Storage.cpp @@ -1415,24 +1415,22 @@ bool Storage::GetRpcResult(bool blocking, unsigned int call_uid, bool Storage::GetRpcResult(bool blocking, unsigned int call_uid, double time_out, std::string* result) { std::unique_lock lock(m_mutex); + // only allow one blocking call per rpc call uid + if (!m_rpc_blocking_calls.insert(call_uid).second) return false; for (;;) { auto i = m_rpc_results.find(std::make_pair(call_uid >> 16, call_uid & 0xffff)); if (i == m_rpc_results.end()) { if (!blocking || m_terminating) return false; - // only allow one blocking call per rpc call uid - if (!m_rpc_blocking_calls.insert(call_uid).second) return false; if (time_out < 0) { m_rpc_results_cond.wait(lock); } else { auto timeout_time = std::chrono::steady_clock::now() + std::chrono::duration(time_out); - while (!m_terminating) { - auto timed_out = m_rpc_results_cond.wait_until(lock, timeout_time); - if (timed_out == std::cv_status::timeout) { - m_rpc_blocking_calls.erase(call_uid); - return false; - } + auto timed_out = m_rpc_results_cond.wait_until(lock, timeout_time); + if (timed_out == std::cv_status::timeout) { + m_rpc_blocking_calls.erase(call_uid); + return false; } } if (m_terminating) {