]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: break con<->session cycle when removing heartbeat peers
authorSage Weil <sage@redhat.com>
Mon, 29 Jul 2019 15:01:28 +0000 (10:01 -0500)
committerSage Weil <sage@redhat.com>
Mon, 5 Aug 2019 18:53:25 +0000 (13:53 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/msg/Connection.h
src/osd/OSD.cc

index 9ea229c174267e381cd554570110649d5e17fff0..e892a68431e2a9f5b77b1d3d8ea64d4aef5ac172 100644 (file)
@@ -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
index 4de931f40161086df5767d906bf7bd6c1484711c..61fef2a6208aee296ec4886fd89bf591ccf631f2 100644 (file)
@@ -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<ConnectionRef,ConnectionRef> newcon = service.get_con_osd_hb(p->second.peer, p->second.epoch);
@@ -7573,8 +7579,10 @@ void OSD::note_down_osd(int peer)
   map<int,HeartbeatInfo>::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);
   }