From 29397ca589485cec26b061213bf5b05cd0db1231 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Sun, 4 Aug 2019 22:48:31 +0800 Subject: [PATCH] test/journal: always close object otherwise when we destruct `TestObjectRecorder::Handler::lock` or `journal::JournalRecorder::m_object_locks`, it/they would be still being waited by some condition variable. Signed-off-by: Kefu Chai --- src/test/journal/test_ObjectRecorder.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/test/journal/test_ObjectRecorder.cc b/src/test/journal/test_ObjectRecorder.cc index 2df5bf0faaf2e..87efca571a6f1 100644 --- a/src/test/journal/test_ObjectRecorder.cc +++ b/src/test/journal/test_ObjectRecorder.cc @@ -66,10 +66,14 @@ public: static_cast(max_in_flight)} {} ~ObjectRecorderFlusher() { - for (auto& object_recorder : m_object_recorders) { + for (auto& [object_recorder, m] : m_object_recorders) { C_SaferCond cond; object_recorder->flush(&cond); cond.wait(); + std::scoped_lock l{*m}; + if (!object_recorder->is_closed()) { + object_recorder->close(); + } } } journal::ObjectRecorderPtr create_object(const std::string& oid, @@ -84,7 +88,7 @@ public: m_flush_bytes, m_flush_age); } - m_object_recorders.push_back(object); + m_object_recorders.emplace_back(object, lock); m_handler.object_lock = lock; return object; } @@ -110,7 +114,8 @@ public: uint64_t m_flush_bytes = std::numeric_limits::max(); double m_flush_age = 600; uint64_t m_max_in_flight_appends = 0; - using ObjectRecorders = std::list; + using ObjectRecorders = + std::list>; ObjectRecorders m_object_recorders; Handler m_handler; }; -- 2.39.5