From: Ilya Dryomov Date: Fri, 21 Mar 2025 13:43:50 +0000 (+0100) Subject: librbd: respect rbd_default_snapshot_quiesce_mode in group_snap_create() X-Git-Tag: testing/wip-vshankar-testing-20250325.080107-debug~5^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=b91ab48ccc621431b5327d0806137152e8fbb092;p=ceph-ci.git 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 --- diff --git a/src/librbd/Utils.cc b/src/librbd/Utils.cc index a6acbda10aa..ec1471a928c 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 dee91feee5e..b681552b93a 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 bb7ce918958..01ea33a5bd0 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;