From b91ab48ccc621431b5327d0806137152e8fbb092 Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Fri, 21 Mar 2025 14:43:50 +0100 Subject: [PATCH] librbd: respect rbd_default_snapshot_quiesce_mode in group_snap_create() Make group_snap_create() behave the same as snap_create() and mirror_image_create_snapshot(): APIs that don't take RBD_SNAP_CREATE_ flags explicitly should respect rbd_default_snapshot_quiesce_mode option. Fixes: https://tracker.ceph.com/issues/70632 Signed-off-by: Ilya Dryomov --- src/librbd/Utils.cc | 30 +++++++++++++++++++++--------- src/librbd/Utils.h | 1 + src/librbd/librbd.cc | 6 ++++-- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/librbd/Utils.cc b/src/librbd/Utils.cc index a6acbda10aae3..ec1471a928c1c 100644 --- a/src/librbd/Utils.cc +++ b/src/librbd/Utils.cc @@ -29,6 +29,18 @@ namespace { const std::string CONFIG_KEY_URI_PREFIX{"config://"}; +uint32_t quiesce_mode_to_snap_create_flags(const std::string& mode) { + if (mode == "required") { + return 0; + } else if (mode == "ignore-error") { + return RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR; + } else if (mode == "skip") { + return RBD_SNAP_CREATE_SKIP_QUIESCE; + } else { + ceph_abort_msg("invalid rbd_default_snapshot_quiesce_mode"); + } +} + } // anonymous namespace const std::string group_header_name(const std::string &group_id) @@ -181,15 +193,15 @@ uint32_t get_default_snap_create_flags(ImageCtx *ictx) { auto mode = ictx->config.get_val( "rbd_default_snapshot_quiesce_mode"); - if (mode == "required") { - return 0; - } else if (mode == "ignore-error") { - return RBD_SNAP_CREATE_IGNORE_QUIESCE_ERROR; - } else if (mode == "skip") { - return RBD_SNAP_CREATE_SKIP_QUIESCE; - } else { - ceph_abort_msg("invalid rbd_default_snapshot_quiesce_mode"); - } + return quiesce_mode_to_snap_create_flags(mode); +} + +uint32_t get_default_snap_create_flags(librados::IoCtx& group_ioctx) { + auto cct = reinterpret_cast(group_ioctx.cct()); + auto mode = cct->_conf.get_val( + "rbd_default_snapshot_quiesce_mode"); + + return quiesce_mode_to_snap_create_flags(mode); } SnapContext get_snap_context( diff --git a/src/librbd/Utils.h b/src/librbd/Utils.h index dee91feee5e61..b681552b93a70 100644 --- a/src/librbd/Utils.h +++ b/src/librbd/Utils.h @@ -268,6 +268,7 @@ int snap_create_flags_api_to_internal(CephContext *cct, uint32_t api_flags, uint64_t *internal_flags); uint32_t get_default_snap_create_flags(ImageCtx *ictx); +uint32_t get_default_snap_create_flags(librados::IoCtx& group_ioctx); SnapContext get_snap_context( const std::optional< diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index bb7ce9189587a..01ea33a5bd0bc 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -1425,8 +1425,9 @@ namespace librbd { tracepoint(librbd, group_snap_create_enter, group_ioctx.get_pool_name().c_str(), group_ioctx.get_id(), group_name, snap_name); + auto flags = librbd::util::get_default_snap_create_flags(group_ioctx); int r = librbd::api::Group<>::snap_create(group_ioctx, group_name, - snap_name, 0); + snap_name, flags); tracepoint(librbd, group_snap_create_exit, r); return r; } @@ -7304,8 +7305,9 @@ extern "C" int rbd_group_snap_create(rados_ioctx_t group_p, group_ioctx.get_pool_name().c_str(), group_ioctx.get_id(), group_name, snap_name); + auto flags = librbd::util::get_default_snap_create_flags(group_ioctx); int r = librbd::api::Group<>::snap_create(group_ioctx, group_name, - snap_name, 0); + snap_name, flags); tracepoint(librbd, group_snap_create_exit, r); return r; -- 2.39.5