From c4f2eb4adbd72b5e32ee790c205cfb5ce172b56d Mon Sep 17 00:00:00 2001 From: Victor Denisov Date: Fri, 2 Dec 2016 12:43:42 -0800 Subject: [PATCH] librbd: Add group snap rename method Signed-off-by: Victor Denisov --- src/include/rbd/librbd.h | 4 ++++ src/include/rbd/librbd.hpp | 2 ++ src/librbd/api/Group.cc | 45 +++++++++++++++++++++++++++++++++++++ src/librbd/api/Group.h | 8 ++++--- src/librbd/librbd.cc | 34 ++++++++++++++++++++++++++++ src/pybind/rbd/rbd.pyx | 26 +++++++++++++++++++++ src/test/pybind/test_rbd.py | 10 +++++++++ src/tracing/librbd.tp | 24 ++++++++++++++++++++ 8 files changed, 150 insertions(+), 3 deletions(-) diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 9ab4186e84aef..9679db196a65a 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -958,6 +958,10 @@ CEPH_RBD_API int rbd_group_snap_create(rados_ioctx_t group_p, CEPH_RBD_API int rbd_group_snap_remove(rados_ioctx_t group_p, const char *group_name, const char *snap_name); +CEPH_RBD_API int rbd_group_snap_rename(rados_ioctx_t group_p, + const char *group_name, + const char *old_snap_name, + const char *new_snap_name); CEPH_RBD_API int rbd_group_snap_list(rados_ioctx_t group_p, const char *group_name, rbd_group_snap_spec_t *snaps, diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index a25cba05c00f7..470217cf73502 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -231,6 +231,8 @@ public: const char *snap_name); int group_snap_remove(IoCtx& io_ctx, const char *group_name, const char *snap_name); + int group_snap_rename(IoCtx& group_ioctx, const char *group_name, + const char *old_snap_name, const char *new_snap_name); int group_snap_list(IoCtx& group_ioctx, const char *group_name, std::vector *snaps); diff --git a/src/librbd/api/Group.cc b/src/librbd/api/Group.cc index e50c3e8c0f402..07fbd6d403fd6 100644 --- a/src/librbd/api/Group.cc +++ b/src/librbd/api/Group.cc @@ -904,6 +904,7 @@ int Group::snap_remove(librados::IoCtx& group_ioctx, const char *group_name, << dendl; return r; } + std::vector snaps; r = group_snap_list(group_ioctx, group_name, &snaps); if (r < 0) { @@ -927,6 +928,50 @@ int Group::snap_remove(librados::IoCtx& group_ioctx, const char *group_name, return r; } +template +int Group::snap_rename(librados::IoCtx& group_ioctx, const char *group_name, + const char *old_snap_name, + const char *new_snap_name) { + CephContext *cct = (CephContext *)group_ioctx.cct(); + + std::string group_id; + int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY, + group_name, &group_id); + if (r == -ENOENT) { + return r; + } else if (r < 0) { + lderr(cct) << "error reading group id object: " << cpp_strerror(r) << dendl; + return r; + } + + std::vector group_snaps; + r = group_snap_list(group_ioctx, group_name, &group_snaps); + if (r < 0) { + return r; + } + + cls::rbd::GroupSnapshot group_snap; + for (auto &snap : group_snaps) { + if (snap.name == old_snap_name) { + group_snap = snap; + break; + } + } + + if (group_snap.id.empty()) { + return -ENOENT; + } + + std::string group_header_oid = util::group_header_name(group_id); + group_snap.name = new_snap_name; + r = cls_client::group_snap_set(&group_ioctx, group_header_oid, group_snap); + if (r < 0) { + return r; + } + + return 0; +} + template int Group::snap_list(librados::IoCtx& group_ioctx, const char *group_name, std::vector *snaps) diff --git a/src/librbd/api/Group.h b/src/librbd/api/Group.h index 58f8ad556b62d..bfcfedab8e798 100644 --- a/src/librbd/api/Group.h +++ b/src/librbd/api/Group.h @@ -37,11 +37,13 @@ struct Group { static int image_get_group(ImageCtxT *ictx, group_spec_t *group_spec); static int snap_create(librados::IoCtx& group_ioctx, - const char *group_name, const char *snap_name); + const char *group_name, const char *snap_name); static int snap_remove(librados::IoCtx& group_ioctx, - const char *group_name, const char *snap_name); + const char *group_name, const char *snap_name); + static int snap_rename(librados::IoCtx& group_ioctx, const char *group_name, + const char *old_snap_name, const char *new_snap_name); static int snap_list(librados::IoCtx& group_ioctx, const char *group_name, - std::vector *snaps); + std::vector *snaps); }; diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index f87763caa5da1..42def5efd4e5c 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -802,6 +802,20 @@ namespace librbd { return r; } + int RBD::group_snap_rename(IoCtx& group_ioctx, const char *group_name, + const char *old_snap_name, + const char *new_snap_name) + { + TracepointProvider::initialize(get_cct(group_ioctx)); + tracepoint(librbd, group_snap_rename_enter, + group_ioctx.get_pool_name().c_str(), group_ioctx.get_id(), + group_name, old_snap_name, new_snap_name); + int r = librbd::api::Group<>::snap_rename(group_ioctx, group_name, + old_snap_name, new_snap_name); + tracepoint(librbd, group_snap_list_exit, r); + return r; + } + RBD::AioCompletion::AioCompletion(void *cb_arg, callback_t complete_cb) { @@ -4605,6 +4619,26 @@ extern "C" int rbd_group_snap_remove(rados_ioctx_t group_p, const char *group_na return r; } +extern "C" int rbd_group_snap_rename(rados_ioctx_t group_p, + const char *group_name, + const char *old_snap_name, + const char *new_snap_name) +{ + librados::IoCtx group_ioctx; + librados::IoCtx::from_rados_ioctx_t(group_p, group_ioctx); + + TracepointProvider::initialize(get_cct(group_ioctx)); + tracepoint(librbd, group_snap_rename_enter, + group_ioctx.get_pool_name().c_str(), group_ioctx.get_id(), + group_name, old_snap_name, new_snap_name); + + int r = librbd::api::Group<>::snap_rename(group_ioctx, group_name, + old_snap_name, new_snap_name); + + tracepoint(librbd, group_snap_list_exit, r); + return r; +} + extern "C" int rbd_group_snap_list(rados_ioctx_t group_p, const char *group_name, rbd_group_snap_spec_t *snaps, size_t *snaps_size) { diff --git a/src/pybind/rbd/rbd.pyx b/src/pybind/rbd/rbd.pyx index 43569d4abf0aa..a81c4e4955d04 100644 --- a/src/pybind/rbd/rbd.pyx +++ b/src/pybind/rbd/rbd.pyx @@ -419,6 +419,10 @@ cdef extern from "rbd/librbd.h" nogil: int rbd_group_snap_remove(rados_ioctx_t group_p, const char *group_name, const char *snap_name) + int rbd_group_snap_rename(rados_ioctx_t group_p, const char *group_name, + const char *old_snap_name, + const char *new_snap_name) + int rbd_group_snap_list(rados_ioctx_t group_p, const char *group_name, rbd_group_snap_spec_t *snaps, @@ -1645,6 +1649,28 @@ cdef class Group(object): if ret != 0: raise make_ex(ret, 'error removing group snapshot', group_errno_to_exception) + def rename_snap(self, old_snap_name, new_snap_name): + """ + Rename group's snapshot. + + :raises: :class:`ObjectNotFound` + :raises: :class:`ObjectExists` + :raises: :class:`InvalidArgument` + :raises: :class:`FunctionNotSupported` + """ + + old_snap_name = cstr(old_snap_name, 'old_snap_name') + new_snap_name = cstr(new_snap_name, 'new_snap_name') + cdef: + char *_old_snap_name = old_snap_name + char *_new_snap_name = new_snap_name + with nogil: + ret = rbd_group_snap_rename(self._ioctx, self._name, _old_snap_name, + _new_snap_name) + if ret != 0: + raise make_ex(ret, 'error removing group snapshot', + group_errno_to_exception) + def list_snaps(self): """ Iterate over the images of a group. diff --git a/src/test/pybind/test_rbd.py b/src/test/pybind/test_rbd.py index 9b89327fd6b3e..e376e92a9a2c9 100644 --- a/src/test/pybind/test_rbd.py +++ b/src/test/pybind/test_rbd.py @@ -1790,6 +1790,16 @@ class TestGroups(object): self.group.remove_snap(snap_name) eq([], list(self.group.list_snaps())) + def test_group_snap_rename(self): + global snap_name + new_snap_name = "new" + snap_name + + eq([], list(self.group.list_snaps())) + self.group.create_snap(snap_name) + eq([snap_name], [snap['name'] for snap in self.group.list_snaps()]) + self.group.rename_snap(snap_name, new_snap_name) + eq([new_snap_name], [snap['name'] for snap in self.group.list_snaps()]) + @with_setup(create_image, remove_image) def test_rename(): rbd = RBD() diff --git a/src/tracing/librbd.tp b/src/tracing/librbd.tp index 0935b7c2b5df7..c85e6db608e3e 100644 --- a/src/tracing/librbd.tp +++ b/src/tracing/librbd.tp @@ -2611,6 +2611,30 @@ TRACEPOINT_EVENT(librbd, group_snap_remove_exit, ) ) +TRACEPOINT_EVENT(librbd, group_snap_rename_enter, + TP_ARGS( + const char*, pool_name, + int64_t, id, + const char*, group_name, + const char*, old_snap_name, + const char*, new_snap_name), + TP_FIELDS( + ctf_string(pool_name, pool_name) + ctf_integer(int64_t, id, id) + ctf_string(group_name, group_name) + ctf_string(old_snap_name, old_snap_name) + ctf_string(new_snap_name, new_snap_name) + ) +) + +TRACEPOINT_EVENT(librbd, group_snap_rename_exit, + TP_ARGS( + int, retval), + TP_FIELDS( + ctf_integer(int, retval, retval) + ) +) + TRACEPOINT_EVENT(librbd, group_snap_list_enter, TP_ARGS( const char*, pool_name, -- 2.39.5