From: songweibin Date: Sat, 24 Feb 2018 02:41:52 +0000 (+0800) Subject: librbd: add group rename methods X-Git-Tag: wip-pdonnell-testing-20180317.202121~208^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=666181860f5fa3a4da1c4c83732405429f680e8d;p=ceph-ci.git librbd: add group rename methods Signed-off-by: songweibin --- diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 36b93972cab..bfa065aa7db 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -888,6 +888,8 @@ CEPH_RBD_API int rbd_aio_mirror_image_get_status(rbd_image_t image, CEPH_RBD_API int rbd_group_create(rados_ioctx_t p, const char *name); CEPH_RBD_API int rbd_group_remove(rados_ioctx_t p, const char *name); CEPH_RBD_API int rbd_group_list(rados_ioctx_t p, char *names, size_t *size); +CEPH_RBD_API int rbd_group_rename(rados_ioctx_t p, const char *src_name, + const char *dest_name); CEPH_RBD_API int rbd_group_info_cleanup(rbd_group_info_t *group_info, size_t group_info_size); diff --git a/src/include/rbd/librbd.hpp b/src/include/rbd/librbd.hpp index 7ea80162af1..1c0a3fe3f83 100644 --- a/src/include/rbd/librbd.hpp +++ b/src/include/rbd/librbd.hpp @@ -216,6 +216,8 @@ public: int group_create(IoCtx& io_ctx, const char *group_name); int group_remove(IoCtx& io_ctx, const char *group_name); int group_list(IoCtx& io_ctx, std::vector *names); + int group_rename(IoCtx& io_ctx, const char *src_group_name, + const char *dest_group_name); int group_image_add(IoCtx& io_ctx, const char *group_name, IoCtx& image_io_ctx, const char *image_name); diff --git a/src/librbd/api/Group.cc b/src/librbd/api/Group.cc index 99fea4a568d..8a6ae934c40 100644 --- a/src/librbd/api/Group.cc +++ b/src/librbd/api/Group.cc @@ -631,6 +631,34 @@ int Group::image_list(librados::IoCtx& group_ioctx, return 0; } +template +int Group::rename(librados::IoCtx& io_ctx, const char *src_name, + const char *dest_name) +{ + CephContext *cct((CephContext *)io_ctx.cct()); + ldout(cct, 20) << "group_rename " << &io_ctx << " " << src_name + << " -> " << dest_name << dendl; + + std::string group_id; + int r = cls_client::dir_get_id(&io_ctx, RBD_GROUP_DIRECTORY, + std::string(src_name), &group_id); + if (r < 0) { + if (r != -ENOENT) + lderr(cct) << "error getting id of group" << dendl; + return r; + } + + r = cls_client::group_dir_rename(&io_ctx, RBD_GROUP_DIRECTORY, + src_name, dest_name, group_id); + if (r < 0 && r != -ENOENT) { + lderr(cct) << "error renaming group from directory" << dendl; + return r; + } + + return 0; +} + + template int Group::image_get_group(I *ictx, group_info_t *group_info) { diff --git a/src/librbd/api/Group.h b/src/librbd/api/Group.h index 37cb82f7f72..4d3c7612779 100644 --- a/src/librbd/api/Group.h +++ b/src/librbd/api/Group.h @@ -22,6 +22,8 @@ struct Group { static int create(librados::IoCtx& io_ctx, const char *group_name); static int remove(librados::IoCtx& io_ctx, const char *group_name); static int list(librados::IoCtx& io_ctx, std::vector *names); + static int rename(librados::IoCtx& io_ctx, const char *src_group_name, + const char *dest_group_name); static int image_add(librados::IoCtx& group_ioctx, const char *group_name, librados::IoCtx& image_ioctx, const char *image_name); diff --git a/src/librbd/librbd.cc b/src/librbd/librbd.cc index 5c8d1621da9..6f13e5087ad 100644 --- a/src/librbd/librbd.cc +++ b/src/librbd/librbd.cc @@ -718,6 +718,17 @@ namespace librbd { return r; } + int RBD::group_rename(IoCtx& io_ctx, const char *src_name, + const char *dest_name) + { + TracepointProvider::initialize(get_cct(io_ctx)); + tracepoint(librbd, group_rename_enter, io_ctx.get_pool_name().c_str(), + io_ctx.get_id(), src_name, dest_name); + int r = librbd::api::Group<>::rename(io_ctx, src_name, dest_name); + tracepoint(librbd, group_rename_exit, r); + return r; + } + int RBD::group_image_add(IoCtx& group_ioctx, const char *group_name, IoCtx& image_ioctx, const char *image_name) { @@ -4528,6 +4539,19 @@ extern "C" int rbd_group_list(rados_ioctx_t p, char *names, size_t *size) return (int)expected_size; } +extern "C" int rbd_group_rename(rados_ioctx_t p, const char *src_name, + const char *dest_name) +{ + librados::IoCtx io_ctx; + librados::IoCtx::from_rados_ioctx_t(p, io_ctx); + TracepointProvider::initialize(get_cct(io_ctx)); + tracepoint(librbd, group_rename_enter, io_ctx.get_pool_name().c_str(), + io_ctx.get_id(), src_name, dest_name); + int r = librbd::api::Group<>::rename(io_ctx, src_name, dest_name); + tracepoint(librbd, group_rename_exit, r); + return r; +} + extern "C" int rbd_group_image_add(rados_ioctx_t group_p, const char *group_name, rados_ioctx_t image_p, diff --git a/src/test/librbd/test_Groups.cc b/src/test/librbd/test_Groups.cc index 03ab01dc5a1..4a5d71b7fb5 100644 --- a/src/test/librbd/test_Groups.cc +++ b/src/test/librbd/test_Groups.cc @@ -55,7 +55,13 @@ TEST_F(TestGroup, group_create) ASSERT_EQ(1U, groups.size()); ASSERT_EQ("mygroup", groups[0]); - ASSERT_EQ(0, rbd.group_remove(ioctx, "mygroup")); + groups.clear(); + ASSERT_EQ(0, rbd.group_rename(ioctx, "mygroup", "newgroup")); + ASSERT_EQ(0, rbd.group_list(ioctx, &groups)); + ASSERT_EQ(1U, groups.size()); + ASSERT_EQ("newgroup", groups[0]); + + ASSERT_EQ(0, rbd.group_remove(ioctx, "newgroup")); groups.clear(); ASSERT_EQ(0, rbd.group_list(ioctx, &groups)); diff --git a/src/tracing/librbd.tp b/src/tracing/librbd.tp index c85e6db608e..5a4b6b08093 100644 --- a/src/tracing/librbd.tp +++ b/src/tracing/librbd.tp @@ -2353,6 +2353,28 @@ TRACEPOINT_EVENT(librbd, group_remove_exit, ) ) +TRACEPOINT_EVENT(librbd, group_rename_enter, + TP_ARGS( + const char*, pool_name, + int64_t, id, + const char*, groupname, + const char*, destgroupname), + TP_FIELDS( + ctf_string(pool_name, pool_name) + ctf_integer(int64_t, id, id) + ctf_string(groupname, groupname) + ctf_string(destgroupname, destgroupname) + ) +) + +TRACEPOINT_EVENT(librbd, group_rename_exit, + TP_ARGS( + int, retval), + TP_FIELDS( + ctf_integer(int, retval, retval) + ) +) + TRACEPOINT_EVENT(librbd, group_list_enter, TP_ARGS( const char*, pool_name,