From 52f4ca83274d983017b60e6e35e0f05c5fee52af Mon Sep 17 00:00:00 2001 From: xuxuepeng Date: Mon, 9 Oct 2023 15:43:39 +0800 Subject: [PATCH] Add m_calls mutex in controller monitor Signed-off-by: xuxuepeng --- .../client/grpc_sandboxer_monitor.cc | 24 +++++++++++++++---- .../sandboxer/client/grpc_sandboxer_monitor.h | 3 +++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_monitor.cc b/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_monitor.cc index a8c141634..1417ee403 100644 --- a/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_monitor.cc +++ b/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_monitor.cc @@ -53,6 +53,7 @@ auto SandboxerClientMonitor::Monitor(SandboxerAsyncWaitCall *call) -> bool } // The call will be enqueued into completion queue, and the callback // will be invoked when the response is ready + std::unique_lock lock(m_callsMutex); m_calls.push_back(call); INFO("Start to monitor sandboxer wait call, sandbox id: %s", call->GetSandboxId().c_str()); @@ -203,19 +204,31 @@ void SandboxerClientMonitor::CheckCompletedFutures() } } -void SandboxerClientMonitor::Cleanup() +void SandboxerClientMonitor::ClearDeferredCalls() { - for (auto &future : m_futures) { - future.wait(); - } - m_futures.clear(); + std::unique_lock lock(m_deferredCallsMutex); m_deferredCalls.clear(); +} + +void SandboxerClientMonitor::ClearAllCalls() +{ + std::unique_lock lock(m_callsMutex); for (auto &call : m_calls) { delete call; } m_calls.clear(); } +void SandboxerClientMonitor::Cleanup() +{ + for (auto &future : m_futures) { + future.wait(); + } + m_futures.clear(); + ClearDeferredCalls(); + ClearAllCalls(); +} + /** * Thread for handling completion queue. */ @@ -261,6 +274,7 @@ void SandboxerClientMonitor::AsyncCompleteRpcThread() */ void SandboxerClientMonitor::DeleteRemovedCalls() { + std::unique_lock lock(m_callsMutex); for (auto it = m_calls.begin(); it != m_calls.end();) { auto &call = (*it); if (call->ToRemove()) { diff --git a/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_monitor.h b/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_monitor.h index 70ecf50c8..32fca9341 100644 --- a/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_monitor.h +++ b/src/daemon/sandbox/controller/sandboxer/client/grpc_sandboxer_monitor.h @@ -54,6 +54,8 @@ private: void MonitorThread(); void CheckCompletedFutures(); void DeleteRemovedCalls(); + void ClearDeferredCalls(); + void ClearAllCalls(); void Cleanup(); std::thread m_cqThread; @@ -65,6 +67,7 @@ private: grpc::CompletionQueue m_cq; // Vector for holding all the calls for monitoring std::vector m_calls; + std::mutex m_callsMutex; // Use to indicate whether bool m_teardown; // Vector for holding all the retry calls -- Gitee