From: Manali Kulkarni Date: Tue, 27 Sep 2016 14:23:39 +0000 (-0400) Subject: os/kstore: add merge_delete X-Git-Tag: v11.1.0~652^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=20c45678e61c66ca4401c8664c4d51b4ebdd7064;p=ceph.git os/kstore: add merge_delete Signed-off-by: Manali Kulkarni --- diff --git a/src/os/kstore/KStore.cc b/src/os/kstore/KStore.cc index abd322fd7edd..31af5c275517 100755 --- a/src/os/kstore/KStore.cc +++ b/src/os/kstore/KStore.cc @@ -2363,6 +2363,16 @@ void KStore::_txc_add_transaction(TransContext *txc, Transaction *t) } break; + case Transaction::OP_MERGE_DELETE: + { + const ghobject_t& boid = i.get_oid(op->dest_oid); + OnodeRef bo = c->get_onode(boid, true); + vector> move_info; + i.decode_move_info(move_info); + r = _move_ranges_destroy_src(txc, c, o, cvec[op->dest_cid], bo, move_info); + } + break; + case Transaction::OP_COLL_ADD: assert(0 == "not implemented"); break; @@ -3172,6 +3182,48 @@ int KStore::_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 KStore::_move_ranges_destroy_src(TransContext *txc, + CollectionRef& c, + OnodeRef& srco, + CollectionRef& basec, + OnodeRef& baseo, + vector> move_info) +{ + int r = 0; + bufferlist bl; + baseo->exists = true; + _assign_nid(txc, baseo); + +// Traverse move_info completely, move contents from src to base object. + for (unsigned i = 0; i < move_info.size(); ++i) { + uint64_t srcoff; + uint64_t dstoff; + uint64_t len; + + srcoff = move_info[i].get<0>(); + dstoff = move_info[i].get<1>(); + len = move_info[i].get<2>(); + + r = _do_read(srco, srcoff, len, bl, 0); + if (r < 0) + goto out; + + r = _do_write(txc, baseo, dstoff, bl.length(), bl, 0); + txc->write_onode(baseo); + r = 0; + } + +// After for loop ends, remove src obj + r = _do_remove(txc, srco); + + out: + return r; +} + + int KStore::_rename(TransContext *txc, CollectionRef& c, OnodeRef& oldo, diff --git a/src/os/kstore/KStore.h b/src/os/kstore/KStore.h index 6230764dd813..103a45a7b74f 100644 --- a/src/os/kstore/KStore.h +++ b/src/os/kstore/KStore.h @@ -625,6 +625,12 @@ 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, + CollectionRef& bc, + OnodeRef& newo, + vector> move_info); int _rename(TransContext *txc, CollectionRef& c, OnodeRef& oldo,