From: Mykola Golub Date: Fri, 5 Jun 2020 09:02:57 +0000 (+0100) Subject: librbd: API for mirror snapshot create to pass flags X-Git-Tag: v17.0.0~2047^2~9 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=e6643712b2c5563e351f013cd6645ce64ba14a9c;p=ceph.git librbd: API for mirror snapshot create to pass flags Signed-off-by: Mykola Golub --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 06c9b252f628b..50e2e990262cb 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -1204,6 +1204,9 @@ CEPH_RBD_API int rbd_mirror_image_demote(rbd_image_t image); CEPH_RBD_API int rbd_mirror_image_resync(rbd_image_t image); CEPH_RBD_API int rbd_mirror_image_create_snapshot(rbd_image_t image, uint64_t *snap_id); +CEPH_RBD_API int rbd_mirror_image_create_snapshot2(rbd_image_t image, + uint32_t flags, + uint64_t *snap_id); CEPH_RBD_API int rbd_mirror_image_get_info(rbd_image_t image, rbd_mirror_image_info_t *mirror_image_info, size_t info_size); diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index 6066bd33827af..987a76eb9da8f 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -752,6 +752,7 @@ public: int mirror_image_demote(); int mirror_image_resync(); int mirror_image_create_snapshot(uint64_t *snap_id); + int mirror_image_create_snapshot2(uint32_t flags, uint64_t *snap_id); int mirror_image_get_info(mirror_image_info_t *mirror_image_info, size_t info_size); int mirror_image_get_mode(mirror_image_mode_t *mode); diff --git a/src/librbd/Utils.cc b/src/librbd/Utils.cc index c9d7b0413ab77..4d3bde47acec6 100644 --- a/src/librbd/Utils.cc +++ b/src/librbd/Utils.cc @@ -11,6 +11,8 @@ #include "common/dout.h" #include "librbd/ImageCtx.h" #include "librbd/Features.h" + +#include #include #define dout_subsys ceph_subsys_rbd @@ -141,5 +143,26 @@ int create_ioctx(librados::IoCtx& src_io_ctx, const std::string& pool_desc, return 0; } +int snap_create_flags_api_to_internal(CephContext *cct, uint32_t api_flags, + uint64_t *internal_flags) { + *internal_flags = 0; + + if (api_flags & RBD_SNAP_CREATE_SKIP_QUIESCE) { + *internal_flags |= SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE; + api_flags &= ~RBD_SNAP_CREATE_SKIP_QUIESCE; + } else if (api_flags & RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR) { + *internal_flags |= SNAP_CREATE_FLAG_IGNORE_NOTIFY_QUIESCE_ERROR; + api_flags &= ~RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR; + } + + if (api_flags != 0) { + lderr(cct) << "invalid snap create flags: " + << std::bitset<32>(api_flags) << dendl; + return -EINVAL; + } + + return 0; +} + } // namespace util } // namespace librbd diff --git a/src/librbd/Utils.h b/src/librbd/Utils.h index c63504ac1a7d4..9e95e692f7051 100644 --- a/src/librbd/Utils.h +++ b/src/librbd/Utils.h @@ -260,6 +260,9 @@ int create_ioctx(librados::IoCtx& src_io_ctx, const std::string& pool_desc, const std::optional& pool_namespace, librados::IoCtx* dst_io_ctx); +int snap_create_flags_api_to_internal(CephContext *cct, uint32_t api_flags, + uint64_t *internal_flags); + } // namespace util } // namespace librbd diff --git a/src/librbd/api/Mirror.cc b/src/librbd/api/Mirror.cc index 2855ae3298895..b95bae8cc0618 100644 --- a/src/librbd/api/Mirror.cc +++ b/src/librbd/api/Mirror.cc @@ -1970,11 +1970,19 @@ int Mirror::image_info_list( } template -int Mirror::image_snapshot_create(I *ictx, uint64_t *snap_id) { +int Mirror::image_snapshot_create(I *ictx, uint32_t flags, + uint64_t *snap_id) { CephContext *cct = ictx->cct; ldout(cct, 20) << "ictx=" << ictx << dendl; - int r = ictx->state->refresh_if_required(); + uint64_t snap_create_flags = 0; + int r = util::snap_create_flags_api_to_internal(cct, flags, + &snap_create_flags); + if (r < 0) { + return r; + } + + r = ictx->state->refresh_if_required(); if (r < 0) { return r; } @@ -1997,7 +2005,8 @@ int Mirror::image_snapshot_create(I *ictx, uint64_t *snap_id) { C_SaferCond on_finish; auto req = mirror::snapshot::CreatePrimaryRequest::create( - ictx, mirror_image.global_image_id, CEPH_NOSNAP, 0U, snap_id, &on_finish); + ictx, mirror_image.global_image_id, CEPH_NOSNAP, snap_create_flags, 0U, + snap_id, &on_finish); req->send(); return on_finish.wait(); } diff --git a/src/librbd/api/Mirror.h b/src/librbd/api/Mirror.h index b0dae99bc4a1e..194ab818d7636 100644 --- a/src/librbd/api/Mirror.h +++ b/src/librbd/api/Mirror.h @@ -113,7 +113,8 @@ struct Mirror { Context *on_finish); static int image_get_instance_id(ImageCtxT *ictx, std::string *instance_id); - static int image_snapshot_create(ImageCtxT *ictx, uint64_t *snap_id); + static int image_snapshot_create(ImageCtxT *ictx, uint32_t flags, + uint64_t *snap_id); }; } // namespace api diff --git a/src/librbd/api/Snapshot.cc b/src/librbd/api/Snapshot.cc index 03f30ecba3799..88f22694cf28d 100644 --- a/src/librbd/api/Snapshot.cc +++ b/src/librbd/api/Snapshot.cc @@ -13,7 +13,6 @@ #include "include/Context.h" #include "common/Cond.h" -#include #include #define dout_subsys ceph_subsys_rbd @@ -318,19 +317,10 @@ int Snapshot::create(I *ictx, const char *snap_name, uint32_t flags, << " flags: " << flags << dendl; uint64_t internal_flags = 0; - - if (flags & RBD_SNAP_CREATE_SKIP_QUIESCE) { - internal_flags |= SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE; - flags &= ~RBD_SNAP_CREATE_SKIP_QUIESCE; - } else if (flags & RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR) { - internal_flags |= SNAP_CREATE_FLAG_IGNORE_NOTIFY_QUIESCE_ERROR; - flags &= ~RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR; - } - - if (flags != 0) { - lderr(ictx->cct) << "invalid snap create flags: " << std::bitset<32>(flags) - << dendl; - return -EINVAL; + int r = util::snap_create_flags_api_to_internal(ictx->cct, flags, + &internal_flags); + if (r < 0) { + return r; } return ictx->operations->snap_create(cls::rbd::UserSnapshotNamespace(), diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index d61a9335b90e2..8468a26dca92c 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -2846,7 +2846,13 @@ namespace librbd { int Image::mirror_image_create_snapshot(uint64_t *snap_id) { ImageCtx *ictx = (ImageCtx *)ctx; - return librbd::api::Mirror<>::image_snapshot_create(ictx, snap_id); + return librbd::api::Mirror<>::image_snapshot_create(ictx, 0, snap_id); + } + + int Image::mirror_image_create_snapshot2(uint32_t flags, uint64_t *snap_id) + { + ImageCtx *ictx = (ImageCtx *)ctx; + return librbd::api::Mirror<>::image_snapshot_create(ictx, flags, snap_id); } int Image::mirror_image_get_info(mirror_image_info_t *mirror_image_info, @@ -6329,7 +6335,15 @@ extern "C" int rbd_mirror_image_create_snapshot(rbd_image_t image, uint64_t *snap_id) { librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; - return librbd::api::Mirror<>::image_snapshot_create(ictx, snap_id); + return librbd::api::Mirror<>::image_snapshot_create(ictx, 0, snap_id); +} + +extern "C" int rbd_mirror_image_create_snapshot2(rbd_image_t image, + uint32_t flags, + uint64_t *snap_id) +{ + librbd::ImageCtx *ictx = (librbd::ImageCtx *)image; + return librbd::api::Mirror<>::image_snapshot_create(ictx, flags, snap_id); } extern "C" int rbd_mirror_image_get_info(rbd_image_t image, diff --git a/src/librbd/mirror/EnableRequest.cc b/src/librbd/mirror/EnableRequest.cc index cd276fdfe852a..13b69c02328d4 100644 --- a/src/librbd/mirror/EnableRequest.cc +++ b/src/librbd/mirror/EnableRequest.cc @@ -192,6 +192,7 @@ void EnableRequest::create_primary_snapshot() { auto req = snapshot::CreatePrimaryRequest::create( m_image_ctx, m_mirror_image.global_image_id, (m_image_clean ? 0 : CEPH_NOSNAP), + SNAP_CREATE_FLAG_IGNORE_NOTIFY_QUIESCE_ERROR, snapshot::CREATE_PRIMARY_FLAG_IGNORE_EMPTY_PEERS, &m_snap_id, ctx); req->send(); } diff --git a/src/librbd/mirror/snapshot/CreatePrimaryRequest.cc b/src/librbd/mirror/snapshot/CreatePrimaryRequest.cc index 0694ecc109034..36961d35e848e 100644 --- a/src/librbd/mirror/snapshot/CreatePrimaryRequest.cc +++ b/src/librbd/mirror/snapshot/CreatePrimaryRequest.cc @@ -28,11 +28,12 @@ using librbd::util::create_rados_callback; template CreatePrimaryRequest::CreatePrimaryRequest( I *image_ctx, const std::string& global_image_id, - uint64_t clean_since_snap_id, uint32_t flags, uint64_t *snap_id, - Context *on_finish) + uint64_t clean_since_snap_id, uint64_t snap_create_flags, uint32_t flags, + uint64_t *snap_id, Context *on_finish) : m_image_ctx(image_ctx), m_global_image_id(global_image_id), - m_clean_since_snap_id(clean_since_snap_id), m_flags(flags), - m_snap_id(snap_id), m_on_finish(on_finish) { + m_clean_since_snap_id(clean_since_snap_id), + m_snap_create_flags(snap_create_flags), m_flags(flags), m_snap_id(snap_id), + m_on_finish(on_finish) { m_default_ns_ctx.dup(m_image_ctx->md_ctx); m_default_ns_ctx.set_namespace(""); } @@ -121,7 +122,8 @@ void CreatePrimaryRequest::create_snapshot() { auto ctx = create_context_callback< CreatePrimaryRequest, &CreatePrimaryRequest::handle_create_snapshot>(this); - m_image_ctx->operations->snap_create(ns, m_snap_name, 0, m_prog_ctx, ctx); + m_image_ctx->operations->snap_create(ns, m_snap_name, m_snap_create_flags, + m_prog_ctx, ctx); } template diff --git a/src/librbd/mirror/snapshot/CreatePrimaryRequest.h b/src/librbd/mirror/snapshot/CreatePrimaryRequest.h index b7869e5ef000e..b8e84cf2b74b2 100644 --- a/src/librbd/mirror/snapshot/CreatePrimaryRequest.h +++ b/src/librbd/mirror/snapshot/CreatePrimaryRequest.h @@ -28,17 +28,18 @@ public: static CreatePrimaryRequest *create(ImageCtxT *image_ctx, const std::string& global_image_id, uint64_t clean_since_snap_id, + uint64_t snap_create_flags, uint32_t flags, uint64_t *snap_id, Context *on_finish) { return new CreatePrimaryRequest(image_ctx, global_image_id, - clean_since_snap_id, flags, snap_id, - on_finish); + clean_since_snap_id, snap_create_flags, flags, + snap_id, on_finish); } CreatePrimaryRequest(ImageCtxT *image_ctx, const std::string& global_image_id, - uint64_t clean_since_snap_id, uint32_t flags, - uint64_t *snap_id, Context *on_finish); + uint64_t clean_since_snap_id, uint64_t snap_create_flags, + uint32_t flags, uint64_t *snap_id, Context *on_finish); void send(); @@ -69,6 +70,7 @@ private: ImageCtxT *m_image_ctx; std::string m_global_image_id; uint64_t m_clean_since_snap_id; + const uint64_t m_snap_create_flags; const uint32_t m_flags; uint64_t *m_snap_id; Context *m_on_finish; diff --git a/src/librbd/mirror/snapshot/DemoteRequest.cc b/src/librbd/mirror/snapshot/DemoteRequest.cc index 17d157d41e17e..f9c14ea8a2b36 100644 --- a/src/librbd/mirror/snapshot/DemoteRequest.cc +++ b/src/librbd/mirror/snapshot/DemoteRequest.cc @@ -73,6 +73,7 @@ void DemoteRequest::create_snapshot() { auto req = CreatePrimaryRequest::create( m_image_ctx, m_global_image_id, CEPH_NOSNAP, + SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE, (snapshot::CREATE_PRIMARY_FLAG_IGNORE_EMPTY_PEERS | snapshot::CREATE_PRIMARY_FLAG_DEMOTED), nullptr, ctx); req->send(); diff --git a/src/librbd/mirror/snapshot/PromoteRequest.cc b/src/librbd/mirror/snapshot/PromoteRequest.cc index f9cf4b5b973dd..8218601064283 100644 --- a/src/librbd/mirror/snapshot/PromoteRequest.cc +++ b/src/librbd/mirror/snapshot/PromoteRequest.cc @@ -296,6 +296,7 @@ void PromoteRequest::create_promote_snapshot() { auto req = CreatePrimaryRequest::create( m_image_ctx, m_global_image_id, CEPH_NOSNAP, + SNAP_CREATE_FLAG_SKIP_NOTIFY_QUIESCE, (snapshot::CREATE_PRIMARY_FLAG_IGNORE_EMPTY_PEERS | snapshot::CREATE_PRIMARY_FLAG_FORCE), nullptr, ctx); req->send(); diff --git a/src/test/librbd/mirror/snapshot/test_mock_CreatePrimaryRequest.cc b/src/test/librbd/mirror/snapshot/test_mock_CreatePrimaryRequest.cc index 8006c35956e22..3babd19d23288 100644 --- a/src/test/librbd/mirror/snapshot/test_mock_CreatePrimaryRequest.cc +++ b/src/test/librbd/mirror/snapshot/test_mock_CreatePrimaryRequest.cc @@ -213,7 +213,7 @@ TEST_F(TestMockMirrorSnapshotCreatePrimaryRequest, Success) { C_SaferCond ctx; auto req = new MockCreatePrimaryRequest(&mock_image_ctx, "gid", CEPH_NOSNAP, - 0U, nullptr, &ctx); + 0U, 0U, nullptr, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } @@ -234,7 +234,7 @@ TEST_F(TestMockMirrorSnapshotCreatePrimaryRequest, CanNotError) { C_SaferCond ctx; auto req = new MockCreatePrimaryRequest(&mock_image_ctx, "gid", CEPH_NOSNAP, - 0U, nullptr, &ctx); + 0U, 0U, nullptr, &ctx); req->send(); ASSERT_EQ(-EINVAL, ctx.wait()); } @@ -258,7 +258,7 @@ TEST_F(TestMockMirrorSnapshotCreatePrimaryRequest, GetMirrorPeersError) { C_SaferCond ctx; auto req = new MockCreatePrimaryRequest(&mock_image_ctx, "gid", CEPH_NOSNAP, - 0U, nullptr, &ctx); + 0U, 0U, nullptr, &ctx); req->send(); ASSERT_EQ(-EINVAL, ctx.wait()); } @@ -283,7 +283,7 @@ TEST_F(TestMockMirrorSnapshotCreatePrimaryRequest, CreateSnapshotError) { C_SaferCond ctx; auto req = new MockCreatePrimaryRequest(&mock_image_ctx, "gid", CEPH_NOSNAP, - 0U, nullptr, &ctx); + 0U, 0U, nullptr, &ctx); req->send(); ASSERT_EQ(-EINVAL, ctx.wait()); } @@ -318,7 +318,7 @@ TEST_F(TestMockMirrorSnapshotCreatePrimaryRequest, SuccessUnlinkPeer) { 0); C_SaferCond ctx; auto req = new MockCreatePrimaryRequest(&mock_image_ctx, "gid", CEPH_NOSNAP, - 0U, nullptr, &ctx); + 0U, 0U, nullptr, &ctx); req->send(); ASSERT_EQ(0, ctx.wait()); } diff --git a/src/test/librbd/mirror/snapshot/test_mock_PromoteRequest.cc b/src/test/librbd/mirror/snapshot/test_mock_PromoteRequest.cc index 0965ab4644bed..af9c349339b46 100644 --- a/src/test/librbd/mirror/snapshot/test_mock_PromoteRequest.cc +++ b/src/test/librbd/mirror/snapshot/test_mock_PromoteRequest.cc @@ -123,6 +123,7 @@ struct CreatePrimaryRequest { static CreatePrimaryRequest *create(MockTestImageCtx *image_ctx, const std::string& global_image_id, uint64_t clean_since_snap_id, + uint64_t snap_create_flags, uint32_t flags, uint64_t *snap_id, Context *on_finish) { ceph_assert(s_instance != nullptr); diff --git a/src/test/rbd_mirror/test_ImageReplayer.cc b/src/test/rbd_mirror/test_ImageReplayer.cc index 592044c920b1d..ce94e5a6d140e 100644 --- a/src/test/rbd_mirror/test_ImageReplayer.cc +++ b/src/test/rbd_mirror/test_ImageReplayer.cc @@ -536,7 +536,7 @@ public: } else { uint64_t snap_id = CEPH_NOSNAP; ASSERT_EQ(0, librbd::api::Mirror<>::image_snapshot_create( - ictx, &snap_id)); + ictx, 0, &snap_id)); } printf("flushed\n");