From ac05617b246d3c2a329b1b99b0371e3f6b8541e9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 17 Sep 2015 21:42:53 -0400 Subject: [PATCH] osd: fix send_failures() locking It is unsafe to check failure_queue.empty() without the lock. Signed-off-by: Sage Weil (cherry picked from commit b3ca828ae8ebc9068073494c46faf3e8e1443ada) --- src/osd/OSD.cc | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 1470f81218e85..f085e2dbe6702 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4651,21 +4651,17 @@ void OSD::send_alive() void OSD::send_failures() { assert(osd_lock.is_locked()); - bool locked = false; - if (!failure_queue.empty()) { - heartbeat_lock.Lock(); - locked = true; - } + Mutex::Locker l(heartbeat_lock); utime_t now = ceph_clock_now(cct); while (!failure_queue.empty()) { int osd = failure_queue.begin()->first; int failed_for = (int)(double)(now - failure_queue.begin()->second); entity_inst_t i = osdmap->get_inst(osd); - monc->send_mon_message(new MOSDFailure(monc->get_fsid(), i, failed_for, osdmap->get_epoch())); + monc->send_mon_message(new MOSDFailure(monc->get_fsid(), i, failed_for, + osdmap->get_epoch())); failure_pending[osd] = i; failure_queue.erase(osd); } - if (locked) heartbeat_lock.Unlock(); } void OSD::send_still_alive(epoch_t epoch, const entity_inst_t &i) -- 2.39.5