InSequence seq;
expect_is_refresh_required(mock_image_ctx, false);
- MockObjectMap *mock_object_map = new MockObjectMap();
+ MockObjectMap mock_object_map;
expect_test_features(mock_image_ctx, RBD_FEATURE_OBJECT_MAP, true);
- expect_create_object_map(mock_image_ctx, mock_object_map);
- expect_open_object_map(mock_image_ctx, *mock_object_map, 0);
+ expect_create_object_map(mock_image_ctx, &mock_object_map);
+ expect_open_object_map(mock_image_ctx, mock_object_map, 0);
- MockJournal *mock_journal = new MockJournal();
+ MockJournal mock_journal;
MockJournalPolicy mock_journal_policy;
expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING,
mock_image_ctx.image_lock, true);
expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
expect_journal_disabled(mock_journal_policy, false);
- expect_create_journal(mock_image_ctx, mock_journal);
+ expect_create_journal(mock_image_ctx, &mock_journal);
expect_handle_prepare_lock_complete(mock_image_ctx);
- expect_open_journal(mock_image_ctx, *mock_journal, -EINVAL);
- expect_close_journal(mock_image_ctx, *mock_journal);
- expect_close_object_map(mock_image_ctx, *mock_object_map);
+ expect_open_journal(mock_image_ctx, mock_journal, -EINVAL);
+ expect_close_journal(mock_image_ctx, mock_journal);
+ expect_close_object_map(mock_image_ctx, mock_object_map);
C_SaferCond acquire_ctx;
C_SaferCond ctx;
InSequence seq;
expect_is_refresh_required(mock_image_ctx, false);
- MockObjectMap *mock_object_map = new MockObjectMap();
+ MockObjectMap mock_object_map;
expect_test_features(mock_image_ctx, RBD_FEATURE_OBJECT_MAP, true);
- expect_create_object_map(mock_image_ctx, mock_object_map);
- expect_open_object_map(mock_image_ctx, *mock_object_map, 0);
+ expect_create_object_map(mock_image_ctx, &mock_object_map);
+ expect_open_object_map(mock_image_ctx, mock_object_map, 0);
- MockJournal *mock_journal = new MockJournal();
+ MockJournal mock_journal;
MockJournalPolicy mock_journal_policy;
expect_test_features(mock_image_ctx, RBD_FEATURE_JOURNALING,
mock_image_ctx.image_lock, true);
expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
expect_journal_disabled(mock_journal_policy, false);
- expect_create_journal(mock_image_ctx, mock_journal);
+ expect_create_journal(mock_image_ctx, &mock_journal);
expect_handle_prepare_lock_complete(mock_image_ctx);
- expect_open_journal(mock_image_ctx, *mock_journal, 0);
+ expect_open_journal(mock_image_ctx, mock_journal, 0);
expect_get_journal_policy(mock_image_ctx, mock_journal_policy);
expect_allocate_journal_tag(mock_image_ctx, mock_journal_policy, -EPERM);
- expect_close_journal(mock_image_ctx, *mock_journal);
- expect_close_object_map(mock_image_ctx, *mock_object_map);
+ expect_close_journal(mock_image_ctx, mock_journal);
+ expect_close_object_map(mock_image_ctx, mock_object_map);
C_SaferCond acquire_ctx;
C_SaferCond ctx;
InSequence seq;
expect_is_refresh_required(mock_image_ctx, false);
- MockObjectMap *mock_object_map = new MockObjectMap();
+ MockObjectMap mock_object_map;
expect_test_features(mock_image_ctx, RBD_FEATURE_OBJECT_MAP, true);
- expect_create_object_map(mock_image_ctx, mock_object_map);
- expect_open_object_map(mock_image_ctx, *mock_object_map, -EINVAL);
+ expect_create_object_map(mock_image_ctx, &mock_object_map);
+ expect_open_object_map(mock_image_ctx, mock_object_map, -EINVAL);
expect_handle_prepare_lock_complete(mock_image_ctx);
C_SaferCond *acquire_ctx = new C_SaferCond();
InSequence seq;
expect_is_refresh_required(mock_image_ctx, false);
- MockObjectMap *mock_object_map = new MockObjectMap();
+ MockObjectMap mock_object_map;
expect_test_features(mock_image_ctx, RBD_FEATURE_OBJECT_MAP, true);
- expect_create_object_map(mock_image_ctx, mock_object_map);
- expect_open_object_map(mock_image_ctx, *mock_object_map, -EFBIG);
+ expect_create_object_map(mock_image_ctx, &mock_object_map);
+ expect_open_object_map(mock_image_ctx, mock_object_map, -EFBIG);
MockJournal mock_journal;
MockJournalPolicy mock_journal_policy;
expect_flush_notifies(mock_image_ctx);
- MockJournal *mock_journal = new MockJournal();
- mock_image_ctx.journal = mock_journal;
- expect_close_journal(mock_image_ctx, *mock_journal, -EINVAL);
+ MockJournal mock_journal;
+ mock_image_ctx.journal = &mock_journal;
+ expect_close_journal(mock_image_ctx, mock_journal, -EINVAL);
- MockObjectMap *mock_object_map = new MockObjectMap();
- mock_image_ctx.object_map = mock_object_map;
- expect_close_object_map(mock_image_ctx, *mock_object_map);
+ MockObjectMap mock_object_map;
+ mock_image_ctx.object_map = &mock_object_map;
+ expect_close_object_map(mock_image_ctx, mock_object_map);
expect_handle_prepare_lock_complete(mock_image_ctx);
expect_flush_notifies(mock_image_ctx);
- MockObjectMap *mock_object_map = new MockObjectMap();
- mock_image_ctx.object_map = mock_object_map;
- expect_close_object_map(mock_image_ctx, *mock_object_map);
+ MockObjectMap mock_object_map;
+ mock_image_ctx.object_map = &mock_object_map;
+ expect_close_object_map(mock_image_ctx, mock_object_map);
expect_handle_prepare_lock_complete(mock_image_ctx);
expect_flush_notifies(mock_image_ctx);
- MockJournal *mock_journal = new MockJournal();
- mock_image_ctx.journal = mock_journal;
- expect_close_journal(mock_image_ctx, *mock_journal, -EBLACKLISTED);
+ MockJournal mock_journal;
+ mock_image_ctx.journal = &mock_journal;
+ expect_close_journal(mock_image_ctx, mock_journal, -EBLACKLISTED);
- MockObjectMap *mock_object_map = new MockObjectMap();
- mock_image_ctx.object_map = mock_object_map;
- expect_close_object_map(mock_image_ctx, *mock_object_map);
+ MockObjectMap mock_object_map;
+ mock_image_ctx.object_map = &mock_object_map;
+ expect_close_object_map(mock_image_ctx, mock_object_map);
expect_handle_prepare_lock_complete(mock_image_ctx);
TEST_F(TestMockImagePreRemoveRequest, Force) {
REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);
- MockExclusiveLock *mock_exclusive_lock = new MockExclusiveLock();
- m_mock_imctx->exclusive_lock = mock_exclusive_lock;
+ MockExclusiveLock mock_exclusive_lock;
+ m_mock_imctx->exclusive_lock = &mock_exclusive_lock;
expect_op_work_queue(*m_mock_imctx);
expect_test_features(*m_mock_imctx);
InSequence seq;
expect_set_journal_policy(*m_mock_imctx);
- expect_try_acquire_exclusive_lock(*m_mock_imctx, *mock_exclusive_lock,
+ expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock,
-EINVAL);
- expect_shut_down_exclusive_lock(*m_mock_imctx, *mock_exclusive_lock, 0);
+ expect_shut_down_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, 0);
MockListWatchersRequest mock_list_watchers_request;
expect_list_image_watchers(*m_mock_imctx, mock_list_watchers_request, 0);
TEST_F(TestMockImagePreRemoveRequest, ExclusiveLockShutDownFailed) {
REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);
- MockExclusiveLock *mock_exclusive_lock = new MockExclusiveLock();
- m_mock_imctx->exclusive_lock = mock_exclusive_lock;
+ MockExclusiveLock mock_exclusive_lock;
+ m_mock_imctx->exclusive_lock = &mock_exclusive_lock;
expect_op_work_queue(*m_mock_imctx);
expect_test_features(*m_mock_imctx);
InSequence seq;
expect_set_journal_policy(*m_mock_imctx);
- expect_try_acquire_exclusive_lock(*m_mock_imctx, *mock_exclusive_lock, -EINVAL);
- expect_shut_down_exclusive_lock(*m_mock_imctx, *mock_exclusive_lock, -EINVAL);
+ expect_try_acquire_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, -EINVAL);
+ expect_shut_down_exclusive_lock(*m_mock_imctx, mock_exclusive_lock, -EINVAL);
C_SaferCond ctx;
auto req = MockPreRemoveRequest::create(m_mock_imctx, true, &ctx);
MockRefreshImageCtx mock_image_ctx(*ictx);
MockRefreshParentRequest mock_refresh_parent_request;
- MockExclusiveLock *mock_exclusive_lock = new MockExclusiveLock();
- mock_image_ctx.exclusive_lock = mock_exclusive_lock;
+ MockExclusiveLock mock_exclusive_lock;
+ mock_image_ctx.exclusive_lock = &mock_exclusive_lock;
MockObjectMap mock_object_map;
if (ictx->test_features(RBD_FEATURE_OBJECT_MAP)) {
expect_apply_metadata(mock_image_ctx, 0);
expect_get_group(mock_image_ctx, 0);
expect_refresh_parent_is_required(mock_refresh_parent_request, false);
- expect_shut_down_exclusive_lock(mock_image_ctx, *mock_exclusive_lock, 0);
+ expect_shut_down_exclusive_lock(mock_image_ctx, mock_exclusive_lock, 0);
C_SaferCond ctx;
MockRefreshRequest *req = new MockRefreshRequest(mock_image_ctx, false, false, &ctx);
mock_image_ctx.object_map = &mock_object_map;
}
- MockJournal *mock_journal = new MockJournal();
- mock_image_ctx.journal = mock_journal;
+ MockJournal mock_journal;
+ mock_image_ctx.journal = &mock_journal;
if (ictx->test_features(RBD_FEATURE_JOURNALING)) {
ASSERT_EQ(0, ictx->operations->update_features(RBD_FEATURE_JOURNALING,
if (!mock_image_ctx.clone_copy_on_read) {
expect_set_require_lock(mock_image_ctx, librbd::io::DIRECTION_READ, false);
}
- expect_close_journal(mock_image_ctx, *mock_journal, 0);
+ expect_close_journal(mock_image_ctx, mock_journal, 0);
expect_unblock_writes(mock_image_ctx);
C_SaferCond ctx;
MockExclusiveLock mock_exclusive_lock;
mock_image_ctx.exclusive_lock = &mock_exclusive_lock;
- MockObjectMap *mock_object_map = new MockObjectMap();
- mock_image_ctx.object_map = mock_object_map;
+ MockObjectMap mock_object_map;
+ mock_image_ctx.object_map = &mock_object_map;
MockJournal mock_journal;
if (ictx->test_features(RBD_FEATURE_JOURNALING)) {
expect_apply_metadata(mock_image_ctx, 0);
expect_get_group(mock_image_ctx, 0);
expect_refresh_parent_is_required(mock_refresh_parent_request, false);
- expect_close_object_map(mock_image_ctx, *mock_object_map, 0);
+ expect_close_object_map(mock_image_ctx, mock_object_map, 0);
C_SaferCond ctx;
MockRefreshRequest *req = new MockRefreshRequest(mock_image_ctx, false, false, &ctx);
MockExclusiveLock mock_exclusive_lock;
mock_image_ctx.exclusive_lock = &mock_exclusive_lock;
- MockObjectMap *mock_object_map = new MockObjectMap();
+ MockObjectMap mock_object_map;
expect_op_work_queue(mock_image_ctx);
expect_test_features(mock_image_ctx);
expect_apply_metadata(mock_image_ctx, 0);
expect_get_group(mock_image_ctx, 0);
expect_refresh_parent_is_required(mock_refresh_parent_request, false);
- expect_open_object_map(mock_image_ctx, mock_object_map, -EBLACKLISTED);
+ expect_open_object_map(mock_image_ctx, &mock_object_map, -EBLACKLISTED);
C_SaferCond ctx;
MockRefreshRequest *req = new MockRefreshRequest(mock_image_ctx, false, false,
MockExclusiveLock mock_exclusive_lock;
mock_image_ctx.exclusive_lock = &mock_exclusive_lock;
- MockObjectMap *mock_object_map = new MockObjectMap();
+ MockObjectMap mock_object_map;
expect_op_work_queue(mock_image_ctx);
expect_test_features(mock_image_ctx);
expect_apply_metadata(mock_image_ctx, 0);
expect_get_group(mock_image_ctx, 0);
expect_refresh_parent_is_required(mock_refresh_parent_request, false);
- expect_open_object_map(mock_image_ctx, mock_object_map, -EFBIG);
+ expect_open_object_map(mock_image_ctx, &mock_object_map, -EFBIG);
C_SaferCond ctx;
MockRefreshRequest *req = new MockRefreshRequest(mock_image_ctx, false, false,
C_SaferCond close_cond;
ictx->journal->close(&close_cond);
ASSERT_EQ(0, close_cond.wait());
- delete ictx->journal;
+
+ ictx->journal->put();
ictx->journal = nullptr;
C_SaferCond cond;
#ifndef CEPH_TEST_LIBRBD_MOCK_EXCLUSIVE_LOCK_H
#define CEPH_TEST_LIBRBD_MOCK_EXCLUSIVE_LOCK_H
+#include "common/RefCountedObj.h"
#include "include/int_types.h"
#include "include/rados/librados.hpp"
#include "librbd/exclusive_lock/Policy.h"
MOCK_METHOD0(get_unlocked_op_error, int());
MOCK_METHOD1(start_op, Context*(int*));
+
+ void get() {}
+ void put() {}
};
} // namespace librbd
#ifndef CEPH_TEST_LIBRBD_MOCK_JOURNAL_H
#define CEPH_TEST_LIBRBD_MOCK_JOURNAL_H
+#include "common/RefCountedObj.h"
#include "gmock/gmock.h"
#include "include/rados/librados_fwd.hpp"
#include "librbd/Journal.h"
s_instance = this;
}
+ void get() {}
+ void put() {}
+
MOCK_CONST_METHOD0(is_journal_ready, bool());
MOCK_CONST_METHOD0(is_journal_replaying, bool());
MOCK_CONST_METHOD0(is_journal_appending, bool());
MOCK_METHOD3(aio_resize, void(uint64_t new_size, uint8_t default_object_state,
Context *on_finish));
+ void get() {}
+ void put() {}
+
template <typename T, void(T::*MF)(int) = &T::complete>
bool aio_update(uint64_t snap_id, uint64_t start_object_no, uint8_t new_state,
const boost::optional<uint8_t> ¤t_state,
C_SaferCond cond_ctx1;
{
- librbd::ObjectMap om(*ictx, ictx->snap_id);
+ librbd::ObjectMap<> *om = new librbd::ObjectMap<>(*ictx, ictx->snap_id);
std::shared_lock owner_locker{ictx->owner_lock};
std::unique_lock image_locker{ictx->image_lock};
- om.set_object_map(object_map);
- om.aio_save(&cond_ctx1);
+ om->set_object_map(object_map);
+ om->aio_save(&cond_ctx1);
+ om->put();
}
ASSERT_EQ(0, cond_ctx1.wait());
ASSERT_EQ(0, snap_create(*ictx, "snap1"));
MockOperationImageCtx mock_image_ctx(*ictx);
MockExclusiveLock mock_exclusive_lock;
- MockJournal mock_journal_stack;
- MockJournal *mock_journal = &mock_journal_stack;
- if (features_to_disable & RBD_FEATURE_JOURNALING) {
- mock_journal = new MockJournal();
- }
+ MockJournal mock_journal;
MockObjectMap mock_object_map;
- initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, *mock_journal,
+ initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
mock_object_map);
expect_verify_lock_ownership(mock_image_ctx);
MockOperationImageCtx mock_image_ctx(*ictx);
MockExclusiveLock mock_exclusive_lock;
- MockJournal *mock_journal = new MockJournal();
+ MockJournal mock_journal;
MockObjectMap mock_object_map;
- initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, *mock_journal,
+ initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
mock_object_map);
expect_verify_lock_ownership(mock_image_ctx);
MockOperationImageCtx mock_image_ctx(*ictx);
MockExclusiveLock mock_exclusive_lock;
- MockJournal *mock_journal = new MockJournal();
+ MockJournal mock_journal;
MockObjectMap mock_object_map;
- initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, *mock_journal,
+ initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
mock_object_map);
expect_verify_lock_ownership(mock_image_ctx);
MockOperationImageCtx mock_image_ctx(*ictx);
MockExclusiveLock mock_exclusive_lock;
MockJournal mock_journal;
- MockObjectMap *mock_object_map = new MockObjectMap();
- MockObjectMap *mock_snap_object_map = new MockObjectMap();
+ MockObjectMap mock_object_map;
+ MockObjectMap mock_snap_object_map;
initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
- *mock_object_map);
+ mock_object_map);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
expect_resize(mock_image_ctx, mock_resize_request, 0);
expect_get_flags(mock_image_ctx, 123, 0);
- expect_get_snap_object_map(mock_image_ctx, mock_snap_object_map, 123);
- expect_rollback_object_map(mock_image_ctx, *mock_object_map);
+ expect_get_snap_object_map(mock_image_ctx, &mock_snap_object_map, 123);
+ expect_rollback_object_map(mock_image_ctx, mock_object_map);
expect_rollback(mock_image_ctx, 0);
- expect_refresh_object_map(mock_image_ctx, *mock_object_map);
+ expect_refresh_object_map(mock_image_ctx, mock_object_map);
expect_invalidate_cache(mock_image_ctx, 0);
expect_commit_op_event(mock_image_ctx, 0);
expect_unblock_writes(mock_image_ctx);
MockOperationImageCtx mock_image_ctx(*ictx);
MockExclusiveLock mock_exclusive_lock;
MockJournal mock_journal;
- MockObjectMap *mock_object_map = new MockObjectMap();
- MockObjectMap *mock_snap_object_map = new MockObjectMap();
+ MockObjectMap mock_object_map;
+ MockObjectMap mock_snap_object_map;
initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
- *mock_object_map);
+ mock_object_map);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
expect_get_image_size(mock_image_ctx, 345);
expect_get_flags(mock_image_ctx, 123, 0);
- expect_get_snap_object_map(mock_image_ctx, mock_snap_object_map, 123);
- expect_rollback_object_map(mock_image_ctx, *mock_object_map);
+ expect_get_snap_object_map(mock_image_ctx, &mock_snap_object_map, 123);
+ expect_rollback_object_map(mock_image_ctx, mock_object_map);
expect_rollback(mock_image_ctx, 0);
- expect_refresh_object_map(mock_image_ctx, *mock_object_map);
+ expect_refresh_object_map(mock_image_ctx, mock_object_map);
expect_invalidate_cache(mock_image_ctx, 0);
expect_commit_op_event(mock_image_ctx, 0);
expect_unblock_writes(mock_image_ctx);
MockExclusiveLock mock_exclusive_lock;
MockJournal mock_journal;
MockObjectMap mock_object_map;
- MockObjectMap *mock_snap_object_map = new MockObjectMap();
+ MockObjectMap mock_snap_object_map;
initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
mock_object_map);
expect_op_work_queue(mock_image_ctx);
expect_block_writes(mock_image_ctx, 0);
expect_resize(mock_image_ctx, mock_resize_request, 0);
expect_get_flags(mock_image_ctx, 123, 0);
- expect_get_snap_object_map(mock_image_ctx, mock_snap_object_map, 123);
+ expect_get_snap_object_map(mock_image_ctx, &mock_snap_object_map, 123);
expect_rollback_object_map(mock_image_ctx, mock_object_map);
expect_rollback(mock_image_ctx, -EINVAL);
expect_commit_op_event(mock_image_ctx, -EINVAL);
MockOperationImageCtx mock_image_ctx(*ictx);
MockExclusiveLock mock_exclusive_lock;
MockJournal mock_journal;
- MockObjectMap *mock_object_map = new MockObjectMap();
- MockObjectMap *mock_snap_object_map = new MockObjectMap();
+ MockObjectMap mock_object_map;
+ MockObjectMap mock_snap_object_map;
initialize_features(ictx, mock_image_ctx, mock_exclusive_lock, mock_journal,
- *mock_object_map);
+ mock_object_map);
expect_op_work_queue(mock_image_ctx);
InSequence seq;
expect_block_writes(mock_image_ctx, 0);
expect_resize(mock_image_ctx, mock_resize_request, 0);
expect_get_flags(mock_image_ctx, 123, 0);
- expect_get_snap_object_map(mock_image_ctx, mock_snap_object_map, 123);
- expect_rollback_object_map(mock_image_ctx, *mock_object_map);
+ expect_get_snap_object_map(mock_image_ctx, &mock_snap_object_map, 123);
+ expect_rollback_object_map(mock_image_ctx, mock_object_map);
expect_rollback(mock_image_ctx, 0);
- expect_refresh_object_map(mock_image_ctx, *mock_object_map);
+ expect_refresh_object_map(mock_image_ctx, mock_object_map);
expect_invalidate_cache(mock_image_ctx, -EINVAL);
expect_commit_op_event(mock_image_ctx, -EINVAL);
expect_unblock_writes(mock_image_ctx);
int when_open_object_map(librbd::ImageCtx *ictx) {
C_SaferCond ctx;
- librbd::ObjectMap<> object_map(*ictx, ictx->snap_id);
- object_map.open(&ctx);
- return ctx.wait();
+ librbd::ObjectMap<> *object_map = new librbd::ObjectMap<>(*ictx, ictx->snap_id);
+ object_map->open(&ctx);
+ int r = ctx.wait();
+ object_map->put();
+
+ return r;
}
};
state = OBJECT_EXISTS_CLEAN;
}
- librbd::ObjectMap<> object_map(*ictx2, ictx2->snap_id);
+ librbd::ObjectMap<> *object_map = new librbd::ObjectMap<>(*ictx2, ictx2->snap_id);
C_SaferCond ctx;
- object_map.open(&ctx);
+ object_map->open(&ctx);
ASSERT_EQ(0, ctx.wait());
- ASSERT_EQ(state, object_map[0]);
+
+ std::shared_lock image_locker{ictx2->image_lock};
+ ASSERT_EQ(state, (*object_map)[0]);
+ object_map->put();
}
}
}
state = OBJECT_NONEXISTENT;
}
- librbd::ObjectMap<> object_map(*ictx2, ictx2->snap_id);
+ librbd::ObjectMap<> *object_map = new librbd::ObjectMap<>(*ictx2, ictx2->snap_id);
C_SaferCond ctx;
- object_map.open(&ctx);
+ object_map->open(&ctx);
ASSERT_EQ(0, ctx.wait());
std::shared_lock image_locker{ictx2->image_lock};
- ASSERT_EQ(state, object_map[0]);
+ ASSERT_EQ(state, (*object_map)[0]);
+ object_map->put();
}
}
}
state = OBJECT_NONEXISTENT;
}
- librbd::ObjectMap<> object_map(*ictx2, ictx2->snap_id);
+ librbd::ObjectMap<> *object_map = new librbd::ObjectMap<>(*ictx2, ictx2->snap_id);
C_SaferCond ctx;
- object_map.open(&ctx);
+ object_map->open(&ctx);
ASSERT_EQ(0, ctx.wait());
std::shared_lock image_locker{ictx2->image_lock};
- ASSERT_EQ(state, object_map[0]);
+ ASSERT_EQ(state, (*object_map)[0]);
+ object_map->put();
}
}
}
#include "gmock/gmock.h"
#include "gtest/gtest.h"
+#include <boost/scope_exit.hpp>
namespace librbd {
librbd::MockExclusiveLock mock_exclusive_lock;
mock_dst_image_ctx.exclusive_lock = &mock_exclusive_lock;
- librbd::MockObjectMap *mock_object_map =
- is_feature_enabled(RBD_FEATURE_OBJECT_MAP) ?
- new librbd::MockObjectMap() : nullptr;
- mock_dst_image_ctx.object_map = mock_object_map;
+ librbd::MockObjectMap mock_object_map;
+
+ mock_dst_image_ctx.object_map = nullptr;
+ if (is_feature_enabled(RBD_FEATURE_OBJECT_MAP)) {
+ mock_dst_image_ctx.object_map = &mock_object_map;
+ }
expect_test_features(mock_dst_image_ctx);
InSequence seq;
expect_copy_snapshots(mock_snapshot_copy_request, 0);
expect_copy_image(mock_image_copy_request, 0);
- if (mock_object_map != nullptr) {
- expect_refresh_object_map(mock_dst_image_ctx, mock_object_map, 0);
+ if (mock_dst_image_ctx.object_map != nullptr) {
+ expect_refresh_object_map(mock_dst_image_ctx, &mock_object_map, 0);
}
expect_copy_metadata(mock_metadata_copy_request, 0);
librbd::MockExclusiveLock mock_exclusive_lock;
mock_dst_image_ctx.exclusive_lock = &mock_exclusive_lock;
- librbd::MockObjectMap *mock_object_map =
- is_feature_enabled(RBD_FEATURE_OBJECT_MAP) ?
- new librbd::MockObjectMap() : nullptr;
- mock_dst_image_ctx.object_map = mock_object_map;
+ librbd::MockObjectMap mock_object_map;
+
+ mock_dst_image_ctx.object_map = nullptr;
+ if (is_feature_enabled(RBD_FEATURE_OBJECT_MAP)) {
+ mock_dst_image_ctx.object_map = &mock_object_map;
+ }
expect_test_features(mock_dst_image_ctx);
InSequence seq;
expect_copy_snapshots(mock_snapshot_copy_request, 0);
expect_copy_image(mock_image_copy_request, 0);
- if (mock_object_map != nullptr) {
- expect_refresh_object_map(mock_dst_image_ctx, mock_object_map, 0);
+ if (mock_dst_image_ctx.object_map != nullptr) {
+ expect_refresh_object_map(mock_dst_image_ctx, &mock_object_map, 0);
}
expect_copy_metadata(mock_metadata_copy_request, -EINVAL);
librbd::MockExclusiveLock mock_exclusive_lock;
mock_dst_image_ctx.exclusive_lock = &mock_exclusive_lock;
- librbd::MockObjectMap *mock_object_map =
- is_feature_enabled(RBD_FEATURE_OBJECT_MAP) ?
- new librbd::MockObjectMap() : nullptr;
- mock_dst_image_ctx.object_map = mock_object_map;
+ librbd::MockObjectMap mock_object_map;
+ if (is_feature_enabled(RBD_FEATURE_OBJECT_MAP)) {
+ mock_dst_image_ctx.object_map = &mock_object_map;
+ }
expect_test_features(mock_dst_image_ctx);
InSequence seq;
expect_copy_snapshots(mock_snapshot_copy_request, 0);
expect_copy_image(mock_image_copy_request, 0);
- if (mock_object_map != nullptr) {
- expect_copy_object_map(mock_exclusive_lock, mock_object_map, 0);
- expect_refresh_object_map(mock_dst_image_ctx, mock_object_map, 0);
+ if (mock_dst_image_ctx.object_map != nullptr) {
+ expect_copy_object_map(mock_exclusive_lock, &mock_object_map, 0);
+ expect_refresh_object_map(mock_dst_image_ctx, &mock_object_map, 0);
}
expect_copy_metadata(mock_metadata_copy_request, 0);
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include <list>
+#include <boost/scope_exit.hpp>
namespace librbd {
typedef exclusive_lock::PostAcquireRequest<MockExclusiveLockImageCtx> MockPostAcquireRequest;
typedef exclusive_lock::PreReleaseRequest<MockExclusiveLockImageCtx> MockPreReleaseRequest;
- void expect_set_state_initializing(MockManagedLock &managed_lock) {
- EXPECT_CALL(managed_lock, set_state_initializing());
+ void expect_set_state_initializing(MockManagedLock *managed_lock) {
+ EXPECT_CALL(*managed_lock, set_state_initializing());
}
- void expect_set_state_unlocked(MockManagedLock &managed_lock) {
- EXPECT_CALL(managed_lock, set_state_unlocked());
+ void expect_set_state_unlocked(MockManagedLock *managed_lock) {
+ EXPECT_CALL(*managed_lock, set_state_unlocked());
}
- void expect_set_state_waiting_for_lock(MockManagedLock &managed_lock) {
- EXPECT_CALL(managed_lock, set_state_waiting_for_lock());
+ void expect_set_state_waiting_for_lock(MockManagedLock *managed_lock) {
+ EXPECT_CALL(*managed_lock, set_state_waiting_for_lock());
}
- void expect_set_state_post_acquiring(MockManagedLock &managed_lock) {
- EXPECT_CALL(managed_lock, set_state_post_acquiring());
+ void expect_set_state_post_acquiring(MockManagedLock *managed_lock) {
+ EXPECT_CALL(*managed_lock, set_state_post_acquiring());
}
- void expect_is_state_acquiring(MockManagedLock &managed_lock, bool ret_val) {
- EXPECT_CALL(managed_lock, is_state_acquiring())
+ void expect_is_state_acquiring(MockManagedLock *managed_lock, bool ret_val) {
+ EXPECT_CALL(*managed_lock, is_state_acquiring())
.WillOnce(Return(ret_val));
}
- void expect_is_state_waiting_for_lock(MockManagedLock &managed_lock,
+ void expect_is_state_waiting_for_lock(MockManagedLock *managed_lock,
bool ret_val) {
- EXPECT_CALL(managed_lock, is_state_waiting_for_lock())
+ EXPECT_CALL(*managed_lock, is_state_waiting_for_lock())
.WillOnce(Return(ret_val));
}
- void expect_is_state_pre_releasing(MockManagedLock &managed_lock,
+ void expect_is_state_pre_releasing(MockManagedLock *managed_lock,
bool ret_val) {
- EXPECT_CALL(managed_lock, is_state_pre_releasing())
+ EXPECT_CALL(*managed_lock, is_state_pre_releasing())
.WillOnce(Return(ret_val));
}
- void expect_is_state_releasing(MockManagedLock &managed_lock, bool ret_val) {
- EXPECT_CALL(managed_lock, is_state_releasing())
+ void expect_is_state_releasing(MockManagedLock *managed_lock, bool ret_val) {
+ EXPECT_CALL(*managed_lock, is_state_releasing())
.WillOnce(Return(ret_val));
}
- void expect_is_state_locked(MockManagedLock &managed_lock, bool ret_val) {
- EXPECT_CALL(managed_lock, is_state_locked())
+ void expect_is_state_locked(MockManagedLock *managed_lock, bool ret_val) {
+ EXPECT_CALL(*managed_lock, is_state_locked())
.WillOnce(Return(ret_val));
}
- void expect_is_state_shutdown(MockManagedLock &managed_lock, bool ret_val) {
- EXPECT_CALL(managed_lock, is_state_shutdown())
+ void expect_is_state_shutdown(MockManagedLock *managed_lock, bool ret_val) {
+ EXPECT_CALL(*managed_lock, is_state_shutdown())
.WillOnce(Return(ret_val));
}
- void expect_is_action_acquire_lock(MockManagedLock &managed_lock,
+ void expect_is_action_acquire_lock(MockManagedLock *managed_lock,
bool ret_val) {
- EXPECT_CALL(managed_lock, is_action_acquire_lock())
+ EXPECT_CALL(*managed_lock, is_action_acquire_lock())
.WillOnce(Return(ret_val));
}
.WillOnce(CompleteRequest(&pre_acquire_request, r));
}
- void expect_post_acquire_request(MockExclusiveLock &mock_exclusive_lock,
+ void expect_post_acquire_request(MockExclusiveLock *mock_exclusive_lock,
MockPostAcquireRequest &post_acquire_request,
int r) {
EXPECT_CALL(post_acquire_request, send())
}
void expect_notify_request_lock(MockExclusiveLockImageCtx &mock_image_ctx,
- MockExclusiveLock &mock_exclusive_lock) {
+ MockExclusiveLock *mock_exclusive_lock) {
EXPECT_CALL(*mock_image_ctx.image_watcher, notify_request_lock());
}
.WillOnce(CompleteContext(0, mock_image_ctx.image_ctx->op_work_queue));
}
- void expect_shut_down(MockManagedLock &managed_lock) {
- EXPECT_CALL(managed_lock, shut_down(_))
+ void expect_shut_down(MockManagedLock *managed_lock) {
+ EXPECT_CALL(*managed_lock, shut_down(_))
.WillOnce(CompleteContext(0, static_cast<ContextWQ*>(nullptr)));
}
}
int when_init(MockExclusiveLockImageCtx &mock_image_ctx,
- MockExclusiveLock &exclusive_lock) {
+ MockExclusiveLock *exclusive_lock) {
C_SaferCond ctx;
{
std::unique_lock owner_locker{mock_image_ctx.owner_lock};
- exclusive_lock.init(mock_image_ctx.features, &ctx);
+ exclusive_lock->init(mock_image_ctx.features, &ctx);
}
return ctx.wait();
}
- int when_pre_acquire_lock_handler(MockManagedLock &managed_lock) {
+ int when_pre_acquire_lock_handler(MockManagedLock *managed_lock) {
C_SaferCond ctx;
- managed_lock.pre_acquire_lock_handler(&ctx);
+ managed_lock->pre_acquire_lock_handler(&ctx);
return ctx.wait();
}
- int when_post_acquire_lock_handler(MockManagedLock &managed_lock, int r) {
+ int when_post_acquire_lock_handler(MockManagedLock *managed_lock, int r) {
C_SaferCond ctx;
- managed_lock.post_acquire_lock_handler(r, &ctx);
+ managed_lock->post_acquire_lock_handler(r, &ctx);
return ctx.wait();
}
- int when_pre_release_lock_handler(MockManagedLock &managed_lock,
+ int when_pre_release_lock_handler(MockManagedLock *managed_lock,
bool shutting_down) {
C_SaferCond ctx;
- managed_lock.pre_release_lock_handler(shutting_down, &ctx);
+ managed_lock->pre_release_lock_handler(shutting_down, &ctx);
return ctx.wait();
}
- int when_post_release_lock_handler(MockManagedLock &managed_lock,
+ int when_post_release_lock_handler(MockManagedLock *managed_lock,
bool shutting_down, int r) {
C_SaferCond ctx;
- managed_lock.post_release_lock_handler(shutting_down, r, &ctx);
+ managed_lock->post_release_lock_handler(shutting_down, r, &ctx);
return ctx.wait();
}
- int when_post_reacquire_lock_handler(MockManagedLock &managed_lock, int r) {
+ int when_post_reacquire_lock_handler(MockManagedLock *managed_lock, int r) {
C_SaferCond ctx;
- managed_lock.post_reacquire_lock_handler(r, &ctx);
+ managed_lock->post_reacquire_lock_handler(r, &ctx);
return ctx.wait();
}
int when_shut_down(MockExclusiveLockImageCtx &mock_image_ctx,
- MockExclusiveLock &exclusive_lock) {
+ MockExclusiveLock *exclusive_lock) {
C_SaferCond ctx;
{
std::unique_lock owner_locker{mock_image_ctx.owner_lock};
- exclusive_lock.shut_down(&ctx);
+ exclusive_lock->shut_down(&ctx);
}
return ctx.wait();
}
bool is_lock_owner(MockExclusiveLockImageCtx &mock_image_ctx,
- MockExclusiveLock &exclusive_lock) {
+ MockExclusiveLock *exclusive_lock) {
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
- return exclusive_lock.is_lock_owner();
+ return exclusive_lock->is_lock_owner();
}
};
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockExclusiveLockImageCtx mock_image_ctx(*ictx);
- MockExclusiveLock exclusive_lock(mock_image_ctx);
+ MockExclusiveLock *exclusive_lock = new MockExclusiveLock(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&exclusive_lock) {
+ exclusive_lock->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
expect_set_state_initializing(exclusive_lock);
expect_block_writes(mock_image_ctx);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockExclusiveLockImageCtx mock_image_ctx(*ictx);
- MockExclusiveLock exclusive_lock(mock_image_ctx);
+ MockExclusiveLock *exclusive_lock = new MockExclusiveLock(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
- InSequence seq;
+ BOOST_SCOPE_EXIT(&exclusive_lock) {
+ exclusive_lock->put();
+ } BOOST_SCOPE_EXIT_END
+
expect_set_state_initializing(exclusive_lock);
expect_block_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockExclusiveLockImageCtx mock_image_ctx(*ictx);
- MockExclusiveLock exclusive_lock(mock_image_ctx);
+ MockExclusiveLock *exclusive_lock = new MockExclusiveLock(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&exclusive_lock) {
+ exclusive_lock->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
expect_set_state_initializing(exclusive_lock);
expect_block_writes(mock_image_ctx);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockExclusiveLockImageCtx mock_image_ctx(*ictx);
- MockExclusiveLock exclusive_lock(mock_image_ctx);
+ MockExclusiveLock *exclusive_lock = new MockExclusiveLock(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&exclusive_lock) {
+ exclusive_lock->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
expect_set_state_initializing(exclusive_lock);
expect_block_writes(mock_image_ctx);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockExclusiveLockImageCtx mock_image_ctx(*ictx);
- MockExclusiveLock exclusive_lock(mock_image_ctx);
+ MockExclusiveLock *exclusive_lock = new MockExclusiveLock(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&exclusive_lock) {
+ exclusive_lock->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
expect_set_state_initializing(exclusive_lock);
expect_block_writes(mock_image_ctx);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockExclusiveLockImageCtx mock_image_ctx(*ictx);
- MockExclusiveLock exclusive_lock(mock_image_ctx);
+ MockExclusiveLock *exclusive_lock = new MockExclusiveLock(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&exclusive_lock) {
+ exclusive_lock->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
expect_set_state_initializing(exclusive_lock);
expect_block_writes(mock_image_ctx);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockExclusiveLockImageCtx mock_image_ctx(*ictx);
- MockExclusiveLock exclusive_lock(mock_image_ctx);
+ MockExclusiveLock *exclusive_lock = new MockExclusiveLock(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&exclusive_lock) {
+ exclusive_lock->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
expect_set_state_initializing(exclusive_lock);
expect_block_writes(mock_image_ctx);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockExclusiveLockImageCtx mock_image_ctx(*ictx);
- MockExclusiveLock exclusive_lock(mock_image_ctx);
+ MockExclusiveLock *exclusive_lock = new MockExclusiveLock(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&exclusive_lock) {
+ exclusive_lock->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
expect_set_state_initializing(exclusive_lock);
expect_block_writes(mock_image_ctx);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockExclusiveLockImageCtx mock_image_ctx(*ictx);
- MockExclusiveLock exclusive_lock(mock_image_ctx);
+ MockExclusiveLock *exclusive_lock = new MockExclusiveLock(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&exclusive_lock) {
+ exclusive_lock->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
expect_set_state_initializing(exclusive_lock);
expect_block_writes(mock_image_ctx);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockExclusiveLockImageCtx mock_image_ctx(*ictx);
- MockExclusiveLock exclusive_lock(mock_image_ctx);
+
+ MockExclusiveLock *exclusive_lock = new MockExclusiveLock(mock_image_ctx);
exclusive_lock::MockPolicy mock_exclusive_lock_policy;
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&exclusive_lock) {
+ exclusive_lock->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
expect_set_state_initializing(exclusive_lock);
expect_block_writes(mock_image_ctx);
int ret_val;
expect_is_state_shutdown(exclusive_lock, false);
expect_is_state_locked(exclusive_lock, true);
- ASSERT_TRUE(exclusive_lock.accept_request(
+ ASSERT_TRUE(exclusive_lock->accept_request(
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, &ret_val));
ASSERT_EQ(0, ret_val);
- exclusive_lock.block_requests(-EROFS);
+ exclusive_lock->block_requests(-EROFS);
expect_is_state_shutdown(exclusive_lock, false);
expect_is_state_locked(exclusive_lock, true);
expect_accept_blocked_request(mock_image_ctx, mock_exclusive_lock_policy,
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL,
false);
- ASSERT_FALSE(exclusive_lock.accept_request(
+ ASSERT_FALSE(exclusive_lock->accept_request(
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, &ret_val));
ASSERT_EQ(-EROFS, ret_val);
expect_accept_blocked_request(
mock_image_ctx, mock_exclusive_lock_policy,
exclusive_lock::OPERATION_REQUEST_TYPE_TRASH_SNAP_REMOVE, true);
- ASSERT_TRUE(exclusive_lock.accept_request(
+ ASSERT_TRUE(exclusive_lock->accept_request(
exclusive_lock::OPERATION_REQUEST_TYPE_TRASH_SNAP_REMOVE,
&ret_val));
ASSERT_EQ(0, ret_val);
- exclusive_lock.unblock_requests();
+ exclusive_lock->unblock_requests();
expect_is_state_shutdown(exclusive_lock, false);
expect_is_state_locked(exclusive_lock, true);
- ASSERT_TRUE(exclusive_lock.accept_request(
+ ASSERT_TRUE(exclusive_lock->accept_request(
exclusive_lock::OPERATION_REQUEST_TYPE_GENERAL, &ret_val));
ASSERT_EQ(0, ret_val);
}
.WillOnce(CompleteContext(0, static_cast<ContextWQ*>(NULL)));
}
- int when_open(MockJournal &mock_journal) {
+ int when_open(MockJournal *mock_journal) {
C_SaferCond ctx;
- mock_journal.open(&ctx);
+ mock_journal->open(&ctx);
return ctx.wait();
}
- int when_close(MockJournal &mock_journal) {
+ int when_close(MockJournal *mock_journal) {
C_SaferCond ctx;
- mock_journal.close(&ctx);
+ mock_journal->close(&ctx);
return ctx.wait();
}
uint64_t when_append_write_event(MockJournalImageCtx &mock_image_ctx,
- MockJournal &mock_journal, uint64_t length) {
+ MockJournal *mock_journal, uint64_t length) {
bufferlist bl;
bl.append_zero(length);
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
- return mock_journal.append_write_event(0, length, bl, false);
+ return mock_journal->append_write_event(0, length, bl, false);
}
uint64_t when_append_io_event(MockJournalImageCtx &mock_image_ctx,
- MockJournal &mock_journal,
+ MockJournal *mock_journal,
int filter_ret_val) {
std::shared_lock owner_locker{mock_image_ctx.owner_lock};
- return mock_journal.append_io_event(
+ return mock_journal->append_io_event(
journal::EventEntry{journal::AioFlushEvent{}}, 0, 0, false,
filter_ret_val);
}
}
void open_journal(MockJournalImageCtx &mock_image_ctx,
- MockJournal &mock_journal,
+ MockJournal *mock_journal,
MockObjectDispatch& mock_object_dispatch,
::journal::MockJournaler &mock_journaler,
MockJournalOpenRequest &mock_open_request,
}
void close_journal(MockJournalImageCtx& mock_image_ctx,
- MockJournal &mock_journal,
+ MockJournal *mock_journal,
::journal::MockJournaler &mock_journaler) {
expect_stop_append(mock_journaler, 0);
expect_shut_down_object_dispatch(mock_image_ctx);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&mock_journal) {
+ mock_journal->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
MockObjectDispatch mock_object_dispatch;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&mock_journal) {
+ mock_journal->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
MockObjectDispatch mock_object_dispatch;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&mock_journal) {
+ mock_journal->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
MockObjectDispatch mock_object_dispatch;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&mock_journal) {
+ mock_journal->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
MockObjectDispatch mock_object_dispatch;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&mock_journal) {
+ mock_journal->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
MockObjectDispatch mock_object_dispatch;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&mock_journal) {
+ mock_journal->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
MockObjectDispatch mock_object_dispatch;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&mock_journal) {
+ mock_journal->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
MockObjectDispatch mock_object_dispatch;
expect_register_object_dispatch(mock_image_ctx, mock_object_dispatch);
expect_set_append_batch_options(mock_image_ctx, mock_journaler, false);
C_SaferCond ctx;
- mock_journal.open(&ctx);
+ mock_journal->open(&ctx);
// wait for the process callback
{
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
expect_op_work_queue(mock_image_ctx);
+ BOOST_SCOPE_EXIT(&mock_journal) {
+ mock_journal->put();
+ } BOOST_SCOPE_EXIT_END
+
InSequence seq;
MockObjectDispatch mock_object_dispatch;
expect_set_append_batch_options(mock_image_ctx, mock_journaler, false);
C_SaferCond ctx;
- mock_journal.open(&ctx);
+ mock_journal->open(&ctx);
// proceed with the flush
{
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
::journal::MockFuture mock_future;
expect_append_journaler(mock_journaler);
expect_wait_future(mock_future, &on_journal_safe1);
ASSERT_EQ(1U, when_append_io_event(mock_image_ctx, mock_journal, 0));
- mock_journal.get_work_queue()->drain();
+ mock_journal->get_work_queue()->drain();
Context *on_journal_safe2;
expect_append_journaler(mock_journaler);
expect_wait_future(mock_future, &on_journal_safe2);
ASSERT_EQ(2U, when_append_io_event(mock_image_ctx, mock_journal, 0));
- mock_journal.get_work_queue()->drain();
+ mock_journal->get_work_queue()->drain();
// commit journal event followed by IO event (standard)
on_journal_safe1->complete(0);
ictx->op_work_queue->drain();
expect_future_committed(mock_journaler);
- mock_journal.commit_io_event(1U, 0);
+ mock_journal->commit_io_event(1U, 0);
// commit IO event followed by journal event (cache overwrite)
- mock_journal.commit_io_event(2U, 0);
+ mock_journal->commit_io_event(2U, 0);
expect_future_committed(mock_journaler);
C_SaferCond event_ctx;
- mock_journal.wait_event(2U, &event_ctx);
+ mock_journal->wait_event(2U, &event_ctx);
on_journal_safe2->complete(0);
ictx->op_work_queue->drain();
ASSERT_EQ(0, event_ctx.wait());
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
InSequence seq;
expect_append_journaler(mock_journaler);
expect_wait_future(mock_future, &on_journal_safe);
ASSERT_EQ(1U, when_append_write_event(mock_image_ctx, mock_journal, 1 << 17));
- mock_journal.get_work_queue()->drain();
+ mock_journal->get_work_queue()->drain();
on_journal_safe->complete(0);
C_SaferCond event_ctx;
- mock_journal.wait_event(1U, &event_ctx);
+ mock_journal->wait_event(1U, &event_ctx);
ASSERT_EQ(0, event_ctx.wait());
expect_future_committed(mock_journaler);
expect_future_committed(mock_journaler);
expect_future_committed(mock_journaler);
- mock_journal.commit_io_event(1U, 0);
+ mock_journal->commit_io_event(1U, 0);
ictx->op_work_queue->drain();
expect_shut_down_journaler(mock_journaler);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
::journal::MockFuture mock_future;
expect_append_journaler(mock_journaler);
expect_wait_future(mock_future, &on_journal_safe);
ASSERT_EQ(1U, when_append_io_event(mock_image_ctx, mock_journal, 0));
- mock_journal.get_work_queue()->drain();
+ mock_journal->get_work_queue()->drain();
// commit the event in the journal w/o waiting writeback
expect_future_committed(mock_journaler);
C_SaferCond object_request_ctx;
- mock_journal.wait_event(1U, &object_request_ctx);
+ mock_journal->wait_event(1U, &object_request_ctx);
on_journal_safe->complete(-EINVAL);
ASSERT_EQ(-EINVAL, object_request_ctx.wait());
// cache should receive the error after attempting writeback
expect_future_is_valid(mock_future);
C_SaferCond flush_ctx;
- mock_journal.flush_event(1U, &flush_ctx);
+ mock_journal->flush_event(1U, &flush_ctx);
ASSERT_EQ(-EINVAL, flush_ctx.wait());
expect_shut_down_journaler(mock_journaler);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
::journal::MockFuture mock_future;
expect_append_journaler(mock_journaler);
expect_wait_future(mock_future, &on_journal_safe);
ASSERT_EQ(1U, when_append_io_event(mock_image_ctx, mock_journal, 0));
- mock_journal.get_work_queue()->drain();
+ mock_journal->get_work_queue()->drain();
expect_future_is_valid(mock_future);
C_SaferCond flush_ctx;
- mock_journal.flush_event(1U, &flush_ctx);
+ mock_journal->flush_event(1U, &flush_ctx);
// commit the event in the journal w/ waiting cache writeback
expect_future_committed(mock_journaler);
C_SaferCond object_request_ctx;
- mock_journal.wait_event(1U, &object_request_ctx);
+ mock_journal->wait_event(1U, &object_request_ctx);
on_journal_safe->complete(-EINVAL);
ASSERT_EQ(-EINVAL, object_request_ctx.wait());
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
::journal::MockFuture mock_future;
expect_append_journaler(mock_journaler);
expect_wait_future(mock_future, &on_journal_safe);
ASSERT_EQ(1U, when_append_io_event(mock_image_ctx, mock_journal, 0));
- mock_journal.get_work_queue()->drain();
+ mock_journal->get_work_queue()->drain();
// failed IO remains uncommitted in journal
on_journal_safe->complete(0);
ictx->op_work_queue->drain();
- mock_journal.commit_io_event(1U, -EINVAL);
+ mock_journal->commit_io_event(1U, -EINVAL);
expect_shut_down_journaler(mock_journaler);
}
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
::journal::MockFuture mock_future;
expect_append_journaler(mock_journaler);
expect_wait_future(mock_future, &on_journal_safe);
ASSERT_EQ(1U, when_append_io_event(mock_image_ctx, mock_journal, -EILSEQ));
- mock_journal.get_work_queue()->drain();
+ mock_journal->get_work_queue()->drain();
// filter failed IO committed in journal
on_journal_safe->complete(0);
ictx->op_work_queue->drain();
expect_future_committed(mock_journaler);
- mock_journal.commit_io_event(1U, -EILSEQ);
+ mock_journal->commit_io_event(1U, -EILSEQ);
expect_shut_down_journaler(mock_journaler);
}
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
expect_flush_commit_position(mock_journaler);
C_SaferCond ctx;
- mock_journal.flush_commit_position(&ctx);
+ mock_journal->flush_commit_position(&ctx);
ASSERT_EQ(0, ctx.wait());
expect_shut_down_journaler(mock_journaler);
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
InSequence seq;
C_SaferCond start_ctx;
journal::Replay<MockJournalImageCtx> *journal_replay = nullptr;
- mock_journal.start_external_replay(&journal_replay, &start_ctx);
+ mock_journal->start_external_replay(&journal_replay, &start_ctx);
ASSERT_EQ(0, start_ctx.wait());
- mock_journal.stop_external_replay();
+ mock_journal->stop_external_replay();
}
TEST_F(TestMockJournal, ExternalReplayFailure) {
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
InSequence seq;
C_SaferCond start_ctx;
journal::Replay<MockJournalImageCtx> *journal_replay = nullptr;
- mock_journal.start_external_replay(&journal_replay, &start_ctx);
+ mock_journal->start_external_replay(&journal_replay, &start_ctx);
ASSERT_EQ(-EINVAL, start_ctx.wait());
}
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
MockJournalPolicy mock_journal_policy;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
InSequence seq;
std::shared_lock image_locker{mock_image_ctx.image_lock};
EXPECT_CALL(mock_image_ctx, get_journal_policy()).WillOnce(
Return(ictx->get_journal_policy()));
- ASSERT_TRUE(mock_journal.is_journal_appending());
+ ASSERT_TRUE(mock_journal->is_journal_appending());
EXPECT_CALL(mock_image_ctx, get_journal_policy()).WillOnce(
Return(&mock_journal_policy));
EXPECT_CALL(mock_journal_policy, append_disabled()).WillOnce(Return(true));
- ASSERT_FALSE(mock_journal.is_journal_appending());
+ ASSERT_FALSE(mock_journal->is_journal_appending());
expect_shut_down_journaler(mock_journaler);
}
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
+
+ BOOST_SCOPE_EXIT(&mock_journal) {
+ mock_journal->put();
+ } BOOST_SCOPE_EXIT_END
+
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
ADD_FAILURE() << "unexpected promotion event";
}
} listener;
- mock_journal.add_listener(&listener);
+ mock_journal->add_listener(&listener);
expect_shut_down_journaler(mock_journaler);
close_journal(mock_image_ctx, mock_journal, mock_journaler);
ASSERT_EQ(0, listener.ctx.wait());
- mock_journal.remove_listener(&listener);
+ mock_journal->remove_listener(&listener);
}
TEST_F(TestMockJournal, ResyncRequested) {
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
ADD_FAILURE() << "unexpected promotion event";
}
} listener;
- mock_journal.add_listener(&listener);
+ mock_journal->add_listener(&listener);
BOOST_SCOPE_EXIT_ALL(&) {
- mock_journal.remove_listener(&listener);
+ mock_journal->remove_listener(&listener);
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
InSequence seq;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
ctx.complete(0);
}
} listener;
- mock_journal.add_listener(&listener);
+ mock_journal->add_listener(&listener);
BOOST_SCOPE_EXIT_ALL(&) {
- mock_journal.remove_listener(&listener);
+ mock_journal->remove_listener(&listener);
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
InSequence seq;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
MockJournalImageCtx mock_image_ctx(*ictx);
- MockJournal mock_journal(mock_image_ctx);
+ MockJournal *mock_journal = new MockJournal(mock_image_ctx);
MockObjectDispatch mock_object_dispatch;
::journal::MockJournaler mock_journaler;
MockJournalOpenRequest mock_open_request;
mock_journaler, mock_open_request);
BOOST_SCOPE_EXIT_ALL(&) {
close_journal(mock_image_ctx, mock_journal, mock_journaler);
+ mock_journal->put();
};
expect_set_append_batch_options(mock_image_ctx, mock_journaler, true);
- mock_journal.user_flushed();
+ mock_journal->user_flushed();
expect_shut_down_journaler(mock_journaler);
}
#include "librbd/object_map/RefreshRequest.h"
#include "librbd/object_map/UnlockRequest.h"
#include "librbd/object_map/UpdateRequest.h"
+#include <boost/scope_exit.hpp>
namespace librbd {
MockUnlockRequest mock_unlock_request;
expect_unlock(mock_image_ctx, mock_unlock_request, 0);
- MockObjectMap mock_object_map(mock_image_ctx, CEPH_NOSNAP);
+ MockObjectMap *mock_object_map = new MockObjectMap(mock_image_ctx, CEPH_NOSNAP);
+ BOOST_SCOPE_EXIT(&mock_object_map) {
+ mock_object_map->put();
+ } BOOST_SCOPE_EXIT_END
+
C_SaferCond open_ctx;
- mock_object_map.open(&open_ctx);
+ mock_object_map->open(&open_ctx);
ASSERT_EQ(0, open_ctx.wait());
C_SaferCond update_ctx1;
C_SaferCond update_ctx2;
{
std::shared_lock image_locker{mock_image_ctx.image_lock};
- mock_object_map.aio_update(CEPH_NOSNAP, 0, 1, {}, {}, false, &update_ctx1);
- mock_object_map.aio_update(CEPH_NOSNAP, 1, 1, {}, {}, false, &update_ctx2);
+ mock_object_map->aio_update(CEPH_NOSNAP, 0, 1, {}, {}, false, &update_ctx1);
+ mock_object_map->aio_update(CEPH_NOSNAP, 1, 1, {}, {}, false, &update_ctx2);
}
finish_update_2->complete(0);
ASSERT_EQ(0, update_ctx1.wait());
C_SaferCond close_ctx;
- mock_object_map.close(&close_ctx);
+ mock_object_map->close(&close_ctx);
ASSERT_EQ(0, close_ctx.wait());
}
MockUnlockRequest mock_unlock_request;
expect_unlock(mock_image_ctx, mock_unlock_request, 0);
- MockObjectMap mock_object_map(mock_image_ctx, CEPH_NOSNAP);
+ MockObjectMap *mock_object_map = new MockObjectMap(mock_image_ctx, CEPH_NOSNAP);
+ BOOST_SCOPE_EXIT(&mock_object_map) {
+ mock_object_map->put();
+ } BOOST_SCOPE_EXIT_END
+
C_SaferCond open_ctx;
- mock_object_map.open(&open_ctx);
+ mock_object_map->open(&open_ctx);
ASSERT_EQ(0, open_ctx.wait());
C_SaferCond update_ctx1;
C_SaferCond update_ctx4;
{
std::shared_lock image_locker{mock_image_ctx.image_lock};
- mock_object_map.aio_update(CEPH_NOSNAP, 1, 4, 1, {}, {}, false,
+ mock_object_map->aio_update(CEPH_NOSNAP, 1, 4, 1, {}, {}, false,
&update_ctx1);
- mock_object_map.aio_update(CEPH_NOSNAP, 1, 3, 1, {}, {}, false,
+ mock_object_map->aio_update(CEPH_NOSNAP, 1, 3, 1, {}, {}, false,
&update_ctx2);
- mock_object_map.aio_update(CEPH_NOSNAP, 2, 3, 1, {}, {}, false,
+ mock_object_map->aio_update(CEPH_NOSNAP, 2, 3, 1, {}, {}, false,
&update_ctx3);
- mock_object_map.aio_update(CEPH_NOSNAP, 0, 2, 1, {}, {}, false,
+ mock_object_map->aio_update(CEPH_NOSNAP, 0, 2, 1, {}, {}, false,
&update_ctx4);
}
ASSERT_EQ(0, update_ctx4.wait());
C_SaferCond close_ctx;
- mock_object_map.close(&close_ctx);
+ mock_object_map->close(&close_ctx);
ASSERT_EQ(0, close_ctx.wait());
}