]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: clear PG_STATE_CLEAN when repair object 30050/head
authorZengran Zhang <zhangzengran@sangfor.com.cn>
Tue, 20 Aug 2019 07:06:09 +0000 (15:06 +0800)
committerNathan Cutler <ncutler@suse.com>
Fri, 30 Aug 2019 22:00:41 +0000 (00:00 +0200)
there is a race be found, when we repair object on clean state,
we queue a DoRecovery peering event, but before the peering event
dequeue,a snaptrim event on the missing object's snap dequeue,
then we will get pass the context< SnapTrimmer >().can_trim()
and go to get the context of the missing object(snapdir)

we can avoid this by clear clean state when we found missing..

Fixes: https://tracker.ceph.com/issues/41348
Signed-off-by: Zengran Zhang <zhangzengran@sangfor.com.cn>
(cherry picked from commit 521f095c6505bbee7570fb3c01b32436bdbf65a4)

src/osd/PrimaryLogPG.cc

index c034383c9f22cad124625f5208b2107fc35ccd82..90fe881d9dcff899190e80941491f1bddef2be49 100644 (file)
@@ -15257,6 +15257,7 @@ int PrimaryLogPG::rep_repair_primary_object(const hobject_t& soid, OpContext *ct
     eio_errors_to_process = true;
     ceph_assert(is_clean());
     state_set(PG_STATE_REPAIR);
+    state_clear(PG_STATE_CLEAN);
     queue_peering_event(
         PGPeeringEventRef(
          std::make_shared<PGPeeringEvent>(