From 70874399da47411e1e07824ef50dd82c4ebb6922 Mon Sep 17 00:00:00 2001 From: Zengran Zhang Date: Mon, 25 Mar 2019 16:54:54 +0800 Subject: [PATCH] osd: process_copy_chunk remove obc ref before pg unlock drop the obc ref when pg locked is more safer, if not, on_change may failed to clear it, and on_flushed may find leak. Fixes: http://tracker.ceph.com/issues/38842 Signed-off-by: Kefu Chai kchai@redhat.com Signed-off-by: Zengran Zhang --- src/osd/PrimaryLogPG.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 51713b29414..9d206ecfcc6 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -8687,7 +8687,7 @@ struct C_Copyfrom : public Context { hobject_t oid; epoch_t last_peering_reset; ceph_tid_t tid; - PrimaryLogPG::CopyOpRef cop; + PrimaryLogPG::CopyOpRef cop; // used for keeping the cop alive C_Copyfrom(PrimaryLogPG *p, hobject_t o, epoch_t lpr, const PrimaryLogPG::CopyOpRef& c) : pg(p), oid(o), last_peering_reset(lpr), @@ -8699,6 +8699,7 @@ struct C_Copyfrom : public Context { pg->lock(); if (last_peering_reset == pg->get_last_peering_reset()) { pg->process_copy_chunk(oid, tid, r); + cop.reset(); } pg->unlock(); } @@ -8731,7 +8732,7 @@ struct C_CopyChunk : public Context { hobject_t oid; epoch_t last_peering_reset; ceph_tid_t tid; - PrimaryLogPG::CopyOpRef cop; + PrimaryLogPG::CopyOpRef cop; // used for keeping the cop alive uint64_t offset = 0; C_CopyChunk(PrimaryLogPG *p, hobject_t o, epoch_t lpr, const PrimaryLogPG::CopyOpRef& c) @@ -8744,6 +8745,7 @@ struct C_CopyChunk : public Context { pg->lock(); if (last_peering_reset == pg->get_last_peering_reset()) { pg->process_copy_chunk_manifest(oid, tid, r, offset); + cop.reset(); } pg->unlock(); } -- 2.39.5