From 472f2c0b0c02cb857db03853c99f317f3ab17615 Mon Sep 17 00:00:00 2001 From: Matan Breizman Date: Tue, 23 May 2023 15:20:59 +0000 Subject: [PATCH] osd/OSD: maybe_share_map()- avoid locking `sent_epoch_lock` twice Invoking `send_incremental_map()` doesn't wait until the replica actually receives the map, so marking `last_epoch_sent` prior to invoking it is just as correct. Signed-off-by: Matan Breizman --- src/osd/OSD.cc | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 6df9a92883e..42ed7126756 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -7301,25 +7301,20 @@ void OSDService::maybe_share_map( << " -> " << peer_epoch_lb << " (as per caller)" << dendl; session->last_sent_epoch = peer_epoch_lb; } - epoch_t last_sent_epoch = session->last_sent_epoch; - session->sent_epoch_lock.unlock(); - if (osdmap->get_epoch() <= last_sent_epoch) { + if (osdmap->get_epoch() <= session->last_sent_epoch) { + session->sent_epoch_lock.unlock(); return; } - send_incremental_map(last_sent_epoch, con, osdmap); - last_sent_epoch = osdmap->get_epoch(); - - session->sent_epoch_lock.lock(); - if (session->last_sent_epoch < last_sent_epoch) { + const epoch_t send_from = session->last_sent_epoch; dout(10) << __func__ << " con " << con << " " << con->get_peer_addr() << " map epoch " << session->last_sent_epoch - << " -> " << last_sent_epoch << " (shared)" << dendl; - session->last_sent_epoch = last_sent_epoch; - } + << " -> " << osdmap->get_epoch() << " (shared)" << dendl; + session->last_sent_epoch = osdmap->get_epoch(); session->sent_epoch_lock.unlock(); + send_incremental_map(send_from, con, osdmap); } void OSD::dispatch_session_waiting(const ceph::ref_t& session, OSDMapRef osdmap) -- 2.39.5