From: Samuel Just Date: Mon, 3 Mar 2014 23:33:51 +0000 (-0800) Subject: ECBackend,ReplicatedPG: delete temp if we didn't get the transaction X-Git-Tag: v0.78~90^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F1367%2Fhead;p=ceph.git ECBackend,ReplicatedPG: delete temp if we didn't get the transaction 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 --- diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 64bdd2f7e7bf..65dcacbdde07 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -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::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, diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 6561429fb9ce..5fee83428f78 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -7167,6 +7167,9 @@ void ReplicatedBackend::sub_op_modify(OpRequestRef op) vector 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) {