From 5d306fd015d3e6d0aa35f368d3ca6cde6e7ca77b Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 8 Dec 2016 18:27:33 -0500 Subject: [PATCH] librbd: convert ObjectMap to template for unit testing Signed-off-by: Jason Dillaman (cherry picked from commit ea7b30a4fb105e052603c55ac2dc2aca11e66545) Conflicts: src/librbd/image/CreateRequest.cc: not in jewel src/librbd/internal.cc: trivial resolution src/librbd/object_map/CreateRequest.cc: not in jewel src/librbd/object_map/RemoveRequest.cc: not in jewel src/test/librbd/test_ObjectMap.cc: trivial resolution --- src/librbd/DiffIterate.cc | 4 +- src/librbd/ImageCtx.cc | 4 +- src/librbd/ImageCtx.h | 6 +- src/librbd/ObjectMap.cc | 68 ++++++++++++------- src/librbd/ObjectMap.h | 11 ++- src/librbd/Operations.cc | 4 +- src/librbd/image/SetSnapRequest.cc | 2 +- src/librbd/image/SetSnapRequest.h | 4 +- src/librbd/internal.cc | 16 ++--- src/librbd/object_map/LockRequest.cc | 6 +- src/librbd/object_map/RefreshRequest.cc | 8 +-- src/librbd/object_map/RefreshRequest.h | 6 ++ src/librbd/object_map/ResizeRequest.cc | 2 +- .../object_map/SnapshotCreateRequest.cc | 6 +- .../object_map/SnapshotRemoveRequest.cc | 6 +- .../object_map/SnapshotRollbackRequest.cc | 5 +- src/librbd/object_map/UnlockRequest.cc | 2 +- src/librbd/object_map/UnlockRequest.h | 4 ++ src/librbd/object_map/UpdateRequest.cc | 10 ++- src/librbd/object_map/UpdateRequest.h | 16 ++++- .../object_map/test_mock_LockRequest.cc | 9 ++- .../object_map/test_mock_RefreshRequest.cc | 8 ++- .../object_map/test_mock_ResizeRequest.cc | 2 +- .../test_mock_SnapshotCreateRequest.cc | 10 +-- .../test_mock_SnapshotRemoveRequest.cc | 6 +- .../test_mock_SnapshotRollbackRequest.cc | 10 +-- .../object_map/test_mock_UnlockRequest.cc | 3 +- .../object_map/test_mock_UpdateRequest.cc | 12 ++-- src/test/librbd/test_ObjectMap.cc | 12 ++-- src/test/librbd/test_internal.cc | 2 +- .../test_mock_SnapshotCreateRequest.cc | 4 +- .../image_sync/SnapshotCreateRequest.cc | 2 +- 32 files changed, 165 insertions(+), 105 deletions(-) diff --git a/src/librbd/DiffIterate.cc b/src/librbd/DiffIterate.cc index 9b0a3ac3daa8..9a229dd83419 100644 --- a/src/librbd/DiffIterate.cc +++ b/src/librbd/DiffIterate.cc @@ -382,8 +382,8 @@ int DiffIterate::diff_object_map(uint64_t from_snap_id, uint64_t to_snap_id, } BitVector<2> object_map; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, - current_snap_id)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, + current_snap_id)); r = cls_client::object_map_load(&m_image_ctx.md_ctx, oid, &object_map); if (r < 0) { lderr(cct) << "diff_object_map: failed to load object map " << oid diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index 4226d4274713..863a1235e4aa 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -995,8 +995,8 @@ struct C_InvalidateCache : public Context { return new ExclusiveLock(*this); } - ObjectMap *ImageCtx::create_object_map(uint64_t snap_id) { - return new ObjectMap(*this, snap_id); + ObjectMap *ImageCtx::create_object_map(uint64_t snap_id) { + return new ObjectMap(*this, snap_id); } Journal *ImageCtx::create_journal() { diff --git a/src/librbd/ImageCtx.h b/src/librbd/ImageCtx.h index b8a3bf6cf24a..c1cec019d808 100644 --- a/src/librbd/ImageCtx.h +++ b/src/librbd/ImageCtx.h @@ -45,7 +45,7 @@ namespace librbd { template class ImageWatcher; template class Journal; class LibrbdAdminSocketHook; - class ObjectMap; + template class ObjectMap; template class Operations; class LibrbdWriteback; @@ -141,7 +141,7 @@ namespace librbd { Operations *operations; ExclusiveLock *exclusive_lock; - ObjectMap *object_map; + ObjectMap *object_map; xlist*> resize_reqs; @@ -287,7 +287,7 @@ namespace librbd { void apply_metadata(const std::map &meta); ExclusiveLock *create_exclusive_lock(); - ObjectMap *create_object_map(uint64_t snap_id); + ObjectMap *create_object_map(uint64_t snap_id); Journal *create_journal(); void clear_pending_completions(); diff --git a/src/librbd/ObjectMap.cc b/src/librbd/ObjectMap.cc index e1e7220d4ccb..9d57ea8b5a12 100644 --- a/src/librbd/ObjectMap.cc +++ b/src/librbd/ObjectMap.cc @@ -30,17 +30,20 @@ namespace librbd { -ObjectMap::ObjectMap(ImageCtx &image_ctx, uint64_t snap_id) +template +ObjectMap::ObjectMap(I &image_ctx, uint64_t snap_id) : m_image_ctx(image_ctx), m_snap_id(snap_id) { } -int ObjectMap::remove(librados::IoCtx &io_ctx, const std::string &image_id) { +template +int ObjectMap::remove(librados::IoCtx &io_ctx, const std::string &image_id) { return io_ctx.remove(object_map_name(image_id, CEPH_NOSNAP)); } -std::string ObjectMap::object_map_name(const std::string &image_id, - uint64_t snap_id) { +template +std::string ObjectMap::object_map_name(const std::string &image_id, + uint64_t snap_id) { std::string oid(RBD_OBJECT_MAP_PREFIX + image_id); if (snap_id != CEPH_NOSNAP) { std::stringstream snap_suffix; @@ -51,26 +54,30 @@ std::string ObjectMap::object_map_name(const std::string &image_id, return oid; } -bool ObjectMap::is_compatible(const file_layout_t& layout, uint64_t size) { +template +bool ObjectMap::is_compatible(const file_layout_t& layout, uint64_t size) { uint64_t object_count = Striper::get_num_objects(layout, size); return (object_count <= cls::rbd::MAX_OBJECT_MAP_OBJECT_COUNT); } -ceph::BitVector<2u>::Reference ObjectMap::operator[](uint64_t object_no) +template +ceph::BitVector<2u>::Reference ObjectMap::operator[](uint64_t object_no) { assert(m_image_ctx.object_map_lock.is_wlocked()); assert(object_no < m_object_map.size()); return m_object_map[object_no]; } -uint8_t ObjectMap::operator[](uint64_t object_no) const +template +uint8_t ObjectMap::operator[](uint64_t object_no) const { assert(m_image_ctx.object_map_lock.is_locked()); assert(object_no < m_object_map.size()); return m_object_map[object_no]; } -bool ObjectMap::object_may_exist(uint64_t object_no) const +template +bool ObjectMap::object_may_exist(uint64_t object_no) const { assert(m_image_ctx.snap_lock.is_locked()); @@ -91,7 +98,8 @@ bool ObjectMap::object_may_exist(uint64_t object_no) const return exists; } -bool ObjectMap::update_required(uint64_t object_no, uint8_t new_state) { +template +bool ObjectMap::update_required(uint64_t object_no, uint8_t new_state) { assert(m_image_ctx.object_map_lock.is_wlocked()); uint8_t state = (*this)[object_no]; @@ -103,24 +111,26 @@ bool ObjectMap::update_required(uint64_t object_no, uint8_t new_state) { return true; } -void ObjectMap::open(Context *on_finish) { - object_map::RefreshRequest<> *req = new object_map::RefreshRequest<>( +template +void ObjectMap::open(Context *on_finish) { + auto req = object_map::RefreshRequest::create( m_image_ctx, &m_object_map, m_snap_id, on_finish); req->send(); } -void ObjectMap::close(Context *on_finish) { +template +void ObjectMap::close(Context *on_finish) { if (m_snap_id != CEPH_NOSNAP) { m_image_ctx.op_work_queue->queue(on_finish, 0); return; } - object_map::UnlockRequest<> *req = new object_map::UnlockRequest<>( - m_image_ctx, on_finish); + auto req = object_map::UnlockRequest::create(m_image_ctx, on_finish); req->send(); } -void ObjectMap::rollback(uint64_t snap_id, Context *on_finish) { +template +void ObjectMap::rollback(uint64_t snap_id, Context *on_finish) { assert(m_image_ctx.snap_lock.is_locked()); assert(m_image_ctx.object_map_lock.is_wlocked()); @@ -129,7 +139,8 @@ void ObjectMap::rollback(uint64_t snap_id, Context *on_finish) { req->send(); } -void ObjectMap::snapshot_add(uint64_t snap_id, Context *on_finish) { +template +void ObjectMap::snapshot_add(uint64_t snap_id, Context *on_finish) { assert(m_image_ctx.snap_lock.is_locked()); assert((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) != 0); assert(snap_id != CEPH_NOSNAP); @@ -140,7 +151,8 @@ void ObjectMap::snapshot_add(uint64_t snap_id, Context *on_finish) { req->send(); } -void ObjectMap::snapshot_remove(uint64_t snap_id, Context *on_finish) { +template +void ObjectMap::snapshot_remove(uint64_t snap_id, Context *on_finish) { assert(m_image_ctx.snap_lock.is_wlocked()); assert((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) != 0); assert(snap_id != CEPH_NOSNAP); @@ -151,7 +163,8 @@ void ObjectMap::snapshot_remove(uint64_t snap_id, Context *on_finish) { req->send(); } -void ObjectMap::aio_save(Context *on_finish) { +template +void ObjectMap::aio_save(Context *on_finish) { assert(m_image_ctx.owner_lock.is_locked()); assert(m_image_ctx.snap_lock.is_locked()); assert(m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP, @@ -172,8 +185,9 @@ void ObjectMap::aio_save(Context *on_finish) { comp->release(); } -void ObjectMap::aio_resize(uint64_t new_size, uint8_t default_object_state, - Context *on_finish) { +template +void ObjectMap::aio_resize(uint64_t new_size, uint8_t default_object_state, + Context *on_finish) { assert(m_image_ctx.owner_lock.is_locked()); assert(m_image_ctx.snap_lock.is_locked()); assert(m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP, @@ -188,10 +202,11 @@ void ObjectMap::aio_resize(uint64_t new_size, uint8_t default_object_state, req->send(); } -void ObjectMap::aio_update(uint64_t snap_id, uint64_t start_object_no, - uint64_t end_object_no, uint8_t new_state, - const boost::optional ¤t_state, - Context *on_finish) { +template +void ObjectMap::aio_update(uint64_t snap_id, uint64_t start_object_no, + uint64_t end_object_no, uint8_t new_state, + const boost::optional ¤t_state, + Context *on_finish) { assert(m_image_ctx.snap_lock.is_locked()); assert((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) != 0); assert(snap_id != CEPH_NOSNAP || m_image_ctx.owner_lock.is_locked()); @@ -227,10 +242,13 @@ void ObjectMap::aio_update(uint64_t snap_id, uint64_t start_object_no, } } - object_map::UpdateRequest *req = new object_map::UpdateRequest( + auto req = object_map::UpdateRequest::create( m_image_ctx, &m_object_map, snap_id, start_object_no, end_object_no, new_state, current_state, on_finish); req->send(); } } // namespace librbd + +template class librbd::ObjectMap; + diff --git a/src/librbd/ObjectMap.h b/src/librbd/ObjectMap.h index 44ddaf0548a8..3ac857322f17 100644 --- a/src/librbd/ObjectMap.h +++ b/src/librbd/ObjectMap.h @@ -21,9 +21,14 @@ namespace librbd { class ImageCtx; +template class ObjectMap { public: - ObjectMap(ImageCtx &image_ctx, uint64_t snap_id); + static ObjectMap *create(ImageCtxT &image_ctx, uint64_t snap_id) { + return new ObjectMap(image_ctx, snap_id); + } + + ObjectMap(ImageCtxT &image_ctx, uint64_t snap_id); static int remove(librados::IoCtx &io_ctx, const std::string &image_id); static std::string object_map_name(const std::string &image_id, @@ -85,7 +90,7 @@ public: void snapshot_remove(uint64_t snap_id, Context *on_finish); private: - ImageCtx &m_image_ctx; + ImageCtxT &m_image_ctx; ceph::BitVector<2> m_object_map; uint64_t m_snap_id; @@ -99,4 +104,6 @@ private: } // namespace librbd +extern template class librbd::ObjectMap; + #endif // CEPH_LIBRBD_OBJECT_MAP_H diff --git a/src/librbd/Operations.cc b/src/librbd/Operations.cc index 31a503f4d4f1..030ed6d70b2b 100644 --- a/src/librbd/Operations.cc +++ b/src/librbd/Operations.cc @@ -544,7 +544,7 @@ int Operations::resize(uint64_t size, ProgressContext& prog_ctx) { } if (m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP) && - !ObjectMap::is_compatible(m_image_ctx.layout, size)) { + !ObjectMap<>::is_compatible(m_image_ctx.layout, size)) { lderr(cct) << "New size not compatible with object map" << dendl; return -EINVAL; } @@ -582,7 +582,7 @@ void Operations::execute_resize(uint64_t size, ProgressContext &prog_ctx, return; } else if (m_image_ctx.test_features(RBD_FEATURE_OBJECT_MAP, m_image_ctx.snap_lock) && - !ObjectMap::is_compatible(m_image_ctx.layout, size)) { + !ObjectMap<>::is_compatible(m_image_ctx.layout, size)) { m_image_ctx.snap_lock.put_read(); on_finish->complete(-EINVAL); return; diff --git a/src/librbd/image/SetSnapRequest.cc b/src/librbd/image/SetSnapRequest.cc index 50d485ce54e7..def86f99a5d8 100644 --- a/src/librbd/image/SetSnapRequest.cc +++ b/src/librbd/image/SetSnapRequest.cc @@ -262,7 +262,7 @@ Context *SetSnapRequest::send_open_object_map(int *result) { using klass = SetSnapRequest; Context *ctx = create_context_callback< klass, &klass::handle_open_object_map>(this); - m_object_map = new ObjectMap(m_image_ctx, m_snap_id); + m_object_map = ObjectMap::create(m_image_ctx, m_snap_id); m_object_map->open(ctx); return nullptr; } diff --git a/src/librbd/image/SetSnapRequest.h b/src/librbd/image/SetSnapRequest.h index 1e2df49bcf14..b64fa68afa0c 100644 --- a/src/librbd/image/SetSnapRequest.h +++ b/src/librbd/image/SetSnapRequest.h @@ -12,7 +12,7 @@ namespace librbd { template class ExclusiveLock; class ImageCtx; -class ObjectMap; +template class ObjectMap; namespace image { @@ -84,7 +84,7 @@ private: uint64_t m_snap_id; ExclusiveLock *m_exclusive_lock; - ObjectMap *m_object_map; + ObjectMap *m_object_map; RefreshParentRequest *m_refresh_parent; bool m_writes_blocked; diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 68d195be5e2f..f02c186b19c7 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -76,7 +76,7 @@ int remove_object_map(ImageCtx *ictx) { int r; for (std::map::iterator it = ictx->snap_info.begin(); it != ictx->snap_info.end(); ++it) { - std::string oid(ObjectMap::object_map_name(ictx->id, it->first)); + std::string oid(ObjectMap<>::object_map_name(ictx->id, it->first)); r = ictx->md_ctx.remove(oid); if (r < 0 && r != -ENOENT) { lderr(cct) << "failed to remove object map " << oid << ": " @@ -85,7 +85,7 @@ int remove_object_map(ImageCtx *ictx) { } } - r = ictx->md_ctx.remove(ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP)); + r = ictx->md_ctx.remove(ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP)); if (r < 0 && r != -ENOENT) { lderr(cct) << "failed to remove object map: " << cpp_strerror(r) << dendl; return r; @@ -107,7 +107,7 @@ int create_object_map(ImageCtx *ictx) { snap_ids.push_back(it->first); } - if (!ObjectMap::is_compatible(ictx->layout, max_size)) { + if (!ObjectMap<>::is_compatible(ictx->layout, max_size)) { lderr(cct) << "image size not compatible with object map" << dendl; return -EINVAL; } @@ -115,7 +115,7 @@ int create_object_map(ImageCtx *ictx) { for (std::vector::iterator it = snap_ids.begin(); it != snap_ids.end(); ++it) { librados::ObjectWriteOperation op; - std::string oid(ObjectMap::object_map_name(ictx->id, *it)); + std::string oid(ObjectMap<>::object_map_name(ictx->id, *it)); uint64_t snap_size = ictx->get_image_size(*it); cls_client::object_map_resize(&op, Striper::get_num_objects(ictx->layout, snap_size), OBJECT_NONEXISTENT); @@ -1139,7 +1139,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, layout.stripe_count = stripe_count; } - if (!ObjectMap::is_compatible(layout, size)) { + if (!ObjectMap<>::is_compatible(layout, size)) { lderr(cct) << "image size not compatible with object map" << dendl; goto err_remove_header; } @@ -1147,7 +1147,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, librados::ObjectWriteOperation op; cls_client::object_map_resize(&op, Striper::get_num_objects(layout, size), OBJECT_NONEXISTENT); - r = io_ctx.operate(ObjectMap::object_map_name(id, CEPH_NOSNAP), &op); + r = io_ctx.operate(ObjectMap<>::object_map_name(id, CEPH_NOSNAP), &op); if (r < 0) { lderr(cct) << "error creating initial object map: " << cpp_strerror(r) << dendl; @@ -1204,7 +1204,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, err_remove_object_map: if ((features & RBD_FEATURE_OBJECT_MAP) != 0) { - remove_r = ObjectMap::remove(io_ctx, id); + remove_r = ObjectMap<>::remove(io_ctx, id); if (remove_r < 0) { lderr(cct) << "error cleaning up object map after creation failed: " << cpp_strerror(remove_r) << dendl; @@ -2247,7 +2247,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force, } ldout(cct, 10) << "removing object map..." << dendl; - r = ObjectMap::remove(io_ctx, id); + r = ObjectMap<>::remove(io_ctx, id); if (r < 0 && r != -ENOENT) { lderr(cct) << "error removing image object map" << dendl; return r; diff --git a/src/librbd/object_map/LockRequest.cc b/src/librbd/object_map/LockRequest.cc index 3af50735e431..213799aabc5c 100644 --- a/src/librbd/object_map/LockRequest.cc +++ b/src/librbd/object_map/LockRequest.cc @@ -32,7 +32,7 @@ void LockRequest::send() { template void LockRequest::send_lock() { CephContext *cct = m_image_ctx.cct; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); ldout(cct, 10) << this << " " << __func__ << ": oid=" << oid << dendl; librados::ObjectWriteOperation op; @@ -68,7 +68,7 @@ Context *LockRequest::handle_lock(int *ret_val) { template void LockRequest::send_get_lock_info() { CephContext *cct = m_image_ctx.cct; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); ldout(cct, 10) << this << " " << __func__ << ": oid=" << oid << dendl; librados::ObjectReadOperation op; @@ -113,7 +113,7 @@ Context *LockRequest::handle_get_lock_info(int *ret_val) { template void LockRequest::send_break_locks() { CephContext *cct = m_image_ctx.cct; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); ldout(cct, 10) << this << " " << __func__ << ": oid=" << oid << ", " << "num_lockers=" << m_lockers.size() << dendl; diff --git a/src/librbd/object_map/RefreshRequest.cc b/src/librbd/object_map/RefreshRequest.cc index 9421c1216c4b..c7b4834d2f1a 100644 --- a/src/librbd/object_map/RefreshRequest.cc +++ b/src/librbd/object_map/RefreshRequest.cc @@ -72,7 +72,7 @@ void RefreshRequest::send_lock() { return; } - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, m_snap_id)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_snap_id)); ldout(cct, 10) << this << " " << __func__ << ": oid=" << oid << dendl; using klass = RefreshRequest; @@ -96,7 +96,7 @@ Context *RefreshRequest::handle_lock(int *ret_val) { template void RefreshRequest::send_load() { CephContext *cct = m_image_ctx.cct; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, m_snap_id)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_snap_id)); ldout(cct, 10) << this << " " << __func__ << ": oid=" << oid << dendl; librados::ObjectReadOperation op; @@ -122,7 +122,7 @@ Context *RefreshRequest::handle_load(int *ret_val) { &m_on_disk_object_map); } - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, m_snap_id)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_snap_id)); if (*ret_val == -EINVAL) { // object map is corrupt on-disk -- clear it and properly size it // so future IO can keep the object map in sync @@ -220,7 +220,7 @@ Context *RefreshRequest::handle_resize_invalidate(int *ret_val) { template void RefreshRequest::send_resize() { CephContext *cct = m_image_ctx.cct; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, m_snap_id)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_snap_id)); ldout(cct, 10) << this << " " << __func__ << ": oid=" << oid << dendl; librados::ObjectWriteOperation op; diff --git a/src/librbd/object_map/RefreshRequest.h b/src/librbd/object_map/RefreshRequest.h index 4c2b059fa268..24a7998ae1bc 100644 --- a/src/librbd/object_map/RefreshRequest.h +++ b/src/librbd/object_map/RefreshRequest.h @@ -19,6 +19,12 @@ namespace object_map { template class RefreshRequest { public: + static RefreshRequest *create(ImageCtxT &image_ctx, + ceph::BitVector<2> *object_map, + uint64_t snap_id, Context *on_finish) { + return new RefreshRequest(image_ctx, object_map, snap_id, on_finish); + } + RefreshRequest(ImageCtxT &image_ctx, ceph::BitVector<2> *object_map, uint64_t snap_id, Context *on_finish); diff --git a/src/librbd/object_map/ResizeRequest.cc b/src/librbd/object_map/ResizeRequest.cc index 5698fc80f7bf..3182c8aef91c 100644 --- a/src/librbd/object_map/ResizeRequest.cc +++ b/src/librbd/object_map/ResizeRequest.cc @@ -30,7 +30,7 @@ void ResizeRequest::send() { RWLock::WLocker l(m_image_ctx.object_map_lock); m_num_objs = Striper::get_num_objects(m_image_ctx.layout, m_new_size); - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, m_snap_id)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_snap_id)); ldout(cct, 5) << this << " resizing on-disk object map: " << "ictx=" << &m_image_ctx << ", " << "oid=" << oid << ", num_objs=" << m_num_objs << dendl; diff --git a/src/librbd/object_map/SnapshotCreateRequest.cc b/src/librbd/object_map/SnapshotCreateRequest.cc index 6408973416fa..5d77d2630d38 100644 --- a/src/librbd/object_map/SnapshotCreateRequest.cc +++ b/src/librbd/object_map/SnapshotCreateRequest.cc @@ -79,7 +79,7 @@ void SnapshotCreateRequest::send_read_map() { assert(m_image_ctx.get_snap_info(m_snap_id) != NULL); CephContext *cct = m_image_ctx.cct; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); ldout(cct, 5) << this << " " << __func__ << ": oid=" << oid << dendl; m_state = STATE_READ_MAP; @@ -96,7 +96,7 @@ void SnapshotCreateRequest::send_read_map() { void SnapshotCreateRequest::send_write_map() { CephContext *cct = m_image_ctx.cct; - std::string snap_oid(ObjectMap::object_map_name(m_image_ctx.id, m_snap_id)); + std::string snap_oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_snap_id)); ldout(cct, 5) << this << " " << __func__ << ": snap_oid=" << snap_oid << dendl; m_state = STATE_WRITE_MAP; @@ -117,7 +117,7 @@ bool SnapshotCreateRequest::send_add_snapshot() { } CephContext *cct = m_image_ctx.cct; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); ldout(cct, 5) << this << " " << __func__ << ": oid=" << oid << dendl; m_state = STATE_ADD_SNAPSHOT; diff --git a/src/librbd/object_map/SnapshotRemoveRequest.cc b/src/librbd/object_map/SnapshotRemoveRequest.cc index 94c0952504a1..821dd5b8781b 100644 --- a/src/librbd/object_map/SnapshotRemoveRequest.cc +++ b/src/librbd/object_map/SnapshotRemoveRequest.cc @@ -112,7 +112,7 @@ bool SnapshotRemoveRequest::should_complete(int r) { void SnapshotRemoveRequest::send_load_map() { CephContext *cct = m_image_ctx.cct; - std::string snap_oid(ObjectMap::object_map_name(m_image_ctx.id, m_snap_id)); + std::string snap_oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_snap_id)); ldout(cct, 5) << this << " " << __func__ << ": snap_oid=" << snap_oid << dendl; m_state = STATE_LOAD_MAP; @@ -129,7 +129,7 @@ void SnapshotRemoveRequest::send_load_map() { void SnapshotRemoveRequest::send_remove_snapshot() { CephContext *cct = m_image_ctx.cct; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, m_next_snap_id)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_next_snap_id)); ldout(cct, 5) << this << " " << __func__ << ": oid=" << oid << dendl; m_state = STATE_REMOVE_SNAPSHOT; @@ -161,7 +161,7 @@ void SnapshotRemoveRequest::send_invalidate_next_map() { void SnapshotRemoveRequest::send_remove_map() { CephContext *cct = m_image_ctx.cct; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, m_snap_id)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_snap_id)); ldout(cct, 5) << this << " " << __func__ << ": oid=" << oid << dendl; m_state = STATE_REMOVE_MAP; diff --git a/src/librbd/object_map/SnapshotRollbackRequest.cc b/src/librbd/object_map/SnapshotRollbackRequest.cc index 10eb59136d38..0da4fd4ae8e3 100644 --- a/src/librbd/object_map/SnapshotRollbackRequest.cc +++ b/src/librbd/object_map/SnapshotRollbackRequest.cc @@ -76,7 +76,7 @@ bool SnapshotRollbackRequest::should_complete(int r) { } void SnapshotRollbackRequest::send_read_map() { - std::string snap_oid(ObjectMap::object_map_name(m_image_ctx.id, m_snap_id)); + std::string snap_oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_snap_id)); CephContext *cct = m_image_ctx.cct; ldout(cct, 5) << this << " " << __func__ << ": snap_oid=" << snap_oid @@ -97,7 +97,8 @@ void SnapshotRollbackRequest::send_write_map() { RWLock::RLocker owner_locker(m_image_ctx.owner_lock); CephContext *cct = m_image_ctx.cct; - std::string snap_oid(ObjectMap::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); + std::string snap_oid(ObjectMap<>::object_map_name(m_image_ctx.id, + CEPH_NOSNAP)); ldout(cct, 5) << this << " " << __func__ << ": snap_oid=" << snap_oid << dendl; m_state = STATE_WRITE_MAP; diff --git a/src/librbd/object_map/UnlockRequest.cc b/src/librbd/object_map/UnlockRequest.cc index c7ae9801d3ce..3458bbed17f2 100644 --- a/src/librbd/object_map/UnlockRequest.cc +++ b/src/librbd/object_map/UnlockRequest.cc @@ -31,7 +31,7 @@ void UnlockRequest::send() { template void UnlockRequest::send_unlock() { CephContext *cct = m_image_ctx.cct; - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, CEPH_NOSNAP)); ldout(cct, 10) << this << " " << __func__ << ": oid=" << oid << dendl; librados::ObjectWriteOperation op; diff --git a/src/librbd/object_map/UnlockRequest.h b/src/librbd/object_map/UnlockRequest.h index b52a3d0f89e9..ae1d9e93425d 100644 --- a/src/librbd/object_map/UnlockRequest.h +++ b/src/librbd/object_map/UnlockRequest.h @@ -15,6 +15,10 @@ namespace object_map { template class UnlockRequest { public: + static UnlockRequest *create(ImageCtxT &image_ctx, Context *on_finish) { + return new UnlockRequest(image_ctx, on_finish); + } + UnlockRequest(ImageCtxT &image_ctx, Context *on_finish); void send(); diff --git a/src/librbd/object_map/UpdateRequest.cc b/src/librbd/object_map/UpdateRequest.cc index 3edf32aa67fa..e88085add411 100644 --- a/src/librbd/object_map/UpdateRequest.cc +++ b/src/librbd/object_map/UpdateRequest.cc @@ -17,14 +17,15 @@ namespace librbd { namespace object_map { -void UpdateRequest::send() { +template +void UpdateRequest::send() { assert(m_image_ctx.snap_lock.is_locked()); assert(m_image_ctx.object_map_lock.is_locked()); CephContext *cct = m_image_ctx.cct; // safe to update in-memory state first without handling rollback since any // failures will invalidate the object map - std::string oid(ObjectMap::object_map_name(m_image_ctx.id, m_snap_id)); + std::string oid(ObjectMap<>::object_map_name(m_image_ctx.id, m_snap_id)); ldout(cct, 20) << this << " updating object map" << ": ictx=" << &m_image_ctx << ", oid=" << oid << ", [" << m_start_object_no << "," << m_end_object_no << ") = " @@ -46,7 +47,8 @@ void UpdateRequest::send() { rados_completion->release(); } -void UpdateRequest::finish_request() { +template +void UpdateRequest::finish_request() { RWLock::RLocker snap_locker(m_image_ctx.snap_lock); RWLock::WLocker object_map_locker(m_image_ctx.object_map_lock); ldout(m_image_ctx.cct, 20) << this << " on-disk object map updated" @@ -68,3 +70,5 @@ void UpdateRequest::finish_request() { } // namespace object_map } // namespace librbd + +template class librbd::object_map::UpdateRequest; diff --git a/src/librbd/object_map/UpdateRequest.h b/src/librbd/object_map/UpdateRequest.h index d1ce4075dd0d..5f3ae5cd53f5 100644 --- a/src/librbd/object_map/UpdateRequest.h +++ b/src/librbd/object_map/UpdateRequest.h @@ -17,13 +17,25 @@ class ImageCtx; namespace object_map { +template class UpdateRequest : public Request { public: + static UpdateRequest *create(ImageCtx &image_ctx, + ceph::BitVector<2> *object_map, + uint64_t snap_id, uint64_t start_object_no, + uint64_t end_object_no, uint8_t new_state, + const boost::optional ¤t_state, + Context *on_finish) { + return new UpdateRequest(image_ctx, object_map, snap_id, start_object_no, + end_object_no, new_state, current_state, + on_finish); + } + UpdateRequest(ImageCtx &image_ctx, ceph::BitVector<2> *object_map, uint64_t snap_id, uint64_t start_object_no, uint64_t end_object_no, uint8_t new_state, const boost::optional ¤t_state, - Context *on_finish) + Context *on_finish) : Request(image_ctx, snap_id, on_finish), m_object_map(*object_map), m_start_object_no(start_object_no), m_end_object_no(end_object_no), m_new_state(new_state), m_current_state(current_state) @@ -46,4 +58,6 @@ private: } // namespace object_map } // namespace librbd +extern template class librbd::object_map::UpdateRequest; + #endif // CEPH_LIBRBD_OBJECT_MAP_UPDATE_REQUEST_H diff --git a/src/test/librbd/object_map/test_mock_LockRequest.cc b/src/test/librbd/object_map/test_mock_LockRequest.cc index 0ee782bce133..819b0125c897 100644 --- a/src/test/librbd/object_map/test_mock_LockRequest.cc +++ b/src/test/librbd/object_map/test_mock_LockRequest.cc @@ -27,14 +27,16 @@ public: typedef LockRequest MockLockRequest; void expect_lock(MockImageCtx &mock_image_ctx, int r) { - std::string oid(ObjectMap::object_map_name(mock_image_ctx.id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(mock_image_ctx.id, + CEPH_NOSNAP)); EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(oid, _, StrEq("lock"), StrEq("lock"), _, _, _)) .WillOnce(Return(r)); } void expect_get_lock_info(MockImageCtx &mock_image_ctx, int r) { - std::string oid(ObjectMap::object_map_name(mock_image_ctx.id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(mock_image_ctx.id, + CEPH_NOSNAP)); auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(oid, _, StrEq("lock"), StrEq("get_info"), _, _, _)); if (r < 0) { @@ -59,7 +61,8 @@ public: } void expect_break_lock(MockImageCtx &mock_image_ctx, int r) { - std::string oid(ObjectMap::object_map_name(mock_image_ctx.id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(mock_image_ctx.id, + CEPH_NOSNAP)); auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(oid, _, StrEq("lock"), StrEq("break_lock"), _, _, _)); if (r < 0) { diff --git a/src/test/librbd/object_map/test_mock_RefreshRequest.cc b/src/test/librbd/object_map/test_mock_RefreshRequest.cc index be982ce684e8..8d67a1a4f5d4 100644 --- a/src/test/librbd/object_map/test_mock_RefreshRequest.cc +++ b/src/test/librbd/object_map/test_mock_RefreshRequest.cc @@ -86,7 +86,7 @@ public: void expect_object_map_load(MockObjectMapImageCtx &mock_image_ctx, ceph::BitVector<2> *object_map, uint64_t snap_id, int r) { - std::string oid(ObjectMap::object_map_name(mock_image_ctx.id, snap_id)); + std::string oid(ObjectMap<>::object_map_name(mock_image_ctx.id, snap_id)); auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(oid, _, StrEq("rbd"), StrEq("object_map_load"), _, _, _)); if (r < 0) { @@ -117,14 +117,16 @@ public: } void expect_truncate_request(MockObjectMapImageCtx &mock_image_ctx) { - std::string oid(ObjectMap::object_map_name(mock_image_ctx.id, TEST_SNAP_ID)); + std::string oid(ObjectMap<>::object_map_name(mock_image_ctx.id, + TEST_SNAP_ID)); EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), truncate(oid, 0, _)) .WillOnce(Return(0)); } void expect_object_map_resize(MockObjectMapImageCtx &mock_image_ctx, uint64_t num_objects, int r) { - std::string oid(ObjectMap::object_map_name(mock_image_ctx.id, TEST_SNAP_ID)); + std::string oid(ObjectMap<>::object_map_name(mock_image_ctx.id, + TEST_SNAP_ID)); auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(oid, _, StrEq("rbd"), StrEq("object_map_resize"), _, _, _)); expect.WillOnce(Return(r)); diff --git a/src/test/librbd/object_map/test_mock_ResizeRequest.cc b/src/test/librbd/object_map/test_mock_ResizeRequest.cc index 42007d34487a..44fd714353ba 100644 --- a/src/test/librbd/object_map/test_mock_ResizeRequest.cc +++ b/src/test/librbd/object_map/test_mock_ResizeRequest.cc @@ -22,7 +22,7 @@ using ::testing::StrEq; class TestMockObjectMapResizeRequest : public TestMockFixture { public: void expect_resize(librbd::ImageCtx *ictx, uint64_t snap_id, int r) { - std::string oid(ObjectMap::object_map_name(ictx->id, snap_id)); + std::string oid(ObjectMap<>::object_map_name(ictx->id, snap_id)); if (snap_id == CEPH_NOSNAP) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), exec(oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _)) diff --git a/src/test/librbd/object_map/test_mock_SnapshotCreateRequest.cc b/src/test/librbd/object_map/test_mock_SnapshotCreateRequest.cc index 3dd62989f297..823a32de9fe1 100644 --- a/src/test/librbd/object_map/test_mock_SnapshotCreateRequest.cc +++ b/src/test/librbd/object_map/test_mock_SnapshotCreateRequest.cc @@ -31,11 +31,11 @@ public: void expect_read_map(librbd::ImageCtx *ictx, int r) { if (r < 0) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), - read(ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP), + read(ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP), 0, 0, _)).WillOnce(Return(r)); } else { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), - read(ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP), + read(ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP), 0, 0, _)).WillOnce(DoDefault()); } } @@ -44,18 +44,18 @@ public: if (r < 0) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), write_full( - ObjectMap::object_map_name(ictx->id, snap_id), _, _)) + ObjectMap<>::object_map_name(ictx->id, snap_id), _, _)) .WillOnce(Return(r)); } else { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), write_full( - ObjectMap::object_map_name(ictx->id, snap_id), _, _)) + ObjectMap<>::object_map_name(ictx->id, snap_id), _, _)) .WillOnce(DoDefault()); } } void expect_add_snapshot(librbd::ImageCtx *ictx, int r) { - std::string oid(ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP)); if (r < 0) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), exec(oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _)) diff --git a/src/test/librbd/object_map/test_mock_SnapshotRemoveRequest.cc b/src/test/librbd/object_map/test_mock_SnapshotRemoveRequest.cc index 215c214eb8b1..270b267c53fe 100644 --- a/src/test/librbd/object_map/test_mock_SnapshotRemoveRequest.cc +++ b/src/test/librbd/object_map/test_mock_SnapshotRemoveRequest.cc @@ -23,7 +23,7 @@ using ::testing::StrEq; class TestMockObjectMapSnapshotRemoveRequest : public TestMockFixture { public: void expect_load_map(librbd::ImageCtx *ictx, uint64_t snap_id, int r) { - std::string snap_oid(ObjectMap::object_map_name(ictx->id, snap_id)); + std::string snap_oid(ObjectMap<>::object_map_name(ictx->id, snap_id)); if (r < 0) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), exec(snap_oid, _, StrEq("rbd"), StrEq("object_map_load"), _, _, _)) @@ -36,7 +36,7 @@ public: } void expect_remove_snapshot(librbd::ImageCtx *ictx, int r) { - std::string oid(ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP)); if (r < 0) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), exec(oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _)) @@ -52,7 +52,7 @@ public: } void expect_remove_map(librbd::ImageCtx *ictx, uint64_t snap_id, int r) { - std::string snap_oid(ObjectMap::object_map_name(ictx->id, snap_id)); + std::string snap_oid(ObjectMap<>::object_map_name(ictx->id, snap_id)); if (r < 0) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), remove(snap_oid, _)) .WillOnce(Return(r)); diff --git a/src/test/librbd/object_map/test_mock_SnapshotRollbackRequest.cc b/src/test/librbd/object_map/test_mock_SnapshotRollbackRequest.cc index 51fc932c0b07..ff3e06a8d70c 100644 --- a/src/test/librbd/object_map/test_mock_SnapshotRollbackRequest.cc +++ b/src/test/librbd/object_map/test_mock_SnapshotRollbackRequest.cc @@ -24,29 +24,29 @@ public: void expect_read_map(librbd::ImageCtx *ictx, uint64_t snap_id, int r) { if (r < 0) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), - read(ObjectMap::object_map_name(ictx->id, snap_id), + read(ObjectMap<>::object_map_name(ictx->id, snap_id), 0, 0, _)).WillOnce(Return(r)); } else { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), - read(ObjectMap::object_map_name(ictx->id, snap_id), + read(ObjectMap<>::object_map_name(ictx->id, snap_id), 0, 0, _)).WillOnce(DoDefault()); } } void expect_write_map(librbd::ImageCtx *ictx, int r) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), - exec(ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP), _, + exec(ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP), _, StrEq("lock"), StrEq("assert_locked"), _, _, _)) .WillOnce(DoDefault()); if (r < 0) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), write_full( - ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP), _, _)) + ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP), _, _)) .WillOnce(Return(r)); } else { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), write_full( - ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP), _, _)) + ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP), _, _)) .WillOnce(DoDefault()); } } diff --git a/src/test/librbd/object_map/test_mock_UnlockRequest.cc b/src/test/librbd/object_map/test_mock_UnlockRequest.cc index 7f834ca8dba1..a834a5004fa3 100644 --- a/src/test/librbd/object_map/test_mock_UnlockRequest.cc +++ b/src/test/librbd/object_map/test_mock_UnlockRequest.cc @@ -25,7 +25,8 @@ public: typedef UnlockRequest MockUnlockRequest; void expect_unlock(MockImageCtx &mock_image_ctx, int r) { - std::string oid(ObjectMap::object_map_name(mock_image_ctx.id, CEPH_NOSNAP)); + std::string oid(ObjectMap<>::object_map_name(mock_image_ctx.id, + CEPH_NOSNAP)); EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(oid, _, StrEq("lock"), StrEq("unlock"), _, _, _)) .WillOnce(Return(r)); diff --git a/src/test/librbd/object_map/test_mock_UpdateRequest.cc b/src/test/librbd/object_map/test_mock_UpdateRequest.cc index 67ace6249116..f82ffb82ac21 100644 --- a/src/test/librbd/object_map/test_mock_UpdateRequest.cc +++ b/src/test/librbd/object_map/test_mock_UpdateRequest.cc @@ -24,7 +24,7 @@ using ::testing::StrEq; class TestMockObjectMapUpdateRequest : public TestMockFixture { public: void expect_update(librbd::ImageCtx *ictx, uint64_t snap_id, int r) { - std::string oid(ObjectMap::object_map_name(ictx->id, snap_id)); + std::string oid(ObjectMap<>::object_map_name(ictx->id, snap_id)); if (snap_id == CEPH_NOSNAP) { EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx), exec(oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _)) @@ -69,7 +69,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateInMemory) { } C_SaferCond cond_ctx; - AsyncRequest<> *req = new UpdateRequest( + AsyncRequest<> *req = new UpdateRequest<>( *ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT, OBJECT_EXISTS, &cond_ctx); { @@ -101,7 +101,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateHeadOnDisk) { object_map.resize(1); C_SaferCond cond_ctx; - AsyncRequest<> *req = new UpdateRequest( + AsyncRequest<> *req = new UpdateRequest<>( *ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT, OBJECT_EXISTS, &cond_ctx); { @@ -129,7 +129,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateSnapOnDisk) { object_map.resize(1); C_SaferCond cond_ctx; - AsyncRequest<> *req = new UpdateRequest( + AsyncRequest<> *req = new UpdateRequest<>( *ictx, &object_map, snap_id, 0, object_map.size(), OBJECT_NONEXISTENT, OBJECT_EXISTS, &cond_ctx); { @@ -156,7 +156,7 @@ TEST_F(TestMockObjectMapUpdateRequest, UpdateOnDiskError) { object_map.resize(1); C_SaferCond cond_ctx; - AsyncRequest<> *req = new UpdateRequest( + AsyncRequest<> *req = new UpdateRequest<>( *ictx, &object_map, CEPH_NOSNAP, 0, object_map.size(), OBJECT_NONEXISTENT, OBJECT_EXISTS, &cond_ctx); { @@ -186,7 +186,7 @@ TEST_F(TestMockObjectMapUpdateRequest, RebuildSnapOnDisk) { object_map.resize(1); C_SaferCond cond_ctx; - AsyncRequest<> *req = new UpdateRequest( + AsyncRequest<> *req = new UpdateRequest<>( *ictx, &object_map, snap_id, 0, object_map.size(), OBJECT_EXISTS_CLEAN, boost::optional(), &cond_ctx); { diff --git a/src/test/librbd/test_ObjectMap.cc b/src/test/librbd/test_ObjectMap.cc index b3b19e45ccd3..1e8566e9c5fe 100644 --- a/src/test/librbd/test_ObjectMap.cc +++ b/src/test/librbd/test_ObjectMap.cc @@ -18,7 +18,7 @@ public: int when_open_object_map(librbd::ImageCtx *ictx) { C_SaferCond ctx; - librbd::ObjectMap object_map(*ictx, ictx->snap_id); + librbd::ObjectMap<> object_map(*ictx, ictx->snap_id); object_map.open(&ctx); return ctx.wait(); } @@ -38,7 +38,7 @@ TEST_F(TestObjectMap, RefreshInvalidatesWhenCorrupt) { } ASSERT_EQ(0, lock_ctx.wait()); - std::string oid = librbd::ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP); + std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP); bufferlist bl; bl.append("corrupt"); ASSERT_EQ(0, ictx->data_ctx.write_full(oid, bl)); @@ -64,8 +64,8 @@ TEST_F(TestObjectMap, RefreshInvalidatesWhenTooSmall) { librados::ObjectWriteOperation op; librbd::cls_client::object_map_resize(&op, 0, OBJECT_NONEXISTENT); - std::string oid = librbd::ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP); - ASSERT_EQ(0, ictx->data_ctx.operate(oid, &op)); + std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP); + ASSERT_EQ(0, ictx->md_ctx.operate(oid, &op)); ASSERT_EQ(0, when_open_object_map(ictx)); ASSERT_TRUE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID)); @@ -85,7 +85,7 @@ TEST_F(TestObjectMap, InvalidateFlagOnDisk) { } ASSERT_EQ(0, lock_ctx.wait()); - std::string oid = librbd::ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP); + std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP); bufferlist bl; bl.append("corrupt"); ASSERT_EQ(0, ictx->data_ctx.write_full(oid, bl)); @@ -104,7 +104,7 @@ TEST_F(TestObjectMap, InvalidateFlagInMemoryOnly) { ASSERT_EQ(0, open_image(m_image_name, &ictx)); ASSERT_FALSE(ictx->test_flags(RBD_FLAG_OBJECT_MAP_INVALID)); - std::string oid = librbd::ObjectMap::object_map_name(ictx->id, CEPH_NOSNAP); + std::string oid = librbd::ObjectMap<>::object_map_name(ictx->id, CEPH_NOSNAP); bufferlist valid_bl; ASSERT_LT(0, ictx->data_ctx.read(oid, valid_bl, 0, 0)); diff --git a/src/test/librbd/test_internal.cc b/src/test/librbd/test_internal.cc index c6ac977d7325..f79dbc12270e 100644 --- a/src/test/librbd/test_internal.cc +++ b/src/test/librbd/test_internal.cc @@ -558,7 +558,7 @@ TEST_F(TestInternal, SnapshotCopyup) state = OBJECT_EXISTS_CLEAN; } - librbd::ObjectMap object_map(*ictx2, ictx2->snap_id); + librbd::ObjectMap<> object_map(*ictx2, ictx2->snap_id); C_SaferCond ctx; object_map.open(&ctx); ASSERT_EQ(0, ctx.wait()); diff --git a/src/test/rbd_mirror/image_sync/test_mock_SnapshotCreateRequest.cc b/src/test/rbd_mirror/image_sync/test_mock_SnapshotCreateRequest.cc index c0105aeaa210..c54aa2c223b5 100644 --- a/src/test/rbd_mirror/image_sync/test_mock_SnapshotCreateRequest.cc +++ b/src/test/rbd_mirror/image_sync/test_mock_SnapshotCreateRequest.cc @@ -91,8 +91,8 @@ public: void expect_object_map_resize(librbd::MockTestImageCtx &mock_image_ctx, librados::snap_t snap_id, int r) { - std::string oid(librbd::ObjectMap::object_map_name(mock_image_ctx.id, - snap_id)); + std::string oid(librbd::ObjectMap<>::object_map_name(mock_image_ctx.id, + snap_id)); EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx), exec(oid, _, StrEq("rbd"), StrEq("object_map_resize"), _, _, _)) .WillOnce(Return(r)); diff --git a/src/tools/rbd_mirror/image_sync/SnapshotCreateRequest.cc b/src/tools/rbd_mirror/image_sync/SnapshotCreateRequest.cc index ee0c80fbad24..ede82db4d0dd 100644 --- a/src/tools/rbd_mirror/image_sync/SnapshotCreateRequest.cc +++ b/src/tools/rbd_mirror/image_sync/SnapshotCreateRequest.cc @@ -222,7 +222,7 @@ void SnapshotCreateRequest::send_create_object_map() { librados::snap_t local_snap_id = snap_it->second; m_local_image_ctx->snap_lock.put_read(); - std::string object_map_oid(librbd::ObjectMap::object_map_name( + std::string object_map_oid(librbd::ObjectMap<>::object_map_name( m_local_image_ctx->id, local_snap_id)); uint64_t object_count = Striper::get_num_objects(m_local_image_ctx->layout, m_size); -- 2.47.3