]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: don't send stale hb msgr's addresses in MOSDBoot 56521/head
authorRadosław Zarzyński <rzarzyns@redhat.com>
Tue, 7 Mar 2023 12:30:11 +0000 (13:30 +0100)
committerKonstantin Shalygin <k0ste@k0ste.ru>
Wed, 27 Mar 2024 12:01:18 +0000 (19:01 +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 1f923516eda7cdd914bb4cf650c372aae09632cf..7ff767a3abd2c4f6803431b5c2f072a0293770e8 100644 (file)
@@ -6919,13 +6919,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 "
@@ -6940,7 +6938,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);
@@ -6950,7 +6947,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);
@@ -6961,6 +6957,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,