From: Dongsheng Yang Date: Mon, 11 Jul 2016 14:41:26 +0000 (-0400) Subject: rbd: introduce no-progress for rbd snap remove. X-Git-Tag: ses5-milestone5~282^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=95240f2c775fdb84a4b90733b491f59426f677ae;p=ceph.git rbd: introduce no-progress for rbd snap remove. Signed-off-by: Dongsheng Yang --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 656703bc92f..1f09c8fd330 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -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, diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index ea7a715eeca..57ccb98747d 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -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); diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 5603803e4bf..be242355926 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -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; diff --git a/src/librbd/internal.h b/src/librbd/internal.h index d8ae5e44af5..333d6a973dc 100644 --- a/src/librbd/internal.h +++ b/src/librbd/internal.h @@ -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, diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 9d559a1ea06..a002ef74412 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -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; } diff --git a/src/pybind/rbd/rbd.pyx b/src/pybind/rbd/rbd.pyx index b82b441ec82..eeaf99a8127 100644 --- a/src/pybind/rbd/rbd.pyx +++ b/src/pybind/rbd/rbd.pyx @@ -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)) diff --git a/src/test/cli-integration/rbd/formatted-output.t b/src/test/cli-integration/rbd/formatted-output.t index b05cc583f55..d558371bbbf 100644 --- a/src/test/cli-integration/rbd/formatted-output.t +++ b/src/test/cli-integration/rbd/formatted-output.t @@ -919,8 +919,8 @@ whenever it is run. grep -v to ignore it, but still work on other distros. # 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 diff --git a/src/test/cli/rbd/help.t b/src/test/cli/rbd/help.t index 0f86b7834ae..175294eac33 100644 --- a/src/test/cli/rbd/help.t +++ b/src/test/cli/rbd/help.t @@ -1212,7 +1212,7 @@ rbd help snap remove usage: rbd snap remove [--pool ] [--image ] [--snap ] - [--force] + [--no-progress] [--force] Deletes a snapshot. @@ -1225,6 +1225,7 @@ -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 diff --git a/src/tools/rbd/action/Snap.cc b/src/tools/rbd/action/Snap.cc index edb424bdc8c..892d051d8c3 100644 --- a/src/tools/rbd/action/Snap.cc +++ b/src/tools/rbd/action/Snap.cc @@ -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()); if (r < 0) { if (r == -EBUSY) { std::cerr << "rbd: snapshot '" << snap_name << "' "