]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: Extract Group module from librbd/internal 11070/head
authorVictor Denisov <denisovenator@gmail.com>
Tue, 13 Sep 2016 20:36:11 +0000 (13:36 -0700)
committerVictor Denisov <denisovenator@gmail.com>
Thu, 15 Sep 2016 20:40:15 +0000 (13:40 -0700)
Signed-off-by: Victor Denisov <denisovenator@gmail.com>
src/librbd/CMakeLists.txt
src/librbd/Group.cc [new file with mode: 0644]
src/librbd/Group.h [new file with mode: 0644]
src/librbd/internal.cc
src/librbd/internal.h
src/librbd/librbd.cc
src/test/rbd_mirror/CMakeLists.txt
src/tools/rbd_mirror/CMakeLists.txt

index 10cf8a5affc6160597ec6800f3534c665f8a83e4..df392b2526d88534e32ec34f6403d8b5cc232c97 100644 (file)
@@ -14,6 +14,7 @@ set(librbd_internal_srcs
   CopyupRequest.cc
   DiffIterate.cc
   ExclusiveLock.cc
+  Group.cc
   ImageCtx.cc
   ImageState.cc
   ImageWatcher.cc
diff --git a/src/librbd/Group.cc b/src/librbd/Group.cc
new file mode 100644 (file)
index 0000000..b6efdbc
--- /dev/null
@@ -0,0 +1,382 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+#include "common/errno.h"
+
+#include "librbd/AioCompletion.h"
+#include "librbd/Group.h"
+#include "librbd/ImageState.h"
+#include "librbd/Utils.h"
+
+#define dout_subsys ceph_subsys_rbd
+#undef dout_prefix
+#define dout_prefix *_dout << "librbd::Group: "
+
+using std::map;
+using std::pair;
+using std::set;
+using std::string;
+using std::vector;
+// list binds to list() here, so std::list is explicitly used below
+
+using ceph::bufferlist;
+using librados::snap_t;
+using librados::IoCtx;
+using librados::Rados;
+
+namespace librbd {
+
+// Consistency groups functions
+
+int group_create(librados::IoCtx& io_ctx, const char *group_name)
+{
+  CephContext *cct = (CephContext *)io_ctx.cct();
+
+  Rados rados(io_ctx);
+  uint64_t bid = rados.get_instance_id();
+
+  uint32_t extra = rand() % 0xFFFFFFFF;
+  ostringstream bid_ss;
+  bid_ss << std::hex << bid << std::hex << extra;
+  string id = bid_ss.str();
+
+  ldout(cct, 2) << "adding consistency group to directory..." << dendl;
+
+  int r = cls_client::group_dir_add(&io_ctx, RBD_GROUP_DIRECTORY, group_name, id);
+  if (r < 0) {
+    lderr(cct) << "error adding consistency group to directory: "
+              << cpp_strerror(r)
+              << dendl;
+    return r;
+  }
+  string header_oid = util::group_header_name(id);
+
+  r = cls_client::group_create(&io_ctx, header_oid);
+  if (r < 0) {
+    lderr(cct) << "error writing header: " << cpp_strerror(r) << dendl;
+    goto err_remove_from_dir;
+  }
+
+  return 0;
+
+err_remove_from_dir:
+  int remove_r = cls_client::group_dir_remove(&io_ctx, RBD_GROUP_DIRECTORY,
+                                             group_name, id);
+  if (remove_r < 0) {
+    lderr(cct) << "error cleaning up consistency group from rbd_directory "
+              << "object after creation failed: " << cpp_strerror(remove_r)
+              << dendl;
+  }
+
+  return r;
+}
+
+int group_remove(librados::IoCtx& io_ctx, const char *group_name)
+{
+  CephContext *cct((CephContext *)io_ctx.cct());
+  ldout(cct, 20) << "group_remove " << &io_ctx << " " << group_name << dendl;
+
+  std::vector<group_image_status_t> images;
+  int r = group_image_list(io_ctx, group_name, images);
+  if (r < 0 && r != -ENOENT) {
+    lderr(cct) << "error listing group images" << dendl;
+    return r;
+  }
+
+  for (auto i : images) {
+    librados::Rados rados(io_ctx);
+    IoCtx image_ioctx;
+    rados.ioctx_create2(i.pool, image_ioctx);
+    r = group_image_remove(io_ctx, group_name, image_ioctx, i.name.c_str());
+    if (r < 0 && r != -ENOENT) {
+      lderr(cct) << "error removing image from a group" << dendl;
+      return r;
+    }
+  }
+
+  std::string group_id;
+  r = cls_client::dir_get_id(&io_ctx, RBD_GROUP_DIRECTORY,
+                            std::string(group_name), &group_id);
+  if (r < 0 && r != -ENOENT) {
+    lderr(cct) << "error getting id of group" << dendl;
+    return r;
+  }
+
+  string header_oid = util::group_header_name(group_id);
+
+  r = io_ctx.remove(header_oid);
+  if (r < 0 && r != -ENOENT) {
+    lderr(cct) << "error removing header: " << cpp_strerror(-r) << dendl;
+    return r;
+  }
+
+  r = cls_client::group_dir_remove(&io_ctx, RBD_GROUP_DIRECTORY,
+                                      group_name, group_id);
+  if (r < 0 && r != -ENOENT) {
+    lderr(cct) << "error removing group from directory" << dendl;
+    return r;
+  }
+
+  return 0;
+}
+
+int group_list(IoCtx& io_ctx, vector<string>& names)
+{
+  CephContext *cct = (CephContext *)io_ctx.cct();
+  ldout(cct, 20) << "group_list " << &io_ctx << dendl;
+
+  int max_read = 1024;
+  string last_read = "";
+  int r;
+  do {
+    map<string, string> groups;
+    r = cls_client::group_dir_list(&io_ctx, RBD_GROUP_DIRECTORY, last_read, max_read, &groups);
+    if (r < 0) {
+      lderr(cct) << "error listing group in directory: "
+                << cpp_strerror(r) << dendl;
+      return r;
+    }
+    for (pair<string, string> group : groups) {
+      names.push_back(group.first);
+    }
+    if (!groups.empty()) {
+      last_read = groups.rbegin()->first;
+    }
+    r = groups.size();
+  } while (r == max_read);
+
+  return 0;
+}
+
+int group_image_add(librados::IoCtx& group_ioctx, const char *group_name,
+                   librados::IoCtx& image_ioctx, const char *image_name)
+{
+  CephContext *cct = (CephContext *)group_ioctx.cct();
+  ldout(cct, 20) << "group_image_add " << &group_ioctx
+                << " group name " << group_name << " image "
+                << &image_ioctx << " name " << image_name << dendl;
+
+  string group_id;
+
+  int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY, group_name, &group_id);
+  if (r < 0) {
+    lderr(cct) << "error reading consistency group id object: "
+              << cpp_strerror(r)
+              << dendl;
+    return r;
+  }
+  string group_header_oid = util::group_header_name(group_id);
+
+
+  ldout(cct, 20) << "adding image to group name " << group_name
+                << " group id " << group_header_oid << dendl;
+
+  string image_id;
+
+  r = cls_client::dir_get_id(&image_ioctx, RBD_DIRECTORY, image_name, &image_id);
+  if (r < 0) {
+    lderr(cct) << "error reading image id object: "
+              << cpp_strerror(-r) << dendl;
+    return r;
+  }
+
+  string image_header_oid = util::header_name(image_id);
+
+  ldout(cct, 20) << "adding image " << image_name
+                << " image id " << image_header_oid << dendl;
+
+  cls::rbd::GroupImageStatus incomplete_st(image_id, image_ioctx.get_id(),
+                               cls::rbd::GROUP_IMAGE_LINK_STATE_INCOMPLETE);
+  cls::rbd::GroupImageStatus attached_st(image_id, image_ioctx.get_id(),
+                                 cls::rbd::GROUP_IMAGE_LINK_STATE_ATTACHED);
+
+  r = cls_client::group_image_set(&group_ioctx, group_header_oid,
+                                 incomplete_st);
+
+  cls::rbd::GroupSpec group_spec(group_id, group_ioctx.get_id());
+
+  if (r < 0) {
+    lderr(cct) << "error adding image reference to consistency group: "
+              << cpp_strerror(-r) << dendl;
+    return r;
+  }
+
+  r = cls_client::image_add_group(&image_ioctx, image_header_oid,
+                                        group_spec);
+  if (r < 0) {
+    lderr(cct) << "error adding group reference to image: "
+              << cpp_strerror(-r) << dendl;
+    cls::rbd::GroupImageSpec spec(image_id, image_ioctx.get_id());
+    cls_client::group_image_remove(&group_ioctx, group_header_oid, spec);
+    // Ignore errors in the clean up procedure.
+    return r;
+  }
+
+  r = cls_client::group_image_set(&group_ioctx, group_header_oid,
+                                 attached_st);
+
+  return r;
+}
+
+int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name,
+                      librados::IoCtx& image_ioctx, const char *image_name)
+{
+  CephContext *cct = (CephContext *)group_ioctx.cct();
+  ldout(cct, 20) << "group_remove_image " << &group_ioctx
+                << " group name " << group_name << " image "
+                << &image_ioctx << " name " << image_name << dendl;
+
+  string group_id;
+
+  int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY, group_name, &group_id);
+  if (r < 0) {
+    lderr(cct) << "error reading consistency group id object: "
+              << cpp_strerror(r)
+              << dendl;
+    return r;
+  }
+  string group_header_oid = util::group_header_name(group_id);
+
+  ldout(cct, 20) << "adding image to group name " << group_name
+                << " group id " << group_header_oid << dendl;
+
+  string image_id;
+  r = cls_client::dir_get_id(&image_ioctx, RBD_DIRECTORY, image_name, &image_id);
+  if (r < 0) {
+    lderr(cct) << "error reading image id object: "
+              << cpp_strerror(-r) << dendl;
+    return r;
+  }
+
+  string image_header_oid = util::header_name(image_id);
+
+  ldout(cct, 20) << "removing image " << image_name
+                << " image id " << image_header_oid << dendl;
+
+  cls::rbd::GroupSpec group_spec(group_id, group_ioctx.get_id());
+
+  cls::rbd::GroupImageStatus incomplete_st(image_id, image_ioctx.get_id(),
+                               cls::rbd::GROUP_IMAGE_LINK_STATE_INCOMPLETE);
+
+  cls::rbd::GroupImageSpec spec(image_id, image_ioctx.get_id());
+
+  r = cls_client::group_image_set(&group_ioctx, group_header_oid,
+                                 incomplete_st);
+
+  if (r < 0) {
+    lderr(cct) << "couldn't put image into removing state: "
+              << cpp_strerror(-r) << dendl;
+    return r;
+  }
+
+  r = cls_client::image_remove_group(&image_ioctx, image_header_oid,
+                                    group_spec);
+  if ((r < 0) && (r != -ENOENT)) {
+    lderr(cct) << "couldn't remove group reference from image"
+              << cpp_strerror(-r) << dendl;
+    return r;
+  }
+
+  r = cls_client::group_image_remove(&group_ioctx, group_header_oid, spec);
+  if (r < 0) {
+    lderr(cct) << "couldn't remove image from group"
+              << cpp_strerror(-r) << dendl;
+    return r;
+  }
+
+  return 0;
+}
+
+int group_image_list(librados::IoCtx& group_ioctx,
+                    const char *group_name,
+                    std::vector<group_image_status_t>& images)
+{
+  CephContext *cct = (CephContext *)group_ioctx.cct();
+  ldout(cct, 20) << "group_image_list " << &group_ioctx
+                << " group name " << group_name << dendl;
+
+  string group_id;
+
+  int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY,
+                                group_name, &group_id);
+  if (r < 0) {
+    lderr(cct) << "error reading consistency group id object: "
+              << cpp_strerror(r)
+              << dendl;
+    return r;
+  }
+  string group_header_oid = util::group_header_name(group_id);
+
+  ldout(cct, 20) << "listing images in group name "
+                << group_name << " group id " << group_header_oid << dendl;
+
+  std::vector<cls::rbd::GroupImageStatus> image_ids;
+
+  const int max_read = 1024;
+  do {
+    std::vector<cls::rbd::GroupImageStatus> image_ids_page;
+    cls::rbd::GroupImageSpec start_last;
+
+    r = cls_client::group_image_list(&group_ioctx, group_header_oid,
+       start_last, max_read, image_ids_page);
+
+    if (r < 0) {
+      lderr(cct) << "error reading image list from consistency group: "
+       << cpp_strerror(-r) << dendl;
+      return r;
+    }
+    image_ids.insert(image_ids.end(),
+                    image_ids_page.begin(), image_ids_page.end());
+
+    if (image_ids_page.size() > 0)
+      start_last = image_ids_page.rbegin()->spec;
+
+    r = image_ids_page.size();
+  } while (r == max_read);
+
+  for (auto i : image_ids) {
+    librados::Rados rados(group_ioctx);
+    IoCtx ioctx;
+    rados.ioctx_create2(i.spec.pool_id, ioctx);
+    std::string image_name;
+    r = cls_client::dir_get_name(&ioctx, RBD_DIRECTORY,
+                                i.spec.image_id, &image_name);
+    if (r < 0) {
+      return r;
+    }
+
+    images.push_back(
+       group_image_status_t {
+          image_name,
+          i.spec.pool_id,
+          static_cast<group_image_state_t>(i.state)});
+  }
+
+  return 0;
+}
+
+int image_get_group(ImageCtx *ictx, group_spec_t *group_spec)
+{
+  int r = ictx->state->refresh_if_required();
+  if (r < 0)
+    return r;
+
+  if (-1 != ictx->group_spec.pool_id) {
+    librados::Rados rados(ictx->md_ctx);
+    IoCtx ioctx;
+    rados.ioctx_create2(ictx->group_spec.pool_id, ioctx);
+
+    std::string group_name;
+    r = cls_client::dir_get_name(&ioctx, RBD_GROUP_DIRECTORY,
+                                ictx->group_spec.group_id, &group_name);
+    if (r < 0)
+      return r;
+    group_spec->pool = ictx->group_spec.pool_id;
+    group_spec->name = group_name;
+  } else {
+    group_spec->pool = -1;
+    group_spec->name = "";
+  }
+
+  return 0;
+}
+} // namespace librbd
diff --git a/src/librbd/Group.h b/src/librbd/Group.h
new file mode 100644 (file)
index 0000000..8840b50
--- /dev/null
@@ -0,0 +1,20 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+#ifndef CEPH_LIBRBD_GROUP_H
+#define CEPH_LIBRBD_GROUP_H
+
+namespace librbd {
+
+// Consistency groups functions
+int group_create(librados::IoCtx& io_ctx, const char *imgname);
+int group_remove(librados::IoCtx& io_ctx, const char *group_name);
+int group_list(librados::IoCtx& io_ctx, std::vector<std::string>& names);
+int group_image_add(librados::IoCtx& group_ioctx, const char *group_name,
+                   librados::IoCtx& image_ioctx, const char *image_name);
+int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name,
+                      librados::IoCtx& image_ioctx, const char *image_name);
+int group_image_list(librados::IoCtx& group_ioctx, const char *group_name,
+                    std::vector<group_image_status_t>& images);
+int image_get_group(ImageCtx *ictx, group_spec_t *group_spec);
+}
+#endif // CEPH_LIBRBD_GROUP_H
index 78b0057db841da24e328ba79d83df03444b9326f..e06587cd207cc8b0d8ce7d266a683b9926c3b674 100644 (file)
@@ -3809,360 +3809,6 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     }
   }
 
