]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/OSD: maybe_share_map()- avoid locking `sent_epoch_lock` twice
authorMatan Breizman <mbreizma@redhat.com>
Tue, 23 May 2023 15:20:59 +0000 (15:20 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Thu, 15 Jun 2023 14:35:35 +0000 (14:35 +0000)
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 <mbreizma@redhat.com>
src/osd/OSD.cc

index 6df9a92883e1971ca458c6dd2cb2277e01222fec..42ed712675613e65974350cb6b220a8c506b0e06 100644 (file)
@@ -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>& session, OSDMapRef osdmap)