From: Samuel Just Date: Tue, 23 Feb 2016 19:50:46 +0000 (-0800) Subject: osd/: clear scrub store safetly X-Git-Tag: v10.1.0~303^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8ed62772bd436975e26605f386d069ed98f41c8b;p=ceph.git osd/: clear scrub store safetly Signed-off-by: Samuel Just --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 4a673c08694..919e699a4a3 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3769,6 +3769,21 @@ int PG::build_scrub_map_chunk( return 0; } +void PG::Scrubber::cleanup_store(ObjectStore::Transaction *t) { + if (!store) + return; + struct OnComplete : Context { + std::unique_ptr store; + OnComplete( + std::unique_ptr &&store) + : store(std::move(store)) {} + void finish(int) override {} + }; + store->cleanup(t); + t->register_on_complete(new OnComplete(std::move(store))); + assert(!store); +} + void PG::repair_object( const hobject_t& soid, list > *ok_peers, pg_shard_t bad_peer) @@ -4029,6 +4044,7 @@ void PG::chunky_scrub(ThreadPool::TPHandle &handle) { ObjectStore::Transaction t; + scrubber.cleanup_store(&t); scrubber.store.reset(Scrub::Store::create(osd->store, &t, info.pgid, coll)); osd->store->queue_transaction(osr.get(), std::move(t), nullptr); diff --git a/src/osd/PG.h b/src/osd/PG.h index 5c5da020cff..3f64adbf87d 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1206,6 +1206,7 @@ public: } void create_results(const hobject_t& obj); + void cleanup_store(ObjectStore::Transaction *t); } scrubber; bool scrub_after_recovery; diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 23000bd96d0..3b8fe54fd6d 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -9793,6 +9793,7 @@ void ReplicatedPG::on_change(ObjectStore::Transaction *t) apply_and_flush_repops(is_primary()); pgbackend->on_change_cleanup(t); + scrubber.cleanup_store(t); pgbackend->on_change(); // clear snap_trimmer state