From 0b8644b0cd35479fe1c2f51ccb5e0e494e4c7f91 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 12 Apr 2017 14:19:46 -0400 Subject: [PATCH] os/bluestore: fix narrow osr->flush() race Signed-off-by: Sage Weil --- src/os/bluestore/BlueStore.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 8c7732fa837..535c745ae53 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1655,10 +1655,13 @@ public: void flush() override { std::unique_lock l(qlock); while (true) { + // set flag before the check because the condition + // may become true outside qlock, and we need to make + // sure those threads see waiters and signal qcond. + ++kv_submitted_waiters; if (_is_all_kv_submitted()) { return; } - ++kv_submitted_waiters; qcond.wait(l); --kv_submitted_waiters; }