}
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
return new ExclusiveLock<ImageCtx>(*this);
}
- ObjectMap *ImageCtx::create_object_map(uint64_t snap_id) {
- return new ObjectMap(*this, snap_id);
+ ObjectMap<ImageCtx> *ImageCtx::create_object_map(uint64_t snap_id) {
+ return new ObjectMap<ImageCtx>(*this, snap_id);
}
Journal<ImageCtx> *ImageCtx::create_journal() {
template <typename> class ImageWatcher;
template <typename> class Journal;
class LibrbdAdminSocketHook;
- class ObjectMap;
+ template <typename> class ObjectMap;
template <typename> class Operations;
class LibrbdWriteback;
Operations<ImageCtx> *operations;
ExclusiveLock<ImageCtx> *exclusive_lock;
- ObjectMap *object_map;
+ ObjectMap<ImageCtx> *object_map;
xlist<operation::ResizeRequest<ImageCtx>*> resize_reqs;
void apply_metadata(const std::map<std::string, bufferlist> &meta);
ExclusiveLock<ImageCtx> *create_exclusive_lock();
- ObjectMap *create_object_map(uint64_t snap_id);
+ ObjectMap<ImageCtx> *create_object_map(uint64_t snap_id);
Journal<ImageCtx> *create_journal();
void clear_pending_completions();
namespace librbd {
-ObjectMap::ObjectMap(ImageCtx &image_ctx, uint64_t snap_id)
+template <typename I>
+ObjectMap<I>::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 <typename I>
+int ObjectMap<I>::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 <typename I>
+std::string ObjectMap<I>::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;
return oid;
}
-bool ObjectMap::is_compatible(const file_layout_t& layout, uint64_t size) {
+template <typename I>
+bool ObjectMap<I>::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 <typename I>
+ceph::BitVector<2u>::Reference ObjectMap<I>::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 <typename I>
+uint8_t ObjectMap<I>::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 <typename I>
+bool ObjectMap<I>::object_may_exist(uint64_t object_no) const
{
assert(m_image_ctx.snap_lock.is_locked());
return exists;
}
-bool ObjectMap::update_required(uint64_t object_no, uint8_t new_state) {
+template <typename I>
+bool ObjectMap<I>::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];
return true;
}
-void ObjectMap::open(Context *on_finish) {
- object_map::RefreshRequest<> *req = new object_map::RefreshRequest<>(
+template <typename I>
+void ObjectMap<I>::open(Context *on_finish) {
+ auto req = object_map::RefreshRequest<I>::create(
m_image_ctx, &m_object_map, m_snap_id, on_finish);
req->send();
}
-void ObjectMap::close(Context *on_finish) {
+template <typename I>
+void ObjectMap<I>::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<I>::create(m_image_ctx, on_finish);
req->send();
}
-void ObjectMap::rollback(uint64_t snap_id, Context *on_finish) {
+template <typename I>
+void ObjectMap<I>::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());
req->send();
}
-void ObjectMap::snapshot_add(uint64_t snap_id, Context *on_finish) {
+template <typename I>
+void ObjectMap<I>::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);
req->send();
}
-void ObjectMap::snapshot_remove(uint64_t snap_id, Context *on_finish) {
+template <typename I>
+void ObjectMap<I>::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);
req->send();
}
-void ObjectMap::aio_save(Context *on_finish) {
+template <typename I>
+void ObjectMap<I>::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,
comp->release();
}
-void ObjectMap::aio_resize(uint64_t new_size, uint8_t default_object_state,
- Context *on_finish) {
+template <typename I>
+void ObjectMap<I>::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,
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<uint8_t> ¤t_state,
- Context *on_finish) {
+template <typename I>
+void ObjectMap<I>::aio_update(uint64_t snap_id, uint64_t start_object_no,
+ uint64_t end_object_no, uint8_t new_state,
+ const boost::optional<uint8_t> ¤t_state,
+ Context *on_finish) {
assert(m_image_ctx.snap_lock.is_locked());
assert((m_image_ctx.features & RBD_FEATURE_OBJECT_MAP) != 0);
assert(m_image_ctx.image_watcher != nullptr);
}
}
- object_map::UpdateRequest *req = new object_map::UpdateRequest(
+ auto req = object_map::UpdateRequest<I>::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<librbd::ImageCtx>;
+
class ImageCtx;
+template <typename ImageCtxT = ImageCtx>
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,
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;
} // namespace librbd
+extern template class librbd::ObjectMap<librbd::ImageCtx>;
+
#endif // CEPH_LIBRBD_OBJECT_MAP_H
}
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;
}
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;
bool validate_layout(CephContext *cct, uint64_t size, file_layout_t &layout) {
- if (!librbd::ObjectMap::is_compatible(layout, size)) {
+ if (!librbd::ObjectMap<>::is_compatible(layout, size)) {
lderr(cct) << "image size not compatible with object map" << dendl;
return false;
}
m_id_obj = util::id_obj_name(m_image_name);
m_header_obj = util::header_name(m_image_id);
- m_objmap_name = ObjectMap::object_map_name(m_image_id, CEPH_NOSNAP);
+ m_objmap_name = ObjectMap<>::object_map_name(m_image_id, CEPH_NOSNAP);
if (image_options.get(RBD_IMAGE_OPTION_FEATURES, &m_features) != 0) {
m_features = util::parse_rbd_default_features(m_cct);
using klass = SetSnapRequest<I>;
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<I>::create(m_image_ctx, m_snap_id);
m_object_map->open(ctx);
return nullptr;
}
template <typename> class ExclusiveLock;
class ImageCtx;
-class ObjectMap;
+template <typename> class ObjectMap;
namespace image {
uint64_t m_snap_id;
ExclusiveLock<ImageCtxT> *m_exclusive_lock;
- ObjectMap *m_object_map;
+ ObjectMap<ImageCtxT> *m_object_map;
RefreshParentRequest<ImageCtxT> *m_refresh_parent;
bool m_writes_blocked;
}
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;
m_snap_ids.push_back(it.first);
}
- if (ObjectMap::is_compatible(m_image_ctx->layout, max_size)) {
+ if (ObjectMap<>::is_compatible(m_image_ctx->layout, max_size)) {
send_object_map_resize();
return;
}
m_image_ctx->layout, snap_size),
OBJECT_NONEXISTENT);
- std::string oid(ObjectMap::object_map_name(m_image_ctx->id, snap_id));
+ std::string oid(ObjectMap<>::object_map_name(m_image_ctx->id, snap_id));
librados::AioCompletion *comp = create_rados_ack_callback(gather_ctx->new_sub());
int r = m_image_ctx->md_ctx.aio_operate(oid, comp, &op);
assert(r == 0);
template <typename I>
void LockRequest<I>::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;
template <typename I>
void LockRequest<I>::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;
template <typename I>
void LockRequest<I>::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;
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<I>;
template <typename I>
void RefreshRequest<I>::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;
&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
template <typename I>
void RefreshRequest<I>::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;
template <typename ImageCtxT = ImageCtx>
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);
for (auto snap_id : snap_ids) {
m_ref_counter++;
- std::string oid(ObjectMap::object_map_name(m_image_ctx->id, snap_id));
+ std::string oid(ObjectMap<>::object_map_name(m_image_ctx->id, snap_id));
using klass = RemoveRequest<I>;
librados::AioCompletion *comp =
create_rados_ack_callback<klass, &klass::handle_remove_object_map>(this);
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;
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;
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;
}
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;
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;
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;
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;
}
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
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;
template <typename I>
void UnlockRequest<I>::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;
template <typename ImageCtxT = ImageCtx>
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();
namespace librbd {
namespace object_map {
-void UpdateRequest::send() {
+template <typename I>
+void UpdateRequest<I>::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 << ") = "
rados_completion->release();
}
-void UpdateRequest::finish_request() {
+template <typename I>
+void UpdateRequest<I>::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"
} // namespace object_map
} // namespace librbd
+
+template class librbd::object_map::UpdateRequest<librbd::ImageCtx>;
namespace object_map {
+template <typename ImageCtxT = librbd::ImageCtx>
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<uint8_t> ¤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<uint8_t> ¤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)
} // namespace object_map
} // namespace librbd
+extern template class librbd::object_map::UpdateRequest<librbd::ImageCtx>;
+
#endif // CEPH_LIBRBD_OBJECT_MAP_UPDATE_REQUEST_H
typedef LockRequest<MockImageCtx> 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) {
}
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) {
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) {
}
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));
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"), _, _, _))
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());
}
}
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"), _, _, _))
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"), _, _, _))
}
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"), _, _, _))
}
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));
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());
}
}
typedef UnlockRequest<MockImageCtx> 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));
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"), _, _, _))
}
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);
{
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);
{
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);
{
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);
{
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<uint8_t>(), &cond_ctx);
{
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();
}
}
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->md_ctx.write_full(oid, bl));
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);
+ 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_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->md_ctx.write_full(oid, bl));
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->md_ctx.read(oid, valid_bl, 0, 0));
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());
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));
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);