librbd::ImageCtx *m_local_image_ctx;
};
-TEST_F(TestMockImageDeleterSnapshotPurgeRequest, Success) {
+TEST_F(TestMockImageDeleterSnapshotPurgeRequest, SuccessJournal) {
{
std::unique_lock image_locker{m_local_image_ctx->image_lock};
m_local_image_ctx->add_snap(cls::rbd::UserSnapshotNamespace{}, "snap1", 1,
ASSERT_EQ(0, ctx.wait());
}
+TEST_F(TestMockImageDeleterSnapshotPurgeRequest, SuccessSnapshot) {
+ {
+ std::unique_lock image_locker{m_local_image_ctx->image_lock};
+ m_local_image_ctx->add_snap(cls::rbd::UserSnapshotNamespace{}, "snap1", 1,
+ 0, {}, RBD_PROTECTION_STATUS_PROTECTED, 0, {});
+ m_local_image_ctx->add_snap(cls::rbd::UserSnapshotNamespace{}, "snap2", 2,
+ 0, {}, RBD_PROTECTION_STATUS_UNPROTECTED, 0,
+ {});
+ }
+
+ librbd::MockTestImageCtx mock_image_ctx(*m_local_image_ctx);
+
+ InSequence seq;
+ expect_set_journal_policy(mock_image_ctx);
+ expect_open(mock_image_ctx, 0);
+
+ expect_get_snap_namespace(mock_image_ctx, 2,
+ cls::rbd::UserSnapshotNamespace{}, 0);
+ expect_get_snap_name(mock_image_ctx, 2, "snap2", 0);
+ expect_is_snap_protected(mock_image_ctx, 2, false, 0);
+ expect_snap_remove(mock_image_ctx, cls::rbd::UserSnapshotNamespace{}, "snap2",
+ 0);
+
+ expect_get_snap_namespace(mock_image_ctx, 1,
+ cls::rbd::UserSnapshotNamespace{}, 0);
+ expect_get_snap_name(mock_image_ctx, 1, "snap1", 0);
+ expect_is_snap_protected(mock_image_ctx, 1, true, 0);
+ expect_snap_unprotect(mock_image_ctx, cls::rbd::UserSnapshotNamespace{},
+ "snap1", 0);
+ expect_snap_remove(mock_image_ctx, cls::rbd::UserSnapshotNamespace{}, "snap1",
+ 0);
+
+ expect_close(mock_image_ctx, 0);
+ expect_destroy(mock_image_ctx);
+
+ C_SaferCond ctx;
+ auto req = MockSnapshotPurgeRequest::create(m_local_io_ctx, mock_image_ctx.id,
+ &ctx);
+ req->send();
+ ASSERT_EQ(0, ctx.wait());
+}
+
TEST_F(TestMockImageDeleterSnapshotPurgeRequest, OpenError) {
{
std::unique_lock image_locker{m_local_image_ctx->image_lock};
if (m_image_ctx->exclusive_lock == nullptr) {
m_image_ctx->owner_lock.unlock_shared();
- derr << "exclusive lock not enabled" << dendl;
- m_ret_val = -EINVAL;
- close_image();
+ start_snap_unprotect();
return;
}
return;
}
+ start_snap_unprotect();
+}
+
+template <typename I>
+void SnapshotPurgeRequest<I>::start_snap_unprotect() {
+ dout(10) << dendl;
+
{
std::shared_lock image_locker{m_image_ctx->image_lock};
m_snaps = m_image_ctx->snaps;
template <typename I>
Context *SnapshotPurgeRequest<I>::start_lock_op(int* r) {
std::shared_lock owner_locker{m_image_ctx->owner_lock};
+ if (m_image_ctx->exclusive_lock == nullptr) {
+ return new LambdaContext([](int r) {});
+ }
return m_image_ctx->exclusive_lock->start_op(r);
}