]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: track temp collection contents, clear during on_change
authorSamuel Just <sam.just@inktank.com>
Fri, 19 Jul 2013 02:26:02 +0000 (19:26 -0700)
committerSage Weil <sage@inktank.com>
Wed, 24 Jul 2013 23:20:35 +0000 (16:20 -0700)
We also assert in on_flushed() that the temp collection is actually
empty.

Fixes: #5670
Signed-off-by: Samuel Just <sam.just@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
(cherry picked from commit 47516d9c4b7f023f3a16e166749fa7b1c7b3b24c)

Conflicts:

src/osd/ReplicatedPG.cc

src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 736da8b3bbb96673ef2c0ee792c7d3c5bd862bd9..7acbca323b8eccc14a4ef82a475d224c8ad3c679 100644 (file)
@@ -5260,6 +5260,9 @@ void ReplicatedPG::submit_push_data(
   ObjectStore::Transaction *t)
 {
   if (first) {
+    dout(10) << __func__ << ": Creating oid "
+            << recovery_info.soid << " in the temp collection" << dendl;
+    temp_contents.insert(recovery_info.soid);
     missing.revise_have(recovery_info.soid, eversion_t());
     remove_snap_mapped_object(*t, recovery_info.soid);
     t->remove(get_temp_coll(t), recovery_info.soid);
@@ -5287,6 +5290,10 @@ void ReplicatedPG::submit_push_complete(ObjectRecoveryInfo &recovery_info,
                                        ObjectStore::Transaction *t)
 {
   remove_snap_mapped_object(*t, recovery_info.soid);
+  assert(temp_contents.count(recovery_info.soid));
+  dout(10) << __func__ << ": Removing oid "
+          << recovery_info.soid << " from the temp collection" << dendl;
+  temp_contents.erase(recovery_info.soid);
   t->collection_move(coll, get_temp_coll(t), recovery_info.soid);
   for (map<hobject_t, interval_set<uint64_t> >::const_iterator p =
         recovery_info.clone_subset.begin();
@@ -6315,6 +6322,15 @@ void ReplicatedPG::on_shutdown()
 void ReplicatedPG::on_flushed()
 {
   assert(object_contexts.empty());
+  if (have_temp_coll() &&
+      !osd->store->collection_empty(get_temp_coll())) {
+    vector<hobject_t> objects;
+    osd->store->collection_list(get_temp_coll(), objects);
+    derr << __func__ << ": found objects in the temp collection: "
+        << objects << ", crashing now"
+        << dendl;
+    assert(0 == "found garbage in the temp collection");
+  }
 }
 
 void ReplicatedPG::on_activate()
@@ -6365,6 +6381,16 @@ void ReplicatedPG::on_change(ObjectStore::Transaction *t)
   pulling.clear();
   pull_from_peer.clear();
 
+  // clear temp
+  for (set<hobject_t>::iterator i = temp_contents.begin();
+       i != temp_contents.end();
+       ++i) {
+    dout(10) << __func__ << ": Removing oid "
+            << *i << " from the temp collection" << dendl;
+    t->remove(get_temp_coll(t), *i);
+  }
+  temp_contents.clear();
+
   // clear snap_trimmer state
   snap_trimmer_machine.process_event(Reset());
 
index 6bba4c5759587090fe5f438045b8eb3422466a11..5b989442305dd8d8ced2e2c2c2131f83224581f9 100644 (file)
@@ -545,6 +545,9 @@ protected:
   };
   map<hobject_t, PullInfo> pulling;
 
+  // Track contents of temp collection, clear on reset
+  set<hobject_t> temp_contents;
+
   ObjectRecoveryInfo recalc_subsets(const ObjectRecoveryInfo& recovery_info);
   static void trim_pushed_data(const interval_set<uint64_t> &copy_subset,
                               const interval_set<uint64_t> &intervals_received,