From: Sage Weil Date: Fri, 18 Sep 2015 01:42:53 +0000 (-0400) Subject: osd: fix send_failures() locking X-Git-Tag: v0.94.6~43^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F6755%2Fhead;p=ceph.git 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) --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 1470f81218e8..f085e2dbe670 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)