]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: don't send stale hb msgr's addresses in MOSDBoot 56520/head
authorRadosław Zarzyński <rzarzyns@redhat.com>
Tue, 7 Mar 2023 12:30:11 +0000 (13:30 +0100)
committerKonstantin Shalygin <k0ste@k0ste.ru>
Tue, 1 Jul 2025 05:30:14 +0000 (12:30 +0700)
See comments in the ticket for the RCA.

NOTE: we can't just hold a reference to what `get_myaddrs()`
returns as the `safe_item_history` is involved:

```cpp
template<class T>
class safe_item_history {
  //...
  T *current = nullptr;

  // ...
  const T& operator=(const T& other) {
    std::lock_guard l(lock);
    history.push_back(other);
    current = &history.back();
    return *current;
  }
```

Fixes: https://tracker.ceph.com/issues/58915
Signed-off-by: Radosław Zarzyński <rzarzyns@redhat.com>
(cherry picked from commit 81944f60478abe2d4253caaeb4165da5ccffaca1)

src/osd/OSD.cc

index 3d67bcdb99cd1899482b7261c9ae1c9b621163d1..1be25c3196c4a255fd2f348ad69330478b2b64b9 100644 (file)
@@ -6973,13 +6973,11 @@ void OSD::_send_boot()
     cluster_messenger->get_loopback_connection().get();
   entity_addrvec_t client_addrs = client_messenger->get_myaddrs();
   entity_addrvec_t cluster_addrs = cluster_messenger->get_myaddrs();
-  entity_addrvec_t hb_back_addrs = hb_back_server_messenger->get_myaddrs();
-  entity_addrvec_t hb_front_addrs = hb_front_server_messenger->get_myaddrs();
 
   dout(20) << " initial client_addrs " << client_addrs
           << ", cluster_addrs " << cluster_addrs
-          << ", hb_back_addrs " << hb_back_addrs
-          << ", hb_front_addrs " << hb_front_addrs
+          << ", hb_back_addrs " << hb_back_server_messenger->get_myaddrs()
+          << ", hb_front_addrs " << hb_front_server_messenger->get_myaddrs()
           << dendl;
   if (cluster_messenger->set_addr_unknowns(client_addrs)) {
     dout(10) << " assuming cluster_addrs match client_addrs "
@@ -6994,7 +6992,6 @@ void OSD::_send_boot()
   if (hb_back_server_messenger->set_addr_unknowns(cluster_addrs)) {
     dout(10) << " assuming hb_back_addrs match cluster_addrs "
             << cluster_addrs << dendl;
-    hb_back_addrs = hb_back_server_messenger->get_myaddrs();
   }
   if (auto session = local_connection->get_priv(); !session) {
     hb_back_server_messenger->ms_deliver_handle_fast_connect(local_connection);
@@ -7004,7 +7001,6 @@ void OSD::_send_boot()
   if (hb_front_server_messenger->set_addr_unknowns(client_addrs)) {
     dout(10) << " assuming hb_front_addrs match client_addrs "
             << client_addrs << dendl;
-    hb_front_addrs = hb_front_server_messenger->get_myaddrs();
   }
   if (auto session = local_connection->get_priv(); !session) {
     hb_front_server_messenger->ms_deliver_handle_fast_connect(local_connection);
@@ -7015,6 +7011,8 @@ void OSD::_send_boot()
   // are, so now is a good time!
   set_numa_affinity();
 
+  entity_addrvec_t hb_back_addrs = hb_back_server_messenger->get_myaddrs();
+  entity_addrvec_t hb_front_addrs = hb_front_server_messenger->get_myaddrs();
   MOSDBoot *mboot = new MOSDBoot(
     superblock, get_osdmap_epoch(), service.get_boot_epoch(),
     hb_back_addrs, hb_front_addrs, cluster_addrs,