using ::testing::InSequence;
using ::testing::Invoke;
using ::testing::Return;
-using ::testing::ReturnNew;
using ::testing::WithArg;
using ::testing::InvokeWithoutArgs;
ASSERT_EQ(0, open_image(m_local_io_ctx, m_image_name, &m_local_image_ctx));
}
- void expect_start_op(librbd::MockExclusiveLock &mock_exclusive_lock) {
- EXPECT_CALL(mock_exclusive_lock, start_op()).WillOnce(
- ReturnNew<FunctionContext>([](int) {}));
- }
-
void expect_get_snap_id(librbd::MockTestImageCtx &mock_image_ctx) {
EXPECT_CALL(mock_image_ctx, get_snap_id(_, _))
.WillRepeatedly(Invoke([&mock_image_ctx](cls::rbd::SnapshotNamespace snap_namespace,
journal::MockJournaler mock_journaler;
MockObjectCopyRequest mock_object_copy_request;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
InSequence seq;
expect_get_object_count(mock_remote_image_ctx, 1);
expect_get_object_count(mock_remote_image_ctx, 0);
expect_update_client(mock_journaler, 0);
- expect_start_op(mock_exclusive_lock);
expect_object_copy_send(mock_object_copy_request);
expect_update_client(mock_journaler, 0);
journal::MockJournaler mock_journaler;
MockObjectCopyRequest mock_object_copy_request;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
expect_get_object_count(mock_remote_image_ctx, object_count);
expect_get_object_count(mock_remote_image_ctx, 0);
- EXPECT_CALL(mock_exclusive_lock, start_op())
- .Times(object_count).WillRepeatedly(ReturnNew<FunctionContext>([](int) {}));
EXPECT_CALL(mock_object_copy_request, send()).Times(object_count);
boost::optional<uint64_t> expected_object_number(boost::none);
journal::MockJournaler mock_journaler;
MockObjectCopyRequest mock_object_copy_request;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
InSequence seq;
expect_get_object_count(mock_remote_image_ctx, 1);
expect_get_object_count(mock_remote_image_ctx, 1);
expect_update_client(mock_journaler, 0);
- expect_start_op(mock_exclusive_lock);
expect_object_copy_send(mock_object_copy_request);
expect_update_client(mock_journaler, 0);
journal::MockJournaler mock_journaler;
MockObjectCopyRequest mock_object_copy_request;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
InSequence seq;
expect_get_object_count(mock_remote_image_ctx, 0);
expect_get_object_count(mock_remote_image_ctx, 0);
expect_update_client(mock_journaler, 0);
- expect_start_op(mock_exclusive_lock);
expect_object_copy_send(mock_object_copy_request);
expect_update_client(mock_journaler, 0);
journal::MockJournaler mock_journaler;
MockObjectCopyRequest mock_object_copy_request;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
InSequence seq;
expect_get_object_count(mock_remote_image_ctx, 1);
expect_get_object_count(mock_remote_image_ctx, 2);
expect_update_client(mock_journaler, 0);
- expect_start_op(mock_exclusive_lock);
expect_object_copy_send(mock_object_copy_request);
expect_update_client(mock_journaler, 0);
journal::MockJournaler mock_journaler;
MockObjectCopyRequest mock_object_copy_request;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
InSequence seq;
expect_get_object_count(mock_remote_image_ctx, 2);
expect_get_object_count(mock_remote_image_ctx, 2);
expect_update_client(mock_journaler, 0);
- expect_start_op(mock_exclusive_lock);
expect_object_copy_send(mock_object_copy_request);
C_SaferCond ctx;
journal::MockJournaler mock_journaler;
MockObjectCopyRequest mock_object_copy_request;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
expect_get_object_count(mock_remote_image_ctx, 10);
expect_get_object_count(mock_remote_image_ctx, 0);
- EXPECT_CALL(mock_exclusive_lock, start_op())
- .Times(6).WillRepeatedly(ReturnNew<FunctionContext>([](int) {}));
EXPECT_CALL(mock_object_copy_request, send()).Times(6);
EXPECT_CALL(mock_journaler, update_client(_, _))
journal::MockJournaler mock_journaler;
MockObjectCopyRequest mock_object_copy_request;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
C_SaferCond ctx;
MockImageCopyRequest *request = create_request(mock_remote_image_ctx,
mock_local_image_ctx,
librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
journal::MockJournaler mock_journaler;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
C_SaferCond ctx;
librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
journal::MockJournaler mock_journaler;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
C_SaferCond ctx;
librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
journal::MockJournaler mock_journaler;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
C_SaferCond ctx;
librbd::MockTestImageCtx mock_local_image_ctx(*m_local_image_ctx);
journal::MockJournaler mock_journaler;
- librbd::MockExclusiveLock mock_exclusive_lock;
- mock_local_image_ctx.exclusive_lock = &mock_exclusive_lock;
-
expect_get_snap_id(mock_remote_image_ctx);
C_SaferCond ctx;
#include "common/errno.h"
#include "common/Timer.h"
#include "journal/Journaler.h"
-#include "librbd/ExclusiveLock.h"
#include "librbd/Utils.h"
#include "tools/rbd_mirror/ProgressContext.h"
bool complete;
{
- RWLock::RLocker owner_locker(m_local_image_ctx->owner_lock);
Mutex::Locker locker(m_lock);
for (int i = 0; i < cct->_conf->rbd_concurrent_management_ops; ++i) {
send_next_object_copy();
template <typename I>
void ImageCopyRequest<I>::send_next_object_copy() {
- assert(m_local_image_ctx->owner_lock.is_locked());
assert(m_lock.is_locked());
if (m_canceled && m_ret_val == 0) {
++m_current_ops;
- Context *finish_op_ctx = nullptr;
- if (m_local_image_ctx->exclusive_lock != nullptr) {
- finish_op_ctx = m_local_image_ctx->exclusive_lock->start_op();
- }
- if (finish_op_ctx == nullptr) {
- derr << ": lost exclusive lock" << dendl;
- finish(-EROFS);
- return;
- }
-
- auto ctx = new FunctionContext([this, finish_op_ctx](int r) {
- handle_object_copy(r);
- finish_op_ctx->complete(0);
- });
+ Context *ctx = create_context_callback<
+ ImageCopyRequest<I>, &ImageCopyRequest<I>::handle_object_copy>(this);
ObjectCopyRequest<I> *req = ObjectCopyRequest<I>::create(
m_local_image_ctx, m_remote_image_ctx, &m_snap_map, ono, ctx);
req->send();
int percent;
bool complete;
{
- RWLock::RLocker owner_locker(m_local_image_ctx->owner_lock);
Mutex::Locker locker(m_lock);
assert(m_current_ops > 0);
--m_current_ops;