const Extents&));
static CopyupRequest* s_instance;
- static CopyupRequest* create(librbd::MockImageCtx *ictx,
- uint64_t objectno, Extents &&image_extents,
- const ZTracer::Trace &parent_trace) {
+ static CopyupRequest* create(librbd::MockImageCtx* ictx, uint64_t objectno,
+ Extents&& image_extents, ImageArea area,
+ const ZTracer::Trace& parent_trace) {
return s_instance;
}
namespace util {
-template <> uint64_t get_file_offset(
- MockImageCtx *image_ctx, uint64_t object_no, uint64_t offset) {
- return Striper::get_file_offset(image_ctx->cct, &image_ctx->layout,
- object_no, offset);
-}
-
namespace {
struct Mock {
namespace librbd {
namespace crypto {
+template <>
+uint64_t get_file_offset(MockImageCtx *image_ctx, uint64_t object_no,
+ uint64_t offset) {
+ return Striper::get_file_offset(image_ctx->cct, &image_ctx->layout,
+ object_no, offset);
+}
+
using ::testing::_;
using ::testing::ElementsAre;
using ::testing::Invoke;
typedef io::CopyupRequest<librbd::MockImageCtx> MockCopyupRequest;
typedef io::util::Mock MockUtils;
- MockCryptoInterface* crypto;
+ MockCryptoInterface crypto;
MockImageCtx* mock_image_ctx;
MockCryptoObjectDispatch* mock_crypto_object_dispatch;
librbd::ImageCtx *ictx;
ASSERT_EQ(0, open_image(m_image_name, &ictx));
- crypto = new MockCryptoInterface();
mock_image_ctx = new MockImageCtx(*ictx);
mock_crypto_object_dispatch = new MockCryptoObjectDispatch(
- mock_image_ctx, crypto);
+ mock_image_ctx, &crypto);
data.append(std::string(4096, '1'));
}
mock_image_ctx->layout.object_size));
}
- void expect_remap_extents(uint64_t offset, uint64_t length) {
- EXPECT_CALL(*mock_image_ctx->io_image_dispatcher, remap_extents(
- ElementsAre(Pair(offset, length)),
- io::IMAGE_EXTENTS_MAP_TYPE_PHYSICAL_TO_LOGICAL));
+ void expect_remap_to_logical(uint64_t offset, uint64_t length) {
+ EXPECT_CALL(*mock_image_ctx->io_image_dispatcher, remap_to_logical(
+ ElementsAre(Pair(offset, length))));
}
void expect_get_parent_overlap(uint64_t overlap) {
}
void expect_prune_parent_extents(uint64_t object_overlap) {
- EXPECT_CALL(*mock_image_ctx, prune_parent_extents(_, _))
+ EXPECT_CALL(*mock_image_ctx, prune_parent_extents(_, _, _, _))
.WillOnce(Return(object_overlap));
}
}
void expect_encrypt(int count = 1) {
- EXPECT_CALL(*crypto, encrypt(_, _)).Times(count);
+ EXPECT_CALL(crypto, encrypt(_, _)).Times(count);
}
void expect_decrypt(int count = 1) {
- EXPECT_CALL(*crypto, decrypt(_, _)).Times(count);
+ EXPECT_CALL(crypto, decrypt(_, _)).Times(count);
}
};
TEST_F(TestMockCryptoCryptoObjectDispatch, Discard) {
expect_object_write_same();
ASSERT_TRUE(mock_crypto_object_dispatch->discard(
- 0, 0, 4096, mock_image_ctx->get_data_io_context(), 0, {},
+ 11, 0, 4096, mock_image_ctx->get_data_io_context(), 0, {},
&object_dispatch_flags, nullptr, &dispatch_result, &on_finish,
on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
io::ReadExtents extents = {{0, 4096}};
expect_object_read(&extents);
ASSERT_TRUE(mock_crypto_object_dispatch->read(
- 0, &extents, mock_image_ctx->get_data_io_context(), 0, 0, {},
+ 11, &extents, mock_image_ctx->get_data_io_context(), 0, 0, {},
nullptr, &object_dispatch_flags, &dispatch_result,
&on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
extents[1].bl.append(std::string(4096, '0'));
expect_object_read(&extents);
ASSERT_TRUE(mock_crypto_object_dispatch->read(
- 0, &extents, mock_image_ctx->get_data_io_context(), 0, 0, {},
+ 11, &extents, mock_image_ctx->get_data_io_context(), 0, 0, {},
nullptr, &object_dispatch_flags, &dispatch_result,
&on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
TEST_F(TestMockCryptoCryptoObjectDispatch, ReadFromParent) {
io::ReadExtents extents = {{0, 4096}, {8192, 4096}};
expect_object_read(&extents);
- expect_read_parent(mock_utils, 0, &extents, CEPH_NOSNAP, 8192);
+ expect_read_parent(mock_utils, 11, &extents, CEPH_NOSNAP, 8192);
ASSERT_TRUE(mock_crypto_object_dispatch->read(
- 0, &extents, mock_image_ctx->get_data_io_context(), 0, 0, {},
+ 11, &extents, mock_image_ctx->get_data_io_context(), 0, 0, {},
nullptr, &object_dispatch_flags, &dispatch_result,
&on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
io::ReadExtents extents = {{0, 4096}, {8192, 4096}};
expect_object_read(&extents);
ASSERT_TRUE(mock_crypto_object_dispatch->read(
- 0, &extents, mock_image_ctx->get_data_io_context(), 0,
+ 11, &extents, mock_image_ctx->get_data_io_context(), 0,
io::READ_FLAG_DISABLE_READ_FROM_PARENT, {},
nullptr, &object_dispatch_flags, &dispatch_result,
&on_finish, on_dispatched));
expect_object_read(&aligned_extents);
ASSERT_TRUE(mock_crypto_object_dispatch->read(
- 0, &extents, mock_image_ctx->get_data_io_context(), 0, 0, {},
+ 11, &extents, mock_image_ctx->get_data_io_context(), 0, 0, {},
nullptr, &object_dispatch_flags, &dispatch_result,
&on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
TEST_F(TestMockCryptoCryptoObjectDispatch, AlignedWrite) {
expect_encrypt();
ASSERT_TRUE(mock_crypto_object_dispatch->write(
- 0, 0, std::move(data), mock_image_ctx->get_data_io_context(), 0, 0,
+ 11, 0, std::move(data), mock_image_ctx->get_data_io_context(), 0, 0,
std::nullopt, {}, nullptr, nullptr, &dispatch_result, &on_finish,
on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_CONTINUE);
extents[1].bl.append(std::string(4096, '3'));
expect_object_read(&extents, version);
ASSERT_TRUE(mock_crypto_object_dispatch->write(
- 0, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
+ 11, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
0, 0, std::nullopt, {}, nullptr, nullptr, &dispatch_result,
&on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
io::ReadExtents extents = {{0, 4096}, {8192, 4096}};
expect_object_read(&extents);
ASSERT_TRUE(mock_crypto_object_dispatch->write(
- 0, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
+ 11, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
0, 0, std::nullopt, {}, nullptr, nullptr, &dispatch_result,
&on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
io::ReadExtents extents = {{0, 4096}, {8192, 4096}};
expect_object_read(&extents);
ASSERT_TRUE(mock_crypto_object_dispatch->write(
- 0, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
+ 11, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
0, 0, std::nullopt, {}, nullptr, nullptr, &dispatch_result,
&on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
io::ReadExtents extents = {{0, 4096}, {8192, 4096}};
expect_object_read(&extents);
ASSERT_TRUE(mock_crypto_object_dispatch->write(
- 0, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
+ 11, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
0, 0, std::nullopt, {}, nullptr, nullptr, &dispatch_result,
&on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
ASSERT_EQ(on_finish, &finished_cond);
expect_get_object_size();
- expect_get_parent_overlap(mock_image_ctx->layout.object_size);
- expect_remap_extents(0, mock_image_ctx->layout.object_size);
+ expect_get_parent_overlap(100 << 20);
+ expect_remap_to_logical(11 * mock_image_ctx->layout.object_size,
+ mock_image_ctx->layout.object_size);
expect_prune_parent_extents(mock_image_ctx->layout.object_size);
EXPECT_CALL(mock_exclusive_lock, is_lock_owner()).WillRepeatedly(
Return(true));
- EXPECT_CALL(*mock_image_ctx->object_map, object_may_exist(0)).WillOnce(
+ EXPECT_CALL(*mock_image_ctx->object_map, object_may_exist(11)).WillOnce(
Return(false));
MockAbstractObjectWriteRequest *write_request = nullptr;
expect_copyup(&write_request, 0);
io::ReadExtents extents = {{0, 4096}, {8192, 4096}};
expect_object_read(&extents);
ASSERT_TRUE(mock_crypto_object_dispatch->write(
- 0, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
+ 11, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
0, 0, std::nullopt, {}, nullptr, nullptr, &dispatch_result,
&on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
ASSERT_EQ(on_finish, &finished_cond);
expect_get_object_size();
- expect_get_parent_overlap(mock_image_ctx->layout.object_size);
- expect_remap_extents(0, mock_image_ctx->layout.object_size);
+ expect_get_parent_overlap(100 << 20);
+ expect_remap_to_logical(11 * mock_image_ctx->layout.object_size,
+ mock_image_ctx->layout.object_size);
expect_prune_parent_extents(mock_image_ctx->layout.object_size);
EXPECT_CALL(mock_exclusive_lock, is_lock_owner()).WillRepeatedly(
Return(true));
- EXPECT_CALL(*mock_image_ctx->object_map, object_may_exist(0)).WillOnce(
+ EXPECT_CALL(*mock_image_ctx->object_map, object_may_exist(11)).WillOnce(
Return(false));
MockAbstractObjectWriteRequest *write_request = nullptr;
expect_copyup(&write_request, 0);
extents[1].bl.append(std::string(4096, '3'));
expect_object_read(&extents, version);
ASSERT_TRUE(mock_crypto_object_dispatch->write(
- 0, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
+ 11, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
0, 0, std::nullopt, {}, nullptr, nullptr, &dispatch_result,
&on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
extents[1].bl.append(std::string(4096, '3'));
expect_object_read(&extents, version);
ASSERT_TRUE(mock_crypto_object_dispatch->write(
- 0, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
+ 11, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
0, 0, std::make_optional(assert_version), {}, nullptr, nullptr,
&dispatch_result, &on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
extents[1].bl.append(std::string(4096, '3'));
expect_object_read(&extents);
ASSERT_TRUE(mock_crypto_object_dispatch->write(
- 0, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
+ 11, 1, std::move(write_data), mock_image_ctx->get_data_io_context(),
0, io::OBJECT_WRITE_FLAG_CREATE_EXCLUSIVE, std::nullopt, {}, nullptr,
nullptr, &dispatch_result, &on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
expect_object_read(&extents, version);
ASSERT_TRUE(mock_crypto_object_dispatch->compare_and_write(
- 0, 1, std::move(cmp_data), std::move(write_data),
+ 11, 1, std::move(cmp_data), std::move(write_data),
mock_image_ctx->get_data_io_context(), 0, {}, nullptr, nullptr,
nullptr, &dispatch_result, &on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
uint64_t mismatch_offset;
ASSERT_TRUE(mock_crypto_object_dispatch->compare_and_write(
- 0, 1, std::move(cmp_data), std::move(write_data),
+ 11, 1, std::move(cmp_data), std::move(write_data),
mock_image_ctx->get_data_io_context(), 0, {}, &mismatch_offset,
nullptr, nullptr, &dispatch_result, &on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
write_data.append(std::string("12"));
expect_object_write(0, std::string("12121") , 0, std::nullopt);
ASSERT_TRUE(mock_crypto_object_dispatch->write_same(
- 0, 0, 5, {{0, 5}}, std::move(write_data),
+ 11, 0, 5, {{0, 5}}, std::move(write_data),
mock_image_ctx->get_data_io_context(), 0, {}, nullptr, nullptr,
&dispatch_result, &on_finish, on_dispatched));
ASSERT_EQ(dispatch_result, io::DISPATCH_RESULT_COMPLETE);
expect_get_object_size();
expect_encrypt(6);
InSequence seq;
- expect_remap_extents(0, 4096);
- expect_remap_extents(4096, 4096);
- expect_remap_extents(8192, 4096);
- expect_remap_extents(0, 4096);
- expect_remap_extents(4096, 8192);
- expect_remap_extents(16384, 4096);
+ uint64_t base = 11 * mock_image_ctx->layout.object_size;
+ expect_remap_to_logical(base, 4096);
+ expect_remap_to_logical(base + 4096, 4096);
+ expect_remap_to_logical(base + 8192, 4096);
+ expect_remap_to_logical(base, 4096);
+ expect_remap_to_logical(base + 4096, 8192);
+ expect_remap_to_logical(base + 16384, 4096);
ASSERT_EQ(0, mock_crypto_object_dispatch->prepare_copyup(
- 0, &snapshot_sparse_bufferlist));
+ 11, &snapshot_sparse_bufferlist));
ASSERT_EQ(2, snapshot_sparse_bufferlist.size());
ASSERT_EQ(++it, snap2_result.end());
}
-} // namespace io
+} // namespace crypto
} // namespace librbd