-  // Consistency groups functions
-
-  int group_create(librados::IoCtx& io_ctx, const char *group_name)
-  {
-    CephContext *cct = (CephContext *)io_ctx.cct();
-
-    Rados rados(io_ctx);
-    uint64_t bid = rados.get_instance_id();
-
-    uint32_t extra = rand() % 0xFFFFFFFF;
-    ostringstream bid_ss;
-    bid_ss << std::hex << bid << std::hex << extra;
-    string id = bid_ss.str();
-
-    ldout(cct, 2) << "adding consistency group to directory..." << dendl;
-
-    int r = cls_client::group_dir_add(&io_ctx, RBD_GROUP_DIRECTORY, group_name, id);
-    if (r < 0) {
-      lderr(cct) << "error adding consistency group to directory: "
-                << cpp_strerror(r)
-                << dendl;
-      return r;
-    }
-    string header_oid = util::group_header_name(id);
-
-    r = cls_client::group_create(&io_ctx, header_oid);
-    if (r < 0) {
-      lderr(cct) << "error writing header: " << cpp_strerror(r) << dendl;
-      goto err_remove_from_dir;
-    }
-
-    return 0;
-
-  err_remove_from_dir:
-    int remove_r = cls_client::group_dir_remove(&io_ctx, RBD_GROUP_DIRECTORY,
-                                               group_name, id);
-    if (remove_r < 0) {
-      lderr(cct) << "error cleaning up consistency group from rbd_directory "
-                << "object after creation failed: " << cpp_strerror(remove_r)
-                << dendl;
-    }
-
-    return r;
-  }
-
-  int group_remove(librados::IoCtx& io_ctx, const char *group_name)
-  {
-    CephContext *cct((CephContext *)io_ctx.cct());
-    ldout(cct, 20) << "group_remove " << &io_ctx << " " << group_name << dendl;
-
-    std::vector<group_image_status_t> images;
-    int r = group_image_list(io_ctx, group_name, images);
-    if (r < 0 && r != -ENOENT) {
-      lderr(cct) << "error listing group images" << dendl;
-      return r;
-    }
-
-    for (auto i : images) {
-      librados::Rados rados(io_ctx);
-      IoCtx image_ioctx;
-      rados.ioctx_create2(i.pool, image_ioctx);
-      r = group_image_remove(io_ctx, group_name, image_ioctx, i.name.c_str());
-      if (r < 0 && r != -ENOENT) {
-       lderr(cct) << "error removing image from a group" << dendl;
-       return r;
-      }
-    }
-
-    std::string group_id;
-    r = cls_client::dir_get_id(&io_ctx, RBD_GROUP_DIRECTORY,
-                              std::string(group_name), &group_id);
-    if (r < 0 && r != -ENOENT) {
-      lderr(cct) << "error getting id of group" << dendl;
-      return r;
-    }
-
-    string header_oid = util::group_header_name(group_id);
-
-    r = io_ctx.remove(header_oid);
-    if (r < 0 && r != -ENOENT) {
-      lderr(cct) << "error removing header: " << cpp_strerror(-r) << dendl;
-      return r;
-    }
-
-    r = cls_client::group_dir_remove(&io_ctx, RBD_GROUP_DIRECTORY,
-                                        group_name, group_id);
-    if (r < 0 && r != -ENOENT) {
-      lderr(cct) << "error removing group from directory" << dendl;
-      return r;
-    }
-
-    return 0;
-  }
-
-  int group_list(IoCtx& io_ctx, vector<string>& names)
-  {
-    CephContext *cct = (CephContext *)io_ctx.cct();
-    ldout(cct, 20) << "group_list " << &io_ctx << dendl;
-
-    int max_read = 1024;
-    string last_read = "";
-    int r;
-    do {
-      map<string, string> groups;
-      r = cls_client::group_dir_list(&io_ctx, RBD_GROUP_DIRECTORY, last_read, max_read, &groups);
-      if (r < 0) {
-        lderr(cct) << "error listing group in directory: "
-                   << cpp_strerror(r) << dendl;
-        return r;
-      }
-      for (pair<string, string> group : groups) {
-       names.push_back(group.first);
-      }
-      if (!groups.empty()) {
-       last_read = groups.rbegin()->first;
-      }
-      r = groups.size();
-    } while (r == max_read);
-
-    return 0;
-  }
-
-  int group_image_add(librados::IoCtx& group_ioctx, const char *group_name,
-                     librados::IoCtx& image_ioctx, const char *image_name)
-  {
-    CephContext *cct = (CephContext *)group_ioctx.cct();
-    ldout(cct, 20) << "group_image_add " << &group_ioctx
-                   << " group name " << group_name << " image "
-                  << &image_ioctx << " name " << image_name << dendl;
-
-    string group_id;
-
-    int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY, group_name, &group_id);
-    if (r < 0) {
-      lderr(cct) << "error reading consistency group id object: "
-                 << cpp_strerror(r)
-                << dendl;
-      return r;
-    }
-    string group_header_oid = util::group_header_name(group_id);
-
-
-    ldout(cct, 20) << "adding image to group name " << group_name
-                   << " group id " << group_header_oid << dendl;
-
-    string image_id;
-
-    r = cls_client::dir_get_id(&image_ioctx, RBD_DIRECTORY, image_name, &image_id);
-    if (r < 0) {
-      lderr(cct) << "error reading image id object: "
-                << cpp_strerror(-r) << dendl;
-      return r;
-    }
-
-    string image_header_oid = util::header_name(image_id);
-
-    ldout(cct, 20) << "adding image " << image_name
-                   << " image id " << image_header_oid << dendl;
-
-    cls::rbd::GroupImageStatus incomplete_st(image_id, image_ioctx.get_id(),
-                                 cls::rbd::GROUP_IMAGE_LINK_STATE_INCOMPLETE);
-    cls::rbd::GroupImageStatus attached_st(image_id, image_ioctx.get_id(),
-                                   cls::rbd::GROUP_IMAGE_LINK_STATE_ATTACHED);
-
-    r = cls_client::group_image_set(&group_ioctx, group_header_oid,
-                                   incomplete_st);
-
-    cls::rbd::GroupSpec group_spec(group_id, group_ioctx.get_id());
-
-    if (r < 0) {
-      lderr(cct) << "error adding image reference to consistency group: "
-                << cpp_strerror(-r) << dendl;
-      return r;
-    }
-
-    r = cls_client::image_add_group(&image_ioctx, image_header_oid,
-                                          group_spec);
-    if (r < 0) {
-      lderr(cct) << "error adding group reference to image: "
-                << cpp_strerror(-r) << dendl;
-      cls::rbd::GroupImageSpec spec(image_id, image_ioctx.get_id());
-      cls_client::group_image_remove(&group_ioctx, group_header_oid, spec);
-      // Ignore errors in the clean up procedure.
-      return r;
-    }
-
-    r = cls_client::group_image_set(&group_ioctx, group_header_oid,
-                                   attached_st);
-
-    return r;
-  }
-
-  int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name,
-                        librados::IoCtx& image_ioctx, const char *image_name)
-  {
-    CephContext *cct = (CephContext *)group_ioctx.cct();
-    ldout(cct, 20) << "group_remove_image " << &group_ioctx
-                   << " group name " << group_name << " image "
-                  << &image_ioctx << " name " << image_name << dendl;
-
-    string group_id;
-
-    int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY, group_name, &group_id);
-    if (r < 0) {
-      lderr(cct) << "error reading consistency group id object: "
-                 << cpp_strerror(r)
-                << dendl;
-      return r;
-    }
-    string group_header_oid = util::group_header_name(group_id);
-
-    ldout(cct, 20) << "adding image to group name " << group_name
-                   << " group id " << group_header_oid << dendl;
-
-    string image_id;
-    r = cls_client::dir_get_id(&image_ioctx, RBD_DIRECTORY, image_name, &image_id);
-    if (r < 0) {
-      lderr(cct) << "error reading image id object: "
-                << cpp_strerror(-r) << dendl;
-      return r;
-    }
-
-    string image_header_oid = util::header_name(image_id);
-
-    ldout(cct, 20) << "removing image " << image_name
-                   << " image id " << image_header_oid << dendl;
-
-    cls::rbd::GroupSpec group_spec(group_id, group_ioctx.get_id());
-
-    cls::rbd::GroupImageStatus incomplete_st(image_id, image_ioctx.get_id(),
-                                 cls::rbd::GROUP_IMAGE_LINK_STATE_INCOMPLETE);
-
-    cls::rbd::GroupImageSpec spec(image_id, image_ioctx.get_id());
-
-    r = cls_client::group_image_set(&group_ioctx, group_header_oid,
-                                   incomplete_st);
-
-    if (r < 0) {
-      lderr(cct) << "couldn't put image into removing state: "
-                << cpp_strerror(-r) << dendl;
-      return r;
-    }
-
-    r = cls_client::image_remove_group(&image_ioctx, image_header_oid,
-                                      group_spec);
-    if ((r < 0) && (r != -ENOENT)) {
-      lderr(cct) << "couldn't remove group reference from image"
-                << cpp_strerror(-r) << dendl;
-      return r;
-    }
-
-    r = cls_client::group_image_remove(&group_ioctx, group_header_oid, spec);
-    if (r < 0) {
-      lderr(cct) << "couldn't remove image from group"
-                << cpp_strerror(-r) << dendl;
-      return r;
-    }
-
-    return 0;
-  }
-
-  int group_image_list(librados::IoCtx& group_ioctx,
-                      const char *group_name,
-                      std::vector<group_image_status_t>& images)
-  {
-    CephContext *cct = (CephContext *)group_ioctx.cct();
-    ldout(cct, 20) << "group_image_list " << &group_ioctx
-                   << " group name " << group_name << dendl;
-
-    string group_id;
-
-    int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY,
-                                  group_name, &group_id);
-    if (r < 0) {
-      lderr(cct) << "error reading consistency group id object: "
-                 << cpp_strerror(r)
-                << dendl;
-      return r;
-    }
-    string group_header_oid = util::group_header_name(group_id);
-
-    ldout(cct, 20) << "listing images in group name "
-                   << group_name << " group id " << group_header_oid << dendl;
-
-    std::vector<cls::rbd::GroupImageStatus> image_ids;
-
-    const int max_read = 1024;
-    do {
-      std::vector<cls::rbd::GroupImageStatus> image_ids_page;
-      cls::rbd::GroupImageSpec start_last;
-
-      r = cls_client::group_image_list(&group_ioctx, group_header_oid,
-         start_last, max_read, image_ids_page);
-
-      if (r < 0) {
-       lderr(cct) << "error reading image list from consistency group: "
-         << cpp_strerror(-r) << dendl;
-       return r;
-      }
-      image_ids.insert(image_ids.end(),
-                      image_ids_page.begin(), image_ids_page.end());
-
-      if (image_ids_page.size() > 0)
-       start_last = image_ids_page.rbegin()->spec;
-
-      r = image_ids_page.size();
-    } while (r == max_read);
-
-    for (auto i : image_ids) {
-      librados::Rados rados(group_ioctx);
-      IoCtx ioctx;
-      rados.ioctx_create2(i.spec.pool_id, ioctx);
-      std::string image_name;
-      r = cls_client::dir_get_name(&ioctx, RBD_DIRECTORY,
-                                   i.spec.image_id, &image_name);
-      if (r < 0) {
-        return r;
-      }
-
-      images.push_back(
-         group_image_status_t {
-            image_name,
-            i.spec.pool_id,
-            static_cast<group_image_state_t>(i.state)});
-    }
-
-    return 0;
-  }
-
-  int image_get_group(ImageCtx *ictx, group_spec_t *group_spec)
-  {
-    int r = ictx->state->refresh_if_required();
-    if (r < 0)
-      return r;
-
-    if (-1 != ictx->group_spec.pool_id) {
-      librados::Rados rados(ictx->md_ctx);
-      IoCtx ioctx;
-      rados.ioctx_create2(ictx->group_spec.pool_id, ioctx);
-
-      std::string group_name;
-      r = cls_client::dir_get_name(&ioctx, RBD_GROUP_DIRECTORY,
-                                  ictx->group_spec.group_id, &group_name);
-      if (r < 0)
-       return r;
-      group_spec->pool = ictx->group_spec.pool_id;
-      group_spec->name = group_name;
-    } else {
-      group_spec->pool = -1;
-      group_spec->name = "";
-    }
-
-    return 0;
-  }
 
 
 }
