From c00606e71ffe08fb8317bd5699e440b440113677 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rados=C5=82aw=20Zarzy=C5=84ski?= Date: Fri, 1 Sep 2023 16:42:54 +0200 Subject: [PATCH] fix a crash due to RecoveryMessages life-time mgmt MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Radosław Zarzyński --- src/osd/ECBackend.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 3982c04414353..6c7364f5f835e 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -260,6 +260,7 @@ struct OnRecoveryReadComplete : ECBackend *backend; hobject_t hoid; + OnRecoveryReadComplete() = delete; OnRecoveryReadComplete(RecoveryMessages* rm, ECBackend *backend, const hobject_t &hoid) : rm(rm), backend(backend), hoid(hoid) {} void finish(ECBackend::read_result_t &res) override { @@ -280,6 +281,7 @@ struct RecoveryMessages : GenContext { ECBackend *ec; map recovery_reads; + RecoveryMessages* next_recovery_messages = nullptr; map> want_to_read; RecoveryMessages(ECBackend* ec) : ec(ec) {} @@ -291,6 +293,9 @@ struct RecoveryMessages : GenContext { const map>> &need, bool attrs) { + if (!next_recovery_messages) { + next_recovery_messages = new RecoveryMessages{ec}; + } list > to_read; to_read.push_back(boost::make_tuple(off, len, 0)); ceph_assert(!recovery_reads.count(hoid)); @@ -303,7 +308,7 @@ struct RecoveryMessages : GenContext { need, attrs, new OnRecoveryReadComplete( - this, + next_recovery_messages, ec, hoid)))); } @@ -311,7 +316,7 @@ struct RecoveryMessages : GenContext { map > pushes; map > push_replies; ObjectStore::Transaction t; - RecoveryMessages() {} + RecoveryMessages() = delete; ~RecoveryMessages() {} void finish(int priority) override { @@ -602,7 +607,8 @@ void ECBackend::dispatch_recovery_messages(RecoveryMessages &m, int priority) m.want_to_read, m.recovery_reads, OpRequestRef(), - false, true, new RecoveryMessages{}); + false, true, m.next_recovery_messages); + m.next_recovery_messages = nullptr; } void ECBackend::continue_recovery_op( -- 2.39.5