From b97b474ae9ad360fff363291476d33cde7bee7a4 Mon Sep 17 00:00:00 2001 From: fangfengbin <869218239a@zju.edu.cn> Date: Thu, 9 Jul 2020 20:03:46 +0800 Subject: [PATCH] Fix GcsActorManagerTest multi-thread bug (#9358) --- .../gcs_server/test/gcs_actor_manager_test.cc | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/ray/gcs/gcs_server/test/gcs_actor_manager_test.cc b/src/ray/gcs/gcs_server/test/gcs_actor_manager_test.cc index 202353752..6bd3dac49 100644 --- a/src/ray/gcs/gcs_server/test/gcs_actor_manager_test.cc +++ b/src/ray/gcs/gcs_server/test/gcs_actor_manager_test.cc @@ -100,15 +100,23 @@ class GcsActorManagerTest : public ::testing::Test { void WaitActorCreated(const ActorID &actor_id) { auto condition = [this, actor_id]() { - auto created_actors = gcs_actor_manager_->GetCreatedActors(); - for (auto &node_iter : created_actors) { - for (auto &actor_iter : node_iter.second) { - if (actor_iter.second == actor_id) { - return true; + // The created_actors_ of gcs actor manager will be modified in io_service thread. + // In order to avoid multithreading reading and writing created_actors_, we also + // send the read operation to io_service thread. + std::promise promise; + io_service_.post([this, actor_id, &promise]() { + const auto &created_actors = gcs_actor_manager_->GetCreatedActors(); + for (auto &node_iter : created_actors) { + for (auto &actor_iter : node_iter.second) { + if (actor_iter.second == actor_id) { + promise.set_value(true); + return; + } } } - } - return false; + promise.set_value(false); + }); + return promise.get_future().get(); }; EXPECT_TRUE(WaitForCondition(condition, timeout_ms_.count())); }