]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ECBackend,ReplicatedPG: delete temp if we didn't get the transaction 1367/head
authorSamuel Just <sam.just@inktank.com>
Mon, 3 Mar 2014 23:33:51 +0000 (15:33 -0800)
committerSamuel Just <sam.just@inktank.com>
Tue, 4 Mar 2014 23:29:20 +0000 (15:29 -0800)
We always send the transaction for operations on temp objects,
but if we didn't get the final transacition on the actual object,
we might end up failing to remove the temp object.  Thus, if
we get a sub op and don't have the transaction, just remove the
named temp objects.

Fixes: #7447
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/ECBackend.cc
src/osd/ReplicatedPG.cc

index 64bdd2f7e7bf2ad3f308b738b4f06d7a0f616730..65dcacbdde07d8c7a28f9d14d71b574a49a584aa 100644 (file)
@@ -801,6 +801,15 @@ void ECBackend::handle_sub_write(
     get_temp_coll(localt);
     add_temp_objs(op.temp_added);
   }
+  if (op.t.empty()) {
+    for (set<hobject_t>::iterator i = op.temp_removed.begin();
+        i != op.temp_removed.end();
+        ++i) {
+      dout(10) << __func__ << ": removing object " << *i
+              << " since we won't get the transaction" << dendl;
+      localt->remove(temp_coll, *i);
+    }
+  }
   clear_temp_objs(op.temp_removed);
   get_parent()->log_operation(
     op.log_entries,
index 6561429fb9ce1effdb80b19041debc2ab9262b00..5fee83428f78f55d1cd1757028e5aff01635c5c5 100644 (file)
@@ -7167,6 +7167,9 @@ void ReplicatedBackend::sub_op_modify(OpRequestRef op)
     vector<pg_log_entry_t> log;
 
     bufferlist::iterator p = m->get_data().begin();
+    ::decode(rm->opt, p);
+    if (!(m->get_connection()->get_features() & CEPH_FEATURE_OSD_SNAPMAPPER))
+      rm->opt.set_tolerate_collection_add_enoent();
 
     if (m->new_temp_oid != hobject_t()) {
       dout(20) << __func__ << " start tracking temp " << m->new_temp_oid << dendl;
@@ -7175,12 +7178,14 @@ void ReplicatedBackend::sub_op_modify(OpRequestRef op)
     }
     if (m->discard_temp_oid != hobject_t()) {
       dout(20) << __func__ << " stop tracking temp " << m->discard_temp_oid << dendl;
+      if (rm->opt.empty()) {
+       dout(10) << __func__ << ": removing object " << m->discard_temp_oid
+                << " since we won't get the transaction" << dendl;
+       rm->localt.remove(temp_coll, m->discard_temp_oid);
+      }
       clear_temp_obj(m->discard_temp_oid);
     }
 
-    ::decode(rm->opt, p);
-    if (!(m->get_connection()->get_features() & CEPH_FEATURE_OSD_SNAPMAPPER))
-      rm->opt.set_tolerate_collection_add_enoent();
     p = m->logbl.begin();
     ::decode(log, p);
     if (m->hobject_incorrect_pool) {