From d0b1094ff7b98ef9262ecb45ee8324853003a77c Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 3 Mar 2014 15:33:51 -0800 Subject: [PATCH] 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 --- src/osd/ECBackend.cc | 9 +++++++++ src/osd/ReplicatedPG.cc | 11 ++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 64bdd2f7e7b..65dcacbdde0 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 6561429fb9c..5fee83428f7 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) { -- 2.47.3