}
}
- if (r == -ENOENT) {
- ldout(cct, 15) << "missing snapshot: snap_id=" << m_snap_id << dendl;
+ if (r == -ENOENT ||
+ std::holds_alternative<cls::rbd::TrashSnapshotNamespace>(
+ snap_namespace)) {
+ ldout(cct, 15) << "missing or trashed snapshot: snap_id=" << m_snap_id
+ << dendl;
m_image_ctx->image_lock.unlock_shared();
- finish(r);
+ finish(-ENOENT);
return;
}
ASSERT_EQ(-ENOENT, ctx.wait());
}
+TEST_F(TestMockMirrorSnapshotUnlinkPeerRequest, TrashedSnapshot) {
+ REQUIRE_FORMAT_V2();
+
+ librbd::ImageCtx *ictx;
+ ASSERT_EQ(0, open_image(m_image_name, &ictx));
+
+ MockTestImageCtx mock_image_ctx(*ictx);
+ cls::rbd::TrashSnapshotNamespace ns{
+ cls::rbd::SNAPSHOT_NAMESPACE_TYPE_MIRROR, "mirror_snap"};
+ auto snap_id = snap_create(mock_image_ctx, ns, "trash_snap");
+
+ expect_get_snap_info(mock_image_ctx, snap_id);
+
+ InSequence seq;
+
+ expect_is_refresh_required(mock_image_ctx, true);
+ expect_refresh_image(mock_image_ctx, 0);
+
+ C_SaferCond ctx;
+ auto req = new MockUnlinkPeerRequest(&mock_image_ctx, snap_id, "peer_uuid",
+ true, &ctx);
+ req->send();
+ ASSERT_EQ(-ENOENT, ctx.wait());
+}
+
TEST_F(TestMockMirrorSnapshotUnlinkPeerRequest, PeerDNE) {
REQUIRE_FORMAT_V2();