index bd56358a84e95503fe30f3b727af25ba2ff1e128..e067ee88bc0482b8e1e4ea209143bd1100c2c0c1 100644 (file)
@@ -225,17 +225,6 @@ namespace librbd {
   int mirror_image_get_status(ImageCtx *ictx, mirror_image_status_t *status,
                              size_t status_size);
 
-  // Consistency groups functions
-  int group_create(librados::IoCtx& io_ctx, const char *imgname);
-  int group_remove(librados::IoCtx& io_ctx, const char *group_name);
-  int group_list(librados::IoCtx& io_ctx, std::vector<std::string>& names);
-  int group_image_add(librados::IoCtx& group_ioctx, const char *group_name,
-                     librados::IoCtx& image_ioctx, const char *image_name);
-  int group_image_remove(librados::IoCtx& group_ioctx, const char *group_name,
-                        librados::IoCtx& image_ioctx, const char *image_name);
-  int group_image_list(librados::IoCtx& group_ioctx, const char *group_name,
-                      std::vector<group_image_status_t>& images);
-  int image_get_group(ImageCtx *ictx, group_spec_t *group_spec);
 }
 
 #endif
index 42696f60449ee29660410991e55d6daf93210d41..33ac42ff6bea79d8b95fa722c73aeeb68ede3dcd 100644 (file)
@@ -23,6 +23,7 @@
 #include "librbd/AioCompletion.h"
 #include "librbd/AioImageRequestWQ.h"
 #include "cls/rbd/cls_rbd_client.h"
+#include "librbd/Group.h"
 #include "librbd/ImageCtx.h"
 #include "librbd/ImageState.h"
 #include "librbd/internal.h"
index 1e60a0c26e328a9f18771cdbf128a2bd78250555..b2a1d8061036a70702930c3c2a43eadae9ef497f 100644 (file)
@@ -38,8 +38,8 @@ target_link_libraries(unittest_rbd_mirror
   rbd_mirror
   rados_test_stub
   rbd_mirror_internal
-  rbd_internal
   rbd_api
+  rbd_internal
   rbd_test_mock
   journal
   journal_test_mock
@@ -64,8 +64,8 @@ set_target_properties(ceph_test_rbd_mirror PROPERTIES COMPILE_FLAGS
 target_link_libraries(ceph_test_rbd_mirror
   rbd_mirror
   rbd_mirror_internal
-  rbd_internal
   rbd_api
+  rbd_internal
   journal
   cls_rbd_client
   cls_lock_client
index 16eab07c04fd4b27b1de785ad144b1e316fb0d9d..459f457210c729f0c822bb79b9540683b9d0e453 100644 (file)
@@ -30,8 +30,8 @@ add_executable(rbd-mirror
   ${CMAKE_SOURCE_DIR}/src/common/ContextCompletion.cc)
 target_link_libraries(rbd-mirror
   rbd_mirror_internal
-  rbd_internal
   rbd_api
+  rbd_internal
   rbd_types
   journal
   librados