From dcaba832e4ede117c96b244c165d46cb37c183a6 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 29 Jul 2019 10:01:28 -0500 Subject: [PATCH] osd: break con<->session cycle when removing heartbeat peers Signed-off-by: Sage Weil --- src/msg/Connection.h | 5 +++++ src/osd/OSD.cc | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/msg/Connection.h b/src/msg/Connection.h index 9ea229c1742..e892a68431e 100644 --- a/src/msg/Connection.h +++ b/src/msg/Connection.h @@ -100,6 +100,11 @@ public: return priv; } + void clear_priv() { + std::lock_guard l{lock}; + priv.reset(nullptr); + } + /** * Used to judge whether this connection is ready to send. Usually, the * implementation need to build a own shakehand or sesson then it can be diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 4de931f4016..61fef2a6208 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4395,8 +4395,10 @@ void OSD::_remove_heartbeat_peer(int n) << " " << (q->second.con_front ? q->second.con_front->get_peer_addr() : entity_addr_t()) << dendl; q->second.con_back->mark_down(); + q->second.con_back->clear_priv(); if (q->second.con_front) { q->second.con_front->mark_down(); + q->second.con_front->clear_priv(); } heartbeat_peers.erase(q); } @@ -4527,8 +4529,10 @@ void OSD::reset_heartbeat_peers(bool all) HeartbeatInfo& hi = it->second; if (all || hi.is_stale(stale)) { hi.con_back->mark_down(); + hi.con_back->clear_priv(); if (hi.con_front) { hi.con_front->mark_down(); + hi.con_front->clear_priv(); } // stop sending failure_report to mon too failure_queue.erase(it->first); @@ -4948,10 +4952,12 @@ bool OSD::heartbeat_reset(Connection *con) << ", reopening" << dendl; if (con != p->second.con_back) { p->second.con_back->mark_down(); + p->second.con_back->clear_priv(); } p->second.con_back.reset(NULL); if (p->second.con_front && con != p->second.con_front) { p->second.con_front->mark_down(); + p->second.con_front->clear_priv(); } p->second.con_front.reset(NULL); pair newcon = service.get_con_osd_hb(p->second.peer, p->second.epoch); @@ -7573,8 +7579,10 @@ void OSD::note_down_osd(int peer) map::iterator p = heartbeat_peers.find(peer); if (p != heartbeat_peers.end()) { p->second.con_back->mark_down(); + p->second.con_back->clear_priv(); if (p->second.con_front) { p->second.con_front->mark_down(); + p->second.con_front->clear_priv(); } heartbeat_peers.erase(p); } -- 2.39.5