From: Sage Weil Date: Sun, 4 Feb 2018 16:34:25 +0000 (-0600) Subject: ceph_filestore_idempotent_sequence: fix up clone, move ops; cleanup X-Git-Tag: v12.2.6~101^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3a31b0d6779aecda4e6b539d3d949e91f326c81e;p=ceph.git ceph_filestore_idempotent_sequence: fix up clone, move ops; cleanup Signed-off-by: Sage Weil (cherry picked from commit 1c4bb2a52dab406a8a5db70a2a9321a4a4275157) --- diff --git a/src/test/objectstore/DeterministicOpSequence.cc b/src/test/objectstore/DeterministicOpSequence.cc index b54ea566483..e993583fc2e 100644 --- a/src/test/objectstore/DeterministicOpSequence.cc +++ b/src/test/objectstore/DeterministicOpSequence.cc @@ -165,7 +165,7 @@ bool DeterministicOpSequence::do_touch(rngen_t& gen) } hobject_t *obj = entry->touch_obj(obj_id); - dout(0) << "do_touch " << entry->m_coll.to_str() << "/" << obj->oid.name << dendl; + dout(0) << "do_touch " << entry->m_coll << "/" << obj << dendl; _do_touch(entry->m_coll, *obj); return true; @@ -186,7 +186,7 @@ bool DeterministicOpSequence::do_remove(rngen_t& gen) hobject_t *obj = entry->touch_obj(obj_id); ceph_assert(obj); - dout(0) << "do_remove " << entry->m_coll.to_str() << "/" << obj->oid.name << dendl; + dout(0) << "do_remove " << entry->m_coll << "/" << obj << dendl; _do_remove(entry->m_coll, *obj); hobject_t *rmobj = entry->remove_obj(obj_id); @@ -270,15 +270,20 @@ bool DeterministicOpSequence::do_write(rngen_t& gen) bufferlist bl; _gen_random(gen, size, bl); - dout(0) << "do_write " << entry->m_coll.to_str() << "/" << obj->oid.name + dout(0) << "do_write " << entry->m_coll << "/" << obj << " 0~" << size << dendl; _do_write(entry->m_coll, *obj, 0, bl.length(), bl); return true; } -bool DeterministicOpSequence::_prepare_clone(rngen_t& gen, - coll_t& coll_ret, hobject_t& orig_obj_ret, hobject_t& new_obj_ret) +bool DeterministicOpSequence::_prepare_clone( + rngen_t& gen, + coll_entry_t **entry_ret, + int *orig_obj_id, + hobject_t *orig_obj_ret, + int *new_obj_id, + hobject_t *new_obj_ret) { int coll_id = _gen_coll_id(gen); @@ -286,49 +291,49 @@ bool DeterministicOpSequence::_prepare_clone(rngen_t& gen, ceph_assert(entry != NULL); if (entry->m_objects.size() < 2) { - dout(0) << "_prepare_clone coll " << entry->m_coll.to_str() + dout(0) << "_prepare_clone coll " << entry->m_coll << " doesn't have 2 or more objects" << dendl; return false; } - int orig_obj_id = entry->get_random_obj_id(gen); - hobject_t *orig_obj = entry->touch_obj(orig_obj_id); + *orig_obj_id = entry->get_random_obj_id(gen); + hobject_t *orig_obj = entry->touch_obj(*orig_obj_id); ceph_assert(orig_obj); - int id; do { - id = entry->get_random_obj_id(gen); - } while (id == orig_obj_id); - hobject_t *new_obj = entry->touch_obj(id); + *new_obj_id = entry->get_random_obj_id(gen); + } while (*new_obj_id == *orig_obj_id); + hobject_t *new_obj = entry->touch_obj(*new_obj_id); ceph_assert(new_obj); - coll_ret = entry->m_coll; - orig_obj_ret = *orig_obj; - new_obj_ret = *new_obj; - + *entry_ret = entry; + *orig_obj_ret = *orig_obj; + *new_obj_ret = *new_obj; return true; } bool DeterministicOpSequence::do_clone(rngen_t& gen) { - coll_t coll; + coll_entry_t *entry; + int orig_id, new_id; hobject_t orig_obj, new_obj; - if (!_prepare_clone(gen, coll, orig_obj, new_obj)) { + if (!_prepare_clone(gen, &entry, &orig_id, &orig_obj, &new_id, &new_obj)) { return false; } - dout(0) << "do_clone " << coll.to_str() << "/" << orig_obj.oid.name - << " => " << coll.to_str() << "/" << new_obj.oid.name << dendl; + dout(0) << "do_clone " << entry->m_coll << "/" << orig_obj + << " => " << entry->m_coll << "/" << new_obj << dendl; - _do_clone(coll, orig_obj, new_obj); + _do_clone(entry->m_coll, orig_obj, new_obj); return true; } bool DeterministicOpSequence::do_clone_range(rngen_t& gen) { - coll_t coll; + coll_entry_t *entry; + int orig_id, new_id; hobject_t orig_obj, new_obj; - if (!_prepare_clone(gen, coll, orig_obj, new_obj)) { + if (!_prepare_clone(gen, &entry, &orig_id, &orig_obj, &new_id, &new_obj)) { return false; } @@ -347,73 +352,28 @@ bool DeterministicOpSequence::do_clone_range(rngen_t& gen) boost::uniform_int<> clone_len(1, bl.length()); size = (size_t) clone_len(gen); - dout(0) << "do_clone_range " << coll.to_str() << "/" << orig_obj.oid.name + dout(0) << "do_clone_range " << entry->m_coll << "/" << orig_obj << " (0~" << size << ")" - << " => " << coll.to_str() << "/" << new_obj.oid.name + << " => " << entry->m_coll << "/" << new_obj << " (0)" << dendl; - _do_write_and_clone_range(coll, orig_obj, new_obj, 0, size, 0, bl); + _do_write_and_clone_range(entry->m_coll, orig_obj, new_obj, 0, size, 0, bl); return true; } -bool DeterministicOpSequence::_prepare_colls(rngen_t& gen, - coll_entry_t* &orig_coll, coll_entry_t* &new_coll) -{ - ceph_assert(m_collections_ids.size() > 1); - int orig_coll_id = _gen_coll_id(gen); - int new_coll_id; - do { - new_coll_id = _gen_coll_id(gen); - } while (new_coll_id == orig_coll_id); - - dout(0) << "_prepare_colls from coll id " << orig_coll_id - << " to coll id " << new_coll_id << dendl; - - orig_coll = get_coll_at(orig_coll_id); - ceph_assert(orig_coll != NULL); - new_coll = get_coll_at(new_coll_id); - ceph_assert(new_coll != NULL); - - if (!orig_coll->m_objects.size()) { - dout(0) << "_prepare_colls coll " << orig_coll->m_coll.to_str() - << " has no objects to use" << dendl; - return false; - } - - return true; -} - - bool DeterministicOpSequence::do_coll_move(rngen_t& gen) { - coll_entry_t *orig_coll = NULL, *new_coll = NULL; - if (!_prepare_colls(gen, orig_coll, new_coll)) - return false; - - ceph_assert(orig_coll && new_coll); - - boost::uniform_int<> obj_rng(0, orig_coll->m_objects.size()-1); - int obj_pos = obj_rng(gen); - int obj_key = -1; - hobject_t *obj = orig_coll->get_obj_at(obj_pos, &obj_key); - if (!obj) { - dout(0) << "do_coll_move coll " << orig_coll->m_coll.to_str() - << " has no object as pos #" << obj_pos << " (key " << obj_key << ")" - << dendl; - return false; - } - if (new_coll->check_for_obj(obj_key)) { - dout(0) << "do_coll_move coll " << orig_coll->m_coll.to_str() - << " already has object as pos #" << obj_pos << " (key " << obj_key << ")" - << dendl; + coll_entry_t *entry; + int orig_id, new_id; + hobject_t orig_obj, new_obj; + if (!_prepare_clone(gen, &entry, &orig_id, &orig_obj, &new_id, &new_obj)) { return false; } - dout(0) << "do_coll_move " << orig_coll->m_coll.to_str() << "/" << obj->oid.name - << " => " << new_coll->m_coll.to_str() << "/" << obj->oid.name << dendl; - new_coll->touch_obj(obj_key); - orig_coll->remove_obj(obj_key); + dout(0) << "do_coll_move " << entry->m_coll << "/" << orig_obj + << " => " << entry->m_coll << "/" << new_obj << dendl; + entry->remove_obj(orig_id); - _do_coll_move(orig_coll->m_coll, new_coll->m_coll, *obj); + _do_coll_move(entry->m_coll, orig_obj, new_obj); return true; } @@ -516,13 +476,15 @@ void DeterministicOpSequence::_do_write_and_clone_range(coll_t coll, m_store->apply_transaction(&m_osr, std::move(t)); } -void DeterministicOpSequence::_do_coll_move(coll_t orig_coll, coll_t new_coll, - hobject_t& obj) +void DeterministicOpSequence::_do_coll_move(coll_t coll, + hobject_t& orig_obj, + hobject_t& new_obj) { ObjectStore::Transaction t; note_txn(&t); - t.remove(new_coll, ghobject_t(obj)); - t.collection_move_rename(orig_coll, ghobject_t(obj), new_coll, ghobject_t(obj)); + t.remove(coll, ghobject_t(new_obj)); + t.collection_move_rename(coll, ghobject_t(orig_obj), + coll, ghobject_t(new_obj)); m_store->apply_transaction(&m_osr, std::move(t)); } diff --git a/src/test/objectstore/DeterministicOpSequence.h b/src/test/objectstore/DeterministicOpSequence.h index 44ee46a7192..8f8cc12d6a0 100644 --- a/src/test/objectstore/DeterministicOpSequence.h +++ b/src/test/objectstore/DeterministicOpSequence.h @@ -80,7 +80,7 @@ class DeterministicOpSequence : public TestObjectStoreState { virtual void _do_write_and_clone_range(coll_t coll, hobject_t& orig_obj, hobject_t& new_obj, uint64_t srcoff, uint64_t srclen, uint64_t dstoff, bufferlist& bl); - virtual void _do_coll_move(coll_t orig_coll, coll_t new_coll, hobject_t& obj); + virtual void _do_coll_move(coll_t cid, hobject_t& orig_obj, hobject_t& new_obj); virtual void _do_coll_create(coll_t cid, uint32_t pg_num, uint64_t num_objs); int _gen_coll_id(rngen_t& gen); @@ -88,10 +88,13 @@ class DeterministicOpSequence : public TestObjectStoreState { void _print_status(int seq, int op); private: - bool _prepare_clone(rngen_t& gen, coll_t& coll_ret, - hobject_t& orig_obj_ret, hobject_t& new_obj_ret); - bool _prepare_colls(rngen_t& gen, - coll_entry_t* &orig_coll, coll_entry_t* &new_coll); + bool _prepare_clone( + rngen_t& gen, + coll_entry_t **entry_ret, + int *orig_obj_id, + hobject_t *orig_obj_ret, + int *new_obj_id, + hobject_t *new_obj_ret); };