]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: add group rename methods
authorsongweibin <song.weibin@zte.com.cn>
Sat, 24 Feb 2018 02:41:52 +0000 (10:41 +0800)
committersongweibin <song.weibin@zte.com.cn>
Mon, 26 Feb 2018 02:21:58 +0000 (10:21 +0800)
Signed-off-by: songweibin <song.weibin@zte.com.cn>
src/include/rbd/librbd.h
src/include/rbd/librbd.hpp
src/librbd/api/Group.cc
src/librbd/api/Group.h
src/librbd/librbd.cc
src/test/librbd/test_Groups.cc
src/tracing/librbd.tp

index 36b93972cabee034201eb3310b302a1f1f8cf49f..bfa065aa7dbf5f38e9b9c0811cb57efb3d841c23 100644 (file)
@@ -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);
 
index 7ea80162af151264493d5b60205a3e8bc0d234ee..1c0a3fe3f83a523b4f6ccb47546cb66a5f8a6227 100644 (file)
@@ -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<std::string> *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);
index 99fea4a568da375f9d906e406d0aa9488814bdfe..8a6ae934c401b0b17365dc117fb68d48345a4aac 100644 (file)
@@ -631,6 +631,34 @@ int Group<I>::image_list(librados::IoCtx& group_ioctx,
   return 0;
 }
 
+template <typename I>
+int Group<I>::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 <typename I>
 int Group<I>::image_get_group(I *ictx, group_info_t *group_info)
 {
index 37cb82f7f72b8053947f1c72fac91452b0df710f..4d3c761277980bab5d777977e61c6b7ecbde7ff6 100644 (file)
@@ -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<std::string> *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);
index 5c8d1621da9401b9ee24c3da5651b48ee2646964..6f13e5087ad0026c9d782ef0142068d334e5291b 100644 (file)
@@ -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<tracepoint_traits>(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<tracepoint_traits>(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,
index 03ab01dc5a1d88cc411d4deea27bab7405c3fdbd..4a5d71b7fb5836431e4f9c76d874ae55b39278b1 100644 (file)
@@ -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));
index c85e6db608e3ee39ca8d729be25750d03d0fa7b4..5a4b6b080936f4813a4686e96133b9cd25591916 100644 (file)
@@ -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,