]> 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)
committerSamuel Just <sam.just@inktank.com>
Fri, 19 Jul 2013 17:39:02 +0000 (10:39 -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>
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 60b59738d533f06fa8b9a5502dfa21b802e52810..9c8d42dbf3c67d7d79388c54a9b60e7044fb4393 100644 (file)
@@ -5517,10 +5517,14 @@ void ReplicatedPG::submit_push_data(
   ObjectStore::Transaction *t)
 {
   coll_t target_coll;
-  if (first && complete)
+  if (first && complete) {
     target_coll = coll;
-  else
+  } else {
+    dout(10) << __func__ << ": Creating oid "
+            << recovery_info.soid << " in the temp collection" << dendl;
+    temp_contents.insert(recovery_info.soid);
     target_coll = get_temp_coll(t);
+  }
 
   if (first) {
     pg_log.revise_have(recovery_info.soid, eversion_t());
@@ -5547,8 +5551,13 @@ void ReplicatedPG::submit_push_data(
              attrs);
 
   if (complete) {
-    if (!first)
+    if (!first) {
+      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, target_coll, recovery_info.soid);
+    }
 
     submit_push_complete(recovery_info, t);
   }
@@ -6702,6 +6711,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()
@@ -6751,6 +6769,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 8fc21a8806806b753d6c8b589ddecdfd43f0344a..0d4867f6e6dedd41b4aa63080048ed79a2e40baa 100644 (file)
@@ -551,6 +551,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,