]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: introduce a new api of snap_remove2
authorDongsheng Yang <dongsheng.yang@easystack.cn>
Thu, 30 Jun 2016 07:59:25 +0000 (03:59 -0400)
committerDongsheng Yang <dongsheng.yang@easystack.cn>
Tue, 26 Jul 2016 06:23:30 +0000 (02:23 -0400)
currently, we only have one api for snap_remove, but if we want to
pass more options about snapshot removal, that's impossible.

This patch introduce a new api of snap_remove2 here to solve
this problem.

Signed-off-by: Dongsheng Yang <dongsheng.yang@easystack.cn>
src/include/rbd/librbd.h
src/include/rbd/librbd.hpp
src/librbd/internal.cc
src/librbd/internal.h
src/librbd/librbd.cc
src/tracing/librbd.tp

index e0fc9ded74de7fb29ebc787345985a8540c22275..2a9a84d2b333b3c066602d8f5c83ecb92fb745b3 100644 (file)
@@ -72,6 +72,8 @@ typedef struct {
 #define RBD_MAX_IMAGE_NAME_SIZE 96
 #define RBD_MAX_BLOCK_NAME_SIZE 24
 
+#define RBD_SNAP_REMOVE_UNPROTECT      1 << 0
+
 /**
  * These types used to in set_image_notification to indicate the type of event
  * socket passed in.
index 70fecc2614b04b191e7289996135e1a537dd33b2..ea7a715eeca1363f21b6be3eba9780f3dc09f2de 100644 (file)
@@ -257,6 +257,7 @@ public:
   int snap_exists2(const char *snapname, bool *exists);
   int snap_create(const char *snapname);
   int snap_remove(const char *snapname);
+  int snap_remove2(const char *snapname, uint32_t flags);
   int snap_rollback(const char *snap_name);
   int snap_rollback_with_progress(const char *snap_name, ProgressContext& pctx);
   int snap_protect(const char *snap_name);
index 05a42713cb465dad6809d78da5720452d65a3d78..4d64dde6ab6f2395ceea22ca01c93249e9d45e11 100644 (file)
@@ -2264,6 +2264,32 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     return 0;
   }
 
+  int snap_remove(ImageCtx *ictx, const char *snap_name, uint32_t flags)
+  {
+    ldout(ictx->cct, 20) << "snap_remove " << ictx << " " << snap_name << " flags: " << flags << dendl;
+
+    int r = 0;
+
+retry:
+    r = ictx->state->refresh_if_required();
+    if (r < 0)
+      return r;
+
+    C_SaferCond ctx;
+    ictx->operations->snap_remove(snap_name, &ctx);
+
+    r = ctx.wait();
+    if (r < 0) {
+      if (r == -EBUSY && (flags & RBD_SNAP_REMOVE_UNPROTECT)) {
+       r = ictx->operations->snap_unprotect(snap_name);
+       goto retry;
+      }
+      return r;
+    }
+
+    return r;
+  }
+
   int snap_get_limit(ImageCtx *ictx, uint64_t *limit)
   {
     return cls_client::snapshot_get_limit(&ictx->md_ctx, ictx->header_oid,
index 4d7771cb35fb06f9e99fa7552b093517bee335be..d8ae5e44af53d4a43055901d4ea5c2836562229d 100644 (file)
@@ -142,6 +142,7 @@ namespace librbd {
   int snap_exists(ImageCtx *ictx, const char *snap_name, bool *exists);
   int snap_get_limit(ImageCtx *ictx, uint64_t *limit);
   int snap_set_limit(ImageCtx *ictx, uint64_t limit);
+  int snap_remove(ImageCtx *ictx, const char *snap_name, uint32_t flags);
   int snap_is_protected(ImageCtx *ictx, const char *snap_name,
                        bool *is_protected);
   int copy(ImageCtx *ictx, IoCtx& dest_md_ctx, const char *destname,
index eca3134e673b472e9369cf18dd553754d09b8bde..9d559a1ea06f40ad7492e58af06d59dff849e397 100644 (file)
@@ -936,7 +936,16 @@ namespace librbd {
   {
     ImageCtx *ictx = (ImageCtx *)ctx;
     tracepoint(librbd, snap_remove_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, snap_name);
-    int r = ictx->operations->snap_remove(snap_name);
+    int r = librbd::snap_remove(ictx, snap_name, 0);
+    tracepoint(librbd, snap_remove_exit, r);
+    return r;
+  }
+
+  int Image::snap_remove2(const char *snap_name, uint32_t flags)
+  {
+    ImageCtx *ictx = (ImageCtx *)ctx;
+    tracepoint(librbd, snap_remove2_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, snap_name, flags);
+    int r = librbd::snap_remove(ictx, snap_name, flags);
     tracepoint(librbd, snap_remove_exit, r);
     return r;
   }
@@ -2217,6 +2226,15 @@ extern "C" int rbd_snap_remove(rbd_image_t image, const char *snap_name)
   return r;
 }
 
+extern "C" int rbd_snap_remove2(rbd_image_t image, const char *snap_name, uint32_t flags)
+{
+  librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
+  tracepoint(librbd, snap_remove2_enter, ictx, ictx->name.c_str(), ictx->snap_name.c_str(), ictx->read_only, snap_name, flags);
+  int r = librbd::snap_remove(ictx, snap_name, flags);
+  tracepoint(librbd, snap_remove_exit, r);
+  return r;
+}
+
 extern "C" int rbd_snap_rollback(rbd_image_t image, const char *snap_name)
 {
   librbd::ImageCtx *ictx = (librbd::ImageCtx *)image;
index 2652ae9fed618c513ae887df74de2893fb1de409..45330a3d2ee78a081595c2042d4458963f64fbea 100644 (file)
@@ -1089,6 +1089,32 @@ TRACEPOINT_EVENT(librbd, snap_remove_exit,
     )
 )
 
+TRACEPOINT_EVENT(librbd, snap_remove2_enter,
+    TP_ARGS(
+        void*, imagectx,
+        const char*, name,
+        const char*, snap_name,
+        char, read_only,
+        const char*, remove_snap_name,
+       uint32_t, flags),
+    TP_FIELDS(
+        ctf_integer_hex(void*, imagectx, imagectx)
+        ctf_string(name, name)
+        ctf_string(snap_name, snap_name)
+        ctf_integer(char, read_only, read_only)
+        ctf_string(remove_snap_name, remove_snap_name)
+       ctf_integer(uint32_t, flags, flags)
+    )
+)
+
+TRACEPOINT_EVENT(librbd, snap_remove2_exit,
+    TP_ARGS(
+        int, retval),
+    TP_FIELDS(
+        ctf_integer(int, retval, retval)
+    )
+)
+
 TRACEPOINT_EVENT(librbd, snap_rollback_enter,
     TP_ARGS(
         void*, imagectx,