From 86d55c1a0ddb48efc0c1934728d27f22cf49dfa1 Mon Sep 17 00:00:00 2001 From: Tao Ning Date: Wed, 14 Aug 2019 21:07:46 +0800 Subject: [PATCH] osd/PrimaryLogPG: Avoid accessing destroyed references in finish_degraded_object As follows: for (auto i = callbacks_for_degraded_object.begin(); i != callbacks_for_degraded_object.end();) { finish_degraded_object((i++)->first); } void PrimaryLogPG::finish_degraded_object(const hobject_t oid) { if (callbacks_for_degraded_object.count(oid)) { contexts.swap(callbacks_for_degraded_object[oid]); callbacks_for_degraded_object.erase(oid); // Release } map::iterator i = objects_blocked_on_degraded_snap.find( oid.get_head()); // Access ... } Fixes: https://tracker.ceph.com/issues/41250 Signed-off-by: Tao Ning --- src/osd/PrimaryLogPG.cc | 2 +- src/osd/PrimaryLogPG.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 23f6dc52211..1f1ae89353c 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -11431,7 +11431,7 @@ void PrimaryLogPG::remove_missing_object(const hobject_t &soid, ceph_assert(r == 0); } -void PrimaryLogPG::finish_degraded_object(const hobject_t& oid) +void PrimaryLogPG::finish_degraded_object(const hobject_t oid) { dout(10) << __func__ << " " << oid << dendl; if (callbacks_for_degraded_object.count(oid)) { diff --git a/src/osd/PrimaryLogPG.h b/src/osd/PrimaryLogPG.h index 3498a419f13..ad4da78bed6 100644 --- a/src/osd/PrimaryLogPG.h +++ b/src/osd/PrimaryLogPG.h @@ -1142,7 +1142,7 @@ protected: PGBackend::RecoveryHandle *h, bool *work_started); - void finish_degraded_object(const hobject_t& oid); + void finish_degraded_object(const hobject_t oid); // Cancels/resets pulls from peer void check_recovery_sources(const OSDMapRef& map) override ; -- 2.39.5