]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/: clear scrub store safetly
authorSamuel Just <sjust@redhat.com>
Tue, 23 Feb 2016 19:50:46 +0000 (11:50 -0800)
committerKefu Chai <kchai@redhat.com>
Thu, 25 Feb 2016 04:41:55 +0000 (12:41 +0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/osd/PG.cc
src/osd/PG.h
src/osd/ReplicatedPG.cc

index 4a673c0869405db4dc3a66cde6c0ffdb3fdff9b1..919e699a4a34aeb569e035975e65242e1f849fc8 100644 (file)
@@ -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<Scrub::Store> store;
+    OnComplete(
+      std::unique_ptr<Scrub::Store> &&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<pair<ScrubMap::object, pg_shard_t> > *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);
index 5c5da020cff48c7a073e50c6ced0bb4f2e9a4ab2..3f64adbf87d44d61994e7e0a61994d25ac7548a9 100644 (file)
@@ -1206,6 +1206,7 @@ public:
     }
 
     void create_results(const hobject_t& obj);
+    void cleanup_store(ObjectStore::Transaction *t);
   } scrubber;
 
   bool scrub_after_recovery;
index 23000bd96d006a87d04c9b4b4c108b3f0143f3c1..3b8fe54fd6d9b15bac9349ded96c83f776448fbb 100644 (file)
@@ -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