From: Manali Kulkarni Date: Tue, 27 Sep 2016 14:24:10 +0000 (-0400) Subject: os/bluestore: add merge_delete X-Git-Tag: v11.1.0~652^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8105ded227bfd783c27e23ba26f2d0285e563340;p=ceph.git os/bluestore: add merge_delete Signed-off-by: Manali Kulkarni --- diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 627ee25fdc8d..d4231468b71d 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -6720,6 +6720,19 @@ void BlueStore::_txc_add_transaction(TransContext *txc, Transaction *t) } break; + case Transaction::OP_MERGE_DELETE: + { + const ghobject_t& noid = i.get_oid(op->dest_oid); + OnodeRef& no = ovec[op->dest_oid]; + if (!no) { + no = c->get_onode(noid, true); + } + vector> move_info; + i.decode_move_info(move_info); + r = _move_ranges_destroy_src(txc, c, o, no, move_info); + } + break; + case Transaction::OP_COLL_ADD: assert(0 == "not implemented"); break; @@ -8183,6 +8196,41 @@ int BlueStore::_clone_range(TransContext *txc, return r; } +/* Move contents of src object according to move_info to base object. + * Once the move_info is traversed completely, delete the src object. + */ +int BlueStore::_move_ranges_destroy_src(TransContext *txc, + CollectionRef& c, + OnodeRef& srco, + OnodeRef& baseo, + const vector> move_info) +{ + dout(15) << __func__ << " " << c->cid << " " << srco->oid << " -> " << baseo->oid << dendl; + + int r = 0; + + //Traverse move_info completely, move contents from src object to base object. + for (unsigned i = 0; i < move_info.size(); ++i) { + uint64_t srcoff = move_info[i].get<0>(); + uint64_t dstoff = move_info[i].get<1>(); + uint64_t len = move_info[i].get<2>(); + + dout(15) << __func__ << " " << c->cid << " " << srco->oid << " -> " + << baseo->oid << " from 0x" << std::hex << srcoff << "~" << len + << " to offset 0x" << dstoff << std::dec << dendl; + + r = _clone_range(txc, c, srco, baseo, srcoff, len, dstoff); + if (r < 0) + goto out; + } + + // delete the src object + r = _do_remove(txc, c, srco); + + out: + return r; +} + int BlueStore::_rename(TransContext *txc, CollectionRef& c, OnodeRef& oldo, diff --git a/src/os/bluestore/BlueStore.h b/src/os/bluestore/BlueStore.h index 362e0316cf9f..5361cfade811 100644 --- a/src/os/bluestore/BlueStore.h +++ b/src/os/bluestore/BlueStore.h @@ -1872,6 +1872,11 @@ private: OnodeRef& oldo, OnodeRef& newo, uint64_t srcoff, uint64_t length, uint64_t dstoff); + int _move_ranges_destroy_src(TransContext *txc, + CollectionRef& c, + OnodeRef& oldo, + OnodeRef& newo, + const vector> move_info); int _rename(TransContext *txc, CollectionRef& c, OnodeRef& oldo,