]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: respect rbd_default_snapshot_quiesce_mode in group_snap_create()
authorIlya Dryomov <idryomov@gmail.com>
Fri, 21 Mar 2025 13:43:50 +0000 (14:43 +0100)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 24 Mar 2025 15:53:10 +0000 (16:53 +0100)
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 <idryomov@gmail.com>
src/librbd/Utils.cc
src/librbd/Utils.h
src/librbd/librbd.cc

index a6acbda10aae34f5846d2b0bfd054c70fff2a335..ec1471a928c1cb7e9419b6521c1d1838aaa72f96 100644 (file)
@@ -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<std::string>(
       "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<CephContext*>(group_ioctx.cct());
+  auto mode = cct->_conf.get_val<std::string>(
+      "rbd_default_snapshot_quiesce_mode");
+
+  return quiesce_mode_to_snap_create_flags(mode);
 }
 
 SnapContext get_snap_context(
index dee91feee5e6102aa1e9be2365baa347d009ba24..b681552b93a7069b27b942cffe423fedd3289192 100644 (file)
@@ -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<
index bb7ce9189587a14390256cebc0af833674dcb24f..01ea33a5bd0bca16437dbe6f9dc9242e62a56d15 100644 (file)
@@ -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;