]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd: introduce no-progress for rbd snap remove.
authorDongsheng Yang <dongsheng.yang@easystack.cn>
Mon, 11 Jul 2016 14:41:26 +0000 (10:41 -0400)
committerDongsheng Yang <dongsheng.yang@easystack.cn>
Tue, 26 Jul 2016 11:37:15 +0000 (07:37 -0400)
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/pybind/rbd/rbd.pyx
src/test/cli-integration/rbd/formatted-output.t
src/test/cli/rbd/help.t
src/tools/rbd/action/Snap.cc

index 656703bc92fa04113fda52cc60d31e0ec012efc1..1f09c8fd3306faece03b0dd199f0345804e32e59 100644 (file)
@@ -330,6 +330,8 @@ CEPH_RBD_API int rbd_snap_list(rbd_image_t image, rbd_snap_info_t *snaps,
 CEPH_RBD_API void rbd_snap_list_end(rbd_snap_info_t *snaps);
 CEPH_RBD_API int rbd_snap_create(rbd_image_t image, const char *snapname);
 CEPH_RBD_API int rbd_snap_remove(rbd_image_t image, const char *snapname);
+CEPH_RBD_API int rbd_snap_remove2(rbd_image_t image, const char *snap_name, uint32_t flags,
+                                 librbd_progress_fn_t cb, void *cbdata);
 CEPH_RBD_API int rbd_snap_rollback(rbd_image_t image, const char *snapname);
 CEPH_RBD_API int rbd_snap_rollback_with_progress(rbd_image_t image,
                                                  const char *snapname,
index ea7a715eeca1363f21b6be3eba9780f3dc09f2de..57ccb98747de7bee46dd87b030ca4faf1926bf92 100644 (file)
@@ -257,7 +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_remove2(const char *snapname, uint32_t flags, ProgressContext& pctx);
   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 5603803e4bf4f5e9eab0f67c89343787535768da..be2423559269abccd079eb8b7a5ca4719c56dc77 100644 (file)
@@ -865,7 +865,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     return 0;
   }
 
-  int flatten_children(ImageCtx *ictx, const char* snap_name)
+  int flatten_children(ImageCtx *ictx, const char* snap_name, ProgressContext& pctx)
   {
     CephContext *cct = ictx->cct;
     ldout(cct, 20) << "children flatten " << ictx->name << dendl;
@@ -880,6 +880,11 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       return r;
     }
 
+    size_t size = image_info.size();
+    if (size == 0)
+      return 0;
+
+    size_t i = 0;
     Rados rados(ictx->md_ctx);
     for ( auto &info : image_info){
       string pool = info.first.second;
@@ -923,6 +928,8 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
        }
        imctx->state->close();
       }
+      pctx.update_progress(++i, size);
+      assert(i <= size);
     }
     
     return 0;
@@ -2327,7 +2334,7 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     return 0;
   }
 
-  int snap_remove(ImageCtx *ictx, const char *snap_name, uint32_t flags)
+  int snap_remove(ImageCtx *ictx, const char *snap_name, uint32_t flags, ProgressContext& pctx)
   {
     ldout(ictx->cct, 20) << "snap_remove " << ictx << " " << snap_name << " flags: " << flags << dendl;
 
@@ -2338,16 +2345,33 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       return r;
 
     if (flags & RBD_SNAP_REMOVE_FLATTEN) {
-       r = flatten_children(ictx, snap_name);
+       r = flatten_children(ictx, snap_name, pctx);
        if (r < 0) {
          return r;
        }
     }
 
-    if (flags & RBD_SNAP_REMOVE_UNPROTECT) {
+    bool is_protected;
+    r = snap_is_protected(ictx, snap_name, &is_protected);
+    if (r < 0) {
+      return r;
+    }
+
+    if (is_protected && flags & RBD_SNAP_REMOVE_UNPROTECT) {
       r = ictx->operations->snap_unprotect(snap_name);
-      if (r < 0)
+      if (r < 0) {
+       lderr(ictx->cct) << "failed to unprotect snapshot: " << snap_name << dendl;
        return r;
+      }
+
+      r = snap_is_protected(ictx, snap_name, &is_protected);
+      if (r < 0) {
+       return r;
+      }
+      if (is_protected) {
+       lderr(ictx->cct) << "snapshot is still protected after unprotection" << dendl;
+       assert(0);
+      }
     }
 
     C_SaferCond ctx;
index d8ae5e44af53d4a43055901d4ea5c2836562229d..333d6a973dc78e99a1e134e067cedd786b606674 100644 (file)
@@ -142,7 +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_remove(ImageCtx *ictx, const char *snap_name, uint32_t flags, ProgressContext& pctx);
   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 9d559a1ea06f40ad7492e58af06d59dff849e397..a002ef74412c1d6549d44d4d75a4c52bf20e357d 100644 (file)
@@ -936,16 +936,17 @@ 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 = librbd::snap_remove(ictx, snap_name, 0);
+    librbd::NoOpProgressContext prog_ctx;
+    int r = librbd::snap_remove(ictx, snap_name, 0, prog_ctx);
     tracepoint(librbd, snap_remove_exit, r);
     return r;
   }
 
-  int Image::snap_remove2(const char *snap_name, uint32_t flags)
+  int Image::snap_remove2(const char *snap_name, uint32_t flags, ProgressContext& pctx)
   {
     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);
+    int r = librbd::snap_remove(ictx, snap_name, flags, pctx);
     tracepoint(librbd, snap_remove_exit, r);
     return r;
   }
@@ -2226,11 +2227,13 @@ 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)
+extern "C" int rbd_snap_remove2(rbd_image_t image, const char *snap_name, uint32_t flags,
+                               librbd_progress_fn_t cb, void *cbdata)
 {
   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);
+  librbd::CProgressContext prog_ctx(cb, cbdata);
+  int r = librbd::snap_remove(ictx, snap_name, flags, prog_ctx);
   tracepoint(librbd, snap_remove_exit, r);
   return r;
 }
index b82b441ec82db4deed8f929f284cedb3d52efd66..eeaf99a81278641b966d53e145d0467abfac4b93 100644 (file)
@@ -216,7 +216,8 @@ cdef extern from "rbd/librbd.h" nogil:
     void rbd_snap_list_end(rbd_snap_info_t *snaps)
     int rbd_snap_create(rbd_image_t image, const char *snapname)
     int rbd_snap_remove(rbd_image_t image, const char *snapname)
-    int rbd_snap_remove2(rbd_image_t image, const char *snapname, uint32_t flags)
+    int rbd_snap_remove2(rbd_image_t image, const char *snapname, uint32_t flags,
+                        librbd_progress_fn_t cb, void *cbdata)
     int rbd_snap_rollback(rbd_image_t image, const char *snapname)
     int rbd_snap_rename(rbd_image_t image, const char *snapname,
                         const char* dstsnapsname)
@@ -1544,8 +1545,9 @@ cdef class Image(object):
         cdef:
             char *_name = name
             uint32_t _flags = flags
+            librbd_progress_fn_t prog_cb = &no_op_progress_callback
         with nogil:
-            ret = rbd_snap_remove2(self.image, _name, _flags)
+            ret = rbd_snap_remove2(self.image, _name, _flags, prog_cb, NULL)
         if ret != 0:
             raise make_ex(ret, 'error removing snapshot %s from %s with flags %llx' % (name, self.name, flags))
 
index b05cc583f55501264e5e80233d8b084785a84e11..d558371bbbf3cfab4e76bffe1cbfab2f69beaefa 100644 (file)
@@ -919,8 +919,8 @@ whenever it is run. grep -v to ignore it, but still work on other distros.
   </stats>
 
 # cleanup
-  $ rbd snap remove rbd_other/deep-flatten-child@snap
-  $ rbd snap remove rbd_other/child@snap
+  $ rbd snap remove --no-progress rbd_other/deep-flatten-child@snap
+  $ rbd snap remove --no-progress rbd_other/child@snap
   $ rbd snap unprotect bar@snap
   $ rbd snap purge bar 2> /dev/null
   $ rbd snap purge foo 2> /dev/null
index 0f86b7834ae2ae4c72cd61c311302346d5189a9e..175294eac3331acce94f8e3930ce82f43851d140 100644 (file)
   
   rbd help snap remove
   usage: rbd snap remove [--pool <pool>] [--image <image>] [--snap <snap>] 
-                         [--force] 
+                         [--no-progress] [--force] 
                          <snap-spec> 
   
   Deletes a snapshot.
     -p [ --pool ] arg    pool name
     --image arg          image name
     --snap arg           snapshot name
+    --no-progress        disable progress output
     --force              flatten children and unprotect snapshot if needed.
   
   rbd help snap rename
index edb424bdc8cc682295bd0e116d807d1e172e6eef..892d051d8c343474b5d6b0b2798692106e72d2d3 100644 (file)
@@ -70,13 +70,20 @@ int do_add_snap(librbd::Image& image, const char *snapname)
   return 0;
 }
 
-int do_remove_snap(librbd::Image& image, const char *snapname, bool force)
+int do_remove_snap(librbd::Image& image, const char *snapname, bool force,
+                  bool no_progress)
 {
   uint32_t flags = force? RBD_SNAP_REMOVE_FORCE : 0;
-  int r = image.snap_remove2(snapname, flags);
-  if (r < 0)
+  int r = 0;
+  utils::ProgressContext pc("Removing snap", no_progress);
+  
+  r = image.snap_remove2(snapname, flags, pc);
+  if (r < 0) {
+    pc.fail();
     return r;
+  }
 
+  pc.finish();
   return 0;
 }
 
@@ -239,6 +246,7 @@ int execute_create(const po::variables_map &vm) {
 void get_remove_arguments(po::options_description *positional,
                           po::options_description *options) {
   at::add_snap_spec_options(positional, options, at::ARGUMENT_MODIFIER_NONE);
+  at::add_no_progress_option(options);
   
   options->add_options()
     ("force", po::bool_switch(), "flatten children and unprotect snapshot if needed.");
@@ -266,7 +274,7 @@ int execute_remove(const po::variables_map &vm) {
     return r;
   }
 
-  r = do_remove_snap(image, snap_name.c_str(), force);
+  r = do_remove_snap(image, snap_name.c_str(), force, vm[at::NO_PROGRESS].as<bool>());
   if (r < 0) {
     if (r == -EBUSY) {
       std::cerr << "rbd: snapshot '" << snap_name << "' "