handle_acquire_lock(r);
}
-template <typename I>
-void ExclusiveLock<I>::assert_header_locked(librados::ObjectWriteOperation *op) {
- Mutex::Locker locker(m_lock);
- rados::cls::lock::assert_locked(op, RBD_LOCK_NAME, LOCK_EXCLUSIVE,
- m_cookie, WATCHER_LOCK_TAG);
-}
-
template <typename I>
std::string ExclusiveLock<I>::encode_lock_cookie() const {
assert(m_lock.is_locked());
void handle_peer_notification(int r);
- void assert_header_locked(librados::ObjectWriteOperation *op);
-
static bool decode_lock_cookie(const std::string &cookie, uint64_t *handle);
private:
lderr(cct) << this << " invalidating object map on-disk" << dendl;
librados::ObjectWriteOperation op;
- if (image_ctx.exclusive_lock != nullptr &&
- m_snap_id == CEPH_NOSNAP && !m_force) {
- image_ctx.exclusive_lock->assert_header_locked(&op);
- }
cls_client::set_flags(&op, m_snap_id, flags, flags);
librados::AioCompletion *rados_completion =
// remove parent from this (base) image
librados::ObjectWriteOperation op;
- if (image_ctx.exclusive_lock != nullptr) {
- image_ctx.exclusive_lock->assert_header_locked(&op);
- }
cls_client::remove_parent(&op);
librados::AioCompletion *rados_completion = this->create_callback_completion();
m_state = STATE_UPDATE_HEADER;
librados::ObjectWriteOperation op;
- if (m_image_ctx.exclusive_lock != nullptr) {
- m_image_ctx.exclusive_lock->assert_header_locked(&op);
- }
uint64_t flags = RBD_FLAG_OBJECT_MAP_INVALID | RBD_FLAG_FAST_DIFF_INVALID;
cls_client::set_flags(&op, m_image_ctx.snap_id, 0, flags);
bl.append(reinterpret_cast<const char*>(&m_new_size), sizeof(m_new_size));
op.write(offsetof(rbd_obj_header_ondisk, image_size), bl);
} else {
- if (image_ctx.exclusive_lock != nullptr) {
- image_ctx.exclusive_lock->assert_header_locked(&op);
- }
cls_client::set_size(&op, m_new_size);
}
if (image_ctx.old_format) {
cls_client::old_snapshot_add(&op, m_snap_id, m_snap_name);
} else {
- if (image_ctx.exclusive_lock != nullptr) {
- image_ctx.exclusive_lock->assert_header_locked(&op);
- }
cls_client::snapshot_add(&op, m_snap_id, m_snap_name);
}
if (image_ctx.old_format) {
cls_client::old_snapshot_remove(&op, m_snap_name);
} else {
- if (image_ctx.exclusive_lock != nullptr &&
- image_ctx.exclusive_lock->is_lock_owner()) {
- image_ctx.exclusive_lock->assert_header_locked(&op);
- }
cls_client::snapshot_remove(&op, m_snap_id);
}
if (image_ctx.old_format) {
cls_client::old_snapshot_rename(&op, m_snap_id, m_snap_name);
} else {
- if (image_ctx.exclusive_lock != nullptr &&
- image_ctx.exclusive_lock->is_lock_owner()) {
- image_ctx.exclusive_lock->assert_header_locked(&op);
- }
cls_client::snapshot_rename(&op, m_snap_id, m_snap_name);
}
struct MockExclusiveLock {
MOCK_CONST_METHOD0(is_lock_owner, bool());
- MOCK_METHOD1(assert_header_locked, void(librados::ObjectWriteOperation *));
-
MOCK_METHOD2(init, void(uint64_t features, Context*));
MOCK_METHOD1(shut_down, void(Context*));
C_SaferCond cond_ctx;
AsyncRequest<> *request = new InvalidateRequest<>(*ictx, CEPH_NOSNAP, false, &cond_ctx);
- EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
- exec(ictx->header_oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _))
- .WillOnce(DoDefault());
EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
.WillOnce(DoDefault());
AsyncRequest<> *request = new InvalidateRequest<>(*ictx, ictx->snap_id, false,
&cond_ctx);
- EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
- exec(ictx->header_oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _))
- .Times(0);
EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
.WillOnce(DoDefault());
C_SaferCond cond_ctx;
AsyncRequest<> *request = new InvalidateRequest<>(*ictx, CEPH_NOSNAP, false, &cond_ctx);
- EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
- exec(ictx->header_oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _))
- .WillOnce(DoDefault());
EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
.WillOnce(Return(-EINVAL));
}
void expect_invalidate(librbd::ImageCtx *ictx) {
- EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
- exec(ictx->header_oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _)).Times(0);
EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
.WillOnce(DoDefault());
}
void expect_invalidate(librbd::ImageCtx *ictx) {
- EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
- exec(ictx->header_oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _))
- .Times(0);
EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
.WillOnce(DoDefault());
}
void expect_invalidate(librbd::ImageCtx *ictx, uint32_t times) {
- EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
- exec(ictx->header_oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _))
- .Times(0);
EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
.Times(times)
}
void expect_invalidate(librbd::ImageCtx *ictx) {
- EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
- exec(ictx->header_oid, _, StrEq("lock"), StrEq("assert_locked"), _, _, _))
- .Times(0);
EXPECT_CALL(get_mock_io_ctx(ictx->md_ctx),
exec(ictx->header_oid, _, StrEq("rbd"), StrEq("set_flags"), _, _, _))
.WillOnce(DoDefault());
.WillOnce(Return(r));
} else {
expect_is_lock_owner(mock_image_ctx);
- if (mock_image_ctx.exclusive_lock != nullptr) {
- EXPECT_CALL(*mock_image_ctx.exclusive_lock, assert_header_locked(_));
- }
EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx),
exec(mock_image_ctx.header_oid, _, StrEq("rbd"), StrEq("set_size"), _, _, _))
.WillOnce(Return(r));
}
void expect_snap_create(MockImageCtx &mock_image_ctx, int r) {
- if (!mock_image_ctx.old_format &&
- mock_image_ctx.exclusive_lock != nullptr) {
- EXPECT_CALL(*mock_image_ctx.exclusive_lock, assert_header_locked(_))
- .Times(r == -ESTALE ? 2 : 1);
- }
-
auto &expect = EXPECT_CALL(get_mock_io_ctx(mock_image_ctx.md_ctx),
exec(mock_image_ctx.header_oid, _, StrEq("rbd"),
StrEq(mock_image_ctx.old_format ? "snap_add" :