]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: use helper method to create librados::IoCtxs
authorJason Dillaman <dillaman@redhat.com>
Thu, 23 Aug 2018 18:36:45 +0000 (14:36 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 19 Sep 2018 12:05:29 +0000 (08:05 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
12 files changed:
src/librbd/Utils.cc
src/librbd/Utils.h
src/librbd/api/Group.cc
src/librbd/api/Image.cc
src/librbd/api/Migration.cc
src/librbd/api/Mirror.cc
src/librbd/api/Snapshot.cc
src/librbd/image/DetachChildRequest.cc
src/librbd/image/OpenRequest.cc
src/librbd/image/RefreshParentRequest.cc
src/librbd/internal.cc
src/librbd/operation/SnapshotUnprotectRequest.cc

index a858ddf857c31ce10a5cb35bdd06370253f16cff..77b702c64362df14e7841d248c40c6078bdaaa25 100644 (file)
@@ -15,7 +15,7 @@
 
 #define dout_subsys ceph_subsys_rbd
 #undef dout_prefix
-#define dout_prefix *_dout << "librbd: "
+#define dout_prefix *_dout << "librbd::util::" << __func__ << ": "
 
 namespace librbd {
 namespace util {
@@ -118,5 +118,28 @@ bool is_metadata_config_override(const std::string& metadata_key,
   return false;
 }
 
+int create_ioctx(librados::IoCtx& src_io_ctx, const std::string& pool_desc,
+                 int64_t pool_id,
+                 const std::optional<std::string>& pool_namespace,
+                 librados::IoCtx* dst_io_ctx) {
+  auto cct = (CephContext *)src_io_ctx.cct();
+
+  librados::Rados rados(src_io_ctx);
+  int r = rados.ioctx_create2(pool_id, *dst_io_ctx);
+  if (r == -ENOENT) {
+    lderr(cct) << pool_desc << " pool " << pool_id << " no longer exists"
+               << dendl;
+    return r;
+  } else if (r < 0) {
+    lderr(cct) << "error accessing " << pool_desc << " pool " << pool_id
+               << dendl;
+    return r;
+  }
+
+  dst_io_ctx->set_namespace(
+    pool_namespace ? *pool_namespace : src_io_ctx.get_namespace());
+  return 0;
+}
+
 } // namespace util
 } // namespace librbd
index c2925a33ce0e531415e6b70cf80bee7c010e2a4c..c0b68b9f873a145a198447efd70850a1277ee37f 100644 (file)
@@ -17,7 +17,6 @@ namespace librbd {
 class ImageCtx;
 
 namespace util {
-
 namespace detail {
 
 template <typename T>
@@ -211,8 +210,12 @@ inline ZTracer::Trace create_trace(const I &image_ctx, const char *trace_name,
 bool is_metadata_config_override(const std::string& metadata_key,
                                  std::string* config_key);
 
-} // namespace util
+int create_ioctx(librados::IoCtx& src_io_ctx, const std::string& pool_desc,
+                 int64_t pool_id,
+                 const std::optional<std::string>& pool_namespace,
+                 librados::IoCtx* dst_io_ctx);
 
+} // namespace util
 } // namespace librbd
 
 #endif // CEPH_LIBRBD_UTILS_H
index b6a0168548315afa9f2805e1aeebd9ed40aa94c2..d1fa9b9010c628cae2a04b9d763b95074f9f16bc 100644 (file)
@@ -60,7 +60,6 @@ int group_snap_list(librados::IoCtx& group_ioctx, const char *group_name,
                    std::vector<cls::rbd::GroupSnapshot> *cls_snaps)
 {
   CephContext *cct = (CephContext *)group_ioctx.cct();
-  librados::Rados rados(group_ioctx);
 
   string group_id;
   vector<string> ind_snap_names;
@@ -209,7 +208,6 @@ int group_snap_remove_by_record(librados::IoCtx& group_ioctx,
                                const std::string& group_header_oid) {
 
   CephContext *cct = (CephContext *)group_ioctx.cct();
-  librados::Rados rados(group_ioctx);
   std::vector<C_SaferCond*> on_finishes;
   int r, ret_code;
 
@@ -222,12 +220,12 @@ int group_snap_remove_by_record(librados::IoCtx& group_ioctx,
   int snap_count = group_snap.snaps.size();
 
   for (int i = 0; i < snap_count; ++i) {
-    librados::IoCtx image_io_ctx;
-    r = rados.ioctx_create2(group_snap.snaps[i].pool, image_io_ctx);
+    librbd::IoCtx image_io_ctx;
+    r = util::create_ioctx(group_ioctx, "image", group_snap.snaps[i].pool, {},
+                           &image_io_ctx);
     if (r < 0) {
-      ldout(cct, 1) << "Failed to create io context for image" << dendl;
+      return r;
     }
-    image_io_ctx.set_namespace(group_ioctx.get_namespace());
 
     librbd::ImageCtx* image_ctx = new ImageCtx("", group_snap.snaps[i].image_id,
                                               nullptr, image_io_ctx, false);
@@ -318,7 +316,6 @@ int group_snap_rollback_by_record(librados::IoCtx& group_ioctx,
                                   const std::string& group_header_oid,
                                   ProgressContext& pctx) {
   CephContext *cct = (CephContext *)group_ioctx.cct();
-  librados::Rados rados(group_ioctx);
   std::vector<C_SaferCond*> on_finishes;
   int r, ret_code;
 
@@ -332,9 +329,10 @@ int group_snap_rollback_by_record(librados::IoCtx& group_ioctx,
 
   for (int i = 0; i < snap_count; ++i) {
     librados::IoCtx image_io_ctx;
-    r = rados.ioctx_create2(group_snap.snaps[i].pool, image_io_ctx);
+    r = util::create_ioctx(group_ioctx, "image", group_snap.snaps[i].pool, {},
+                           &image_io_ctx);
     if (r < 0) {
-      ldout(cct, 1) << "Failed to create io context for image" << dendl;
+      return r;
     }
 
     librbd::ImageCtx* image_ctx = new ImageCtx("", group_snap.snaps[i].image_id,
@@ -539,14 +537,12 @@ int Group<I>::remove(librados::IoCtx& io_ctx, const char *group_name)
   }
 
   for (auto image : images) {
-    librados::Rados rados(io_ctx);
     IoCtx image_ioctx;
-    r = rados.ioctx_create2(image.spec.pool_id, image_ioctx);
+    r = util::create_ioctx(io_ctx, "image", image.spec.pool_id, {},
+                           &image_ioctx);
     if (r < 0) {
-      lderr(cct) << "error creating image_ioctx" << dendl;
       return r;
     }
-    image_ioctx.set_namespace(io_ctx.get_namespace());
 
     r = group_image_remove(io_ctx, group_id, image_ioctx, image.spec.image_id);
     if (r < 0 && r != -ENOENT) {
@@ -745,13 +741,12 @@ int Group<I>::image_list(librados::IoCtx& group_ioctx,
   group_image_list(group_ioctx, group_name, &image_ids);
 
   for (auto image_id : image_ids) {
-    librados::Rados rados(group_ioctx);
     IoCtx ioctx;
-    int r = rados.ioctx_create2(image_id.spec.pool_id, ioctx);
+    int r = util::create_ioctx(group_ioctx, "image", image_id.spec.pool_id, {},
+                               &ioctx);
     if (r < 0) {
       return r;
     }
-    ioctx.set_namespace(group_ioctx.get_namespace());
 
     std::string image_name;
     r = cls_client::dir_get_name(&ioctx, RBD_DIRECTORY,
@@ -806,12 +801,12 @@ int Group<I>::image_get_group(I *ictx, group_info_t *group_info)
     return r;
 
   if (RBD_GROUP_INVALID_POOL != ictx->group_spec.pool_id) {
-    librados::Rados rados(ictx->md_ctx);
     IoCtx ioctx;
-    r = rados.ioctx_create2(ictx->group_spec.pool_id, ioctx);
-    if (r < 0)
+    r = util::create_ioctx(ictx->md_ctx, "group", ictx->group_spec.pool_id, {},
+                           &ioctx);
+    if (r < 0) {
       return r;
-    ioctx.set_namespace(ictx->md_ctx.get_namespace());
+    }
 
     std::string group_name;
     r = cls_client::dir_get_name(&ioctx, RBD_GROUP_DIRECTORY,
@@ -833,7 +828,6 @@ int Group<I>::snap_create(librados::IoCtx& group_ioctx,
     const char *group_name, const char *snap_name)
 {
   CephContext *cct = (CephContext *)group_ioctx.cct();
-  librados::Rados rados(group_ioctx);
 
   string group_id;
   cls::rbd::GroupSnapshot group_snap;
@@ -892,12 +886,13 @@ int Group<I>::snap_create(librados::IoCtx& group_ioctx,
   }
 
   for (auto image: images) {
-    librados::IoCtx image_io_ctx;
-    r = rados.ioctx_create2(image.spec.pool_id, image_io_ctx);
+    librbd::IoCtx image_io_ctx;
+    r = util::create_ioctx(group_ioctx, "image", image.spec.pool_id, {},
+                           &image_io_ctx);
     if (r < 0) {
-      ldout(cct, 1) << "Failed to create io context for image" << dendl;
+      ret_code = r;
+      goto finish;
     }
-    image_io_ctx.set_namespace(group_ioctx.get_namespace());
 
     ldout(cct, 20) << "Opening image with id " << image.spec.image_id << dendl;
 
@@ -1066,7 +1061,6 @@ int Group<I>::snap_remove(librados::IoCtx& group_ioctx, const char *group_name,
                          const char *snap_name)
 {
   CephContext *cct = (CephContext *)group_ioctx.cct();
-  librados::Rados rados(group_ioctx);
 
   string group_id;
   int r = cls_client::dir_get_id(&group_ioctx, RBD_GROUP_DIRECTORY,
index c008e61bf18be8b5f7e8445f6de45b12ce9d4f01..6fdc0875094330f53f7d6066bb781d64b8520d1e 100644 (file)
@@ -111,16 +111,12 @@ int Image<I>::list_children(I *ictx,
     }
 
     IoCtx ioctx;
-    r = rados.ioctx_create2(it->first, ioctx);
+    r = util::create_ioctx(ictx->md_ctx, "child image", it->first, {}, &ioctx);
     if (r == -ENOENT) {
-      ldout(cct, 1) << "pool " << it->second << " no longer exists" << dendl;
       continue;
     } else if (r < 0) {
-      lderr(cct) << "error accessing child image pool " << it->second
-                 << dendl;
       return r;
     }
-    ioctx.set_namespace(ictx->md_ctx.get_namespace());
 
     set<string> image_ids;
     r = cls_client::get_children(&ioctx, RBD_CHILDREN, parent_spec,
@@ -136,13 +132,11 @@ int Image<I>::list_children(I *ictx,
 
   // retrieve clone v2 children attached to this snapshot
   IoCtx parent_io_ctx;
-  r = rados.ioctx_create2(parent_spec.pool_id, parent_io_ctx);
+  r = util::create_ioctx(ictx->md_ctx, "parent image", parent_spec.pool_id,
+                         parent_spec.pool_namespace, &parent_io_ctx);
   if (r < 0) {
-    lderr(cct) << "error accessing parent image pool "
-               << parent_spec.pool_id << ": " << cpp_strerror(r) << dendl;
     return r;
   }
-  parent_io_ctx.set_namespace(parent_spec.pool_namespace);
 
   cls::rbd::ChildImageSpecs child_images;
   r = cls_client::children_list(&parent_io_ctx,
@@ -155,14 +149,10 @@ int Image<I>::list_children(I *ictx,
 
   for (auto& child_image : child_images) {
     IoCtx io_ctx;
-    r = rados.ioctx_create2(child_image.pool_id, io_ctx);
+    r = util::create_ioctx(ictx->md_ctx, "child image", child_image.pool_id,
+                           child_image.pool_namespace, &io_ctx);
     if (r == -ENOENT) {
-      ldout(cct, 1) << "pool " << child_image.pool_id << " no longer exists"
-                    << dendl;
       continue;
-    } else if (r < 0) {
-      lderr(cct) << "error accessing child image pool "
-                 << child_image.pool_id << ": " << cpp_strerror(r) << dendl;
     }
 
     PoolSpec pool_spec = {child_image.pool_id, io_ctx.get_pool_name(),
@@ -241,18 +231,13 @@ int Image<I>::deep_copy(I *src, librados::IoCtx& dest_md_ctx,
   if (parent_spec.pool_id == -1) {
     r = create(dest_md_ctx, destname, "", src_size, opts, "", "", false);
   } else {
-    librados::Rados rados(src->md_ctx);
     librados::IoCtx parent_io_ctx;
-    r = rados.ioctx_create2(parent_spec.pool_id, parent_io_ctx);
+    r = util::create_ioctx(src->md_ctx, "parent image", parent_spec.pool_id,
+                           parent_spec.pool_namespace, &parent_io_ctx);
     if (r < 0) {
-      lderr(cct) << "failed to open source parent pool: "
-                 << cpp_strerror(r) << dendl;
       return r;
     }
 
-    // TODO support clone v2 parent namespaces
-    parent_io_ctx.set_namespace(dest_md_ctx.get_namespace());
-
     C_SaferCond ctx;
     std::string dest_id = util::generate_image_id(dest_md_ctx);
     auto *req = image::CloneRequest<I>::create(
index 5aeb38a665693080a35338448a6522fcc0329344..1e60a3c32226aeebb37f428aa6c524714a565d46 100644 (file)
@@ -233,15 +233,13 @@ int open_source_image(librados::IoCtx& io_ctx, const std::string &image_name,
         return r;
       }
 
+      // TODO support namespaces
       if (io_ctx.get_id() == migration_spec.pool_id) {
         src_io_ctx.dup(io_ctx);
       } else {
-        r = librados::Rados(io_ctx).ioctx_create2(migration_spec.pool_id,
-                                                  src_io_ctx);
+        r = util::create_ioctx(io_ctx, "source image", migration_spec.pool_id,
+                               {}, &src_io_ctx);
         if (r < 0) {
-          lderr(cct) << "error accessing source pool "
-                     << migration_spec.pool_id << ": " << cpp_strerror(r)
-                     << dendl;
           return r;
         }
       }
@@ -306,14 +304,13 @@ int open_source_image(librados::IoCtx& io_ctx, const std::string &image_name,
     ldout(cct, 20) << "migration spec: " << migration_spec << dendl;
   }
 
+  // TODO support namespaces
   if (image_ctx->md_ctx.get_id() == migration_spec.pool_id) {
     dst_io_ctx->dup(io_ctx);
   } else {
-    r = librados::Rados(image_ctx->md_ctx).ioctx_create2(migration_spec.pool_id,
-                                                         *dst_io_ctx);
+    r = util::create_ioctx(image_ctx->md_ctx, "source image",
+                           migration_spec.pool_id, {}, dst_io_ctx);
     if (r < 0) {
-      lderr(cct) << "error accessing destination pool "
-                 << migration_spec.pool_id << ": " << cpp_strerror(r) << dendl;
       return r;
     }
   }
@@ -1151,7 +1148,6 @@ int Migration<I>::create_dst_image() {
 
   int r;
   C_SaferCond on_create;
-  librados::Rados rados(m_src_image_ctx->md_ctx);
   librados::IoCtx parent_io_ctx;
   if (parent_spec.pool_id == -1) {
     auto *req = image::CreateRequest<I>::create(
@@ -1159,10 +1155,10 @@ int Migration<I>::create_dst_image() {
       "", "", true /* skip_mirror_enable */, op_work_queue, &on_create);
     req->send();
   } else {
-    r = rados.ioctx_create2(parent_spec.pool_id, parent_io_ctx);
+    r = util::create_ioctx(m_src_image_ctx->md_ctx, "destination image",
+                           parent_spec.pool_id, parent_spec.pool_namespace,
+                           &parent_io_ctx);
     if (r < 0) {
-      lderr(m_cct) << "failed to open source parent pool: "
-                   << cpp_strerror(r) << dendl;
       return r;
     }
 
@@ -1265,12 +1261,10 @@ int Migration<I>::remove_group(I *image_ctx, group_info_t *group_info) {
 
   ldout(m_cct, 10) << dendl;
 
-  librados::Rados rados(image_ctx->md_ctx);
   IoCtx group_ioctx;
-  r = rados.ioctx_create2(group_info->pool, group_ioctx);
+  r = util::create_ioctx(image_ctx->md_ctx, "group", group_info->pool, {},
+                         &group_ioctx);
   if (r < 0) {
-    lderr(m_cct) << "failed to access pool by ID " << group_info->pool << ": "
-                 << cpp_strerror(r) << dendl;
     return r;
   }
 
@@ -1295,12 +1289,10 @@ int Migration<I>::add_group(I *image_ctx, group_info_t &group_info) {
 
   ldout(m_cct, 10) << dendl;
 
-  librados::Rados rados(image_ctx->md_ctx);
   IoCtx group_ioctx;
-  int r = rados.ioctx_create2(group_info.pool, group_ioctx);
+  int r = util::create_ioctx(image_ctx->md_ctx, "group", group_info.pool, {},
+                             &group_ioctx);
   if (r < 0) {
-    lderr(m_cct) << "failed to access pool by ID " << group_info.pool << ": "
-                 << cpp_strerror(r) << dendl;
     return r;
   }
 
index 1f4fc17e34c418e76f4458e204ce1a4b023feca8..4e12158dcc7bf29692242133c63c910c87969d00 100644 (file)
@@ -286,17 +286,15 @@ int Mirror<I>::image_disable(I *ictx, bool force) {
         if (image_info.empty())
           continue;
 
-        librados::Rados rados(ictx->md_ctx);
         for (auto &info: image_info) {
           librados::IoCtx ioctx;
-          r = rados.ioctx_create2(std::get<0>(info.first), ioctx);
+          r = util::create_ioctx(ictx->md_ctx, "child image",
+                                 std::get<0>(info.first),
+                                 std::get<2>(info.first), &ioctx);
           if (r < 0) {
             rollback = true;
-            lderr(cct) << "error accessing child image pool "
-                       << std::get<1>(info.first)  << dendl;
             return r;
           }
-          ioctx.set_namespace(std::get<2>(info.first));
 
           for (auto &id_it : info.second) {
             cls::rbd::MirrorImage mirror_image_internal;
index fb5c70ba151f2344a53cf61ffb5b225faa6ea9e4..0015adadb2a0a973ab905fd39dfe47065ebb6b87 100644 (file)
@@ -37,14 +37,12 @@ public:
 
   inline int operator()(
       const cls::rbd::GroupSnapshotNamespace& snap_namespace) {
-    librados::Rados rados(*image_ioctx);
     IoCtx group_ioctx;
-    int r = rados.ioctx_create2(snap_namespace.group_pool, group_ioctx);
+    int r = util::create_ioctx(*image_ioctx, "group", snap_namespace.group_pool,
+                               {}, &group_ioctx);
     if (r < 0) {
-      lderr(cct) << "failed to open group pool: " << cpp_strerror(r) << dendl;
       return r;
     }
-    group_ioctx.set_namespace(image_ioctx->get_namespace());
 
     cls::rbd::GroupSnapshot group_snapshot;
 
index 592611298c72e7f3d54930df249bfcd90f9cdea7..da8952351f01cc3b120d7c219117c8951a9b922d 100644 (file)
@@ -67,15 +67,13 @@ void DetachChildRequest<I>::clone_v2_child_detach() {
                             m_image_ctx.md_ctx.get_namespace(),
                             m_image_ctx.id});
 
-  librados::Rados rados(m_image_ctx.md_ctx);
-  int r = rados.ioctx_create2(m_parent_spec.pool_id, m_parent_io_ctx);
+  int r = util::create_ioctx(m_image_ctx.md_ctx, "parent image",
+                             m_parent_spec.pool_id,
+                             m_parent_spec.pool_namespace, &m_parent_io_ctx);
   if (r < 0) {
-    lderr(cct) << "error accessing parent pool: " << cpp_strerror(r)
-               << dendl;
     finish(r);
     return;
   }
-  m_parent_io_ctx.set_namespace(m_parent_spec.pool_namespace);
 
   m_parent_header_name = util::header_name(m_parent_spec.image_id);
 
index b18b512ad57f9c4f97540fa1a7bdadc2c2f01122..7ea98408924d5fed3ce099bba518c0189ae0d71c 100644 (file)
@@ -470,11 +470,9 @@ Context *OpenRequest<I>::handle_v2_get_data_pool(int *result) {
   }
 
   if (data_pool_id != -1) {
-    librados::Rados rados(m_image_ctx->md_ctx);
-    *result = rados.ioctx_create2(data_pool_id, m_image_ctx->data_ctx);
+    *result = util::create_ioctx(m_image_ctx->md_ctx, "data pool", data_pool_id,
+                                 {}, &m_image_ctx->data_ctx);
     if (*result < 0) {
-      lderr(cct) << "failed to initialize data pool IO context: "
-                 << cpp_strerror(*result) << dendl;
       send_close_image(*result);
       return nullptr;
     }
index 9028078d3837b850e973703508a0507164778bce..5afb245867ef44a405c78142c8b32d5f6cb02e90 100644 (file)
@@ -115,16 +115,14 @@ void RefreshParentRequest<I>::send_open_parent() {
   CephContext *cct = m_child_image_ctx.cct;
   ldout(cct, 10) << this << " " << __func__ << dendl;
 
-  librados::Rados rados(m_child_image_ctx.md_ctx);
-
   librados::IoCtx parent_io_ctx;
-  int r = rados.ioctx_create2(m_parent_md.spec.pool_id, parent_io_ctx);
+  int r = util::create_ioctx(m_child_image_ctx.md_ctx, "parent image",
+                             m_parent_md.spec.pool_id,
+                             m_parent_md.spec.pool_namespace, &parent_io_ctx);
   if (r < 0) {
-    lderr(cct) << "failed to create IoCtx: " << cpp_strerror(r) << dendl;
     send_complete(r);
     return;
   }
-  parent_io_ctx.set_namespace(m_parent_md.spec.pool_namespace);
 
   std::string image_name;
   uint64_t flags = 0;
index e70b64ba5b823f42920ff1b1928101ad8409920a..f7eec3c4d69946811b1a3da3c77b21345b3ba450 100644 (file)
@@ -591,14 +591,13 @@ bool compare_by_name(const child_info_t& c1, const child_info_t& c2)
       return 0;
 
     size_t i = 0;
-    Rados rados(ictx->md_ctx);
     for ( auto &info : image_info){
       string pool = std::get<1>(info.first);
       IoCtx ioctx;
-      r = rados.ioctx_create2(std::get<0>(info.first), ioctx);
+      r = util::create_ioctx(ictx->md_ctx, "child image",
+                             std::get<0>(info.first), std::get<2>(info.first),
+                             &ioctx);
       if (r < 0) {
-        lderr(cct) << "Error accessing child image pool " << pool
-                   << dendl;
         return r;
       }
       ioctx.set_namespace(std::get<2>(info.first));
@@ -664,16 +663,14 @@ bool compare_by_name(const child_info_t& c1, const child_info_t& c2)
       return r;
     }
 
-    Rados rados(ictx->md_ctx);
     for (auto &info : image_info) {
       IoCtx ioctx;
-      r = rados.ioctx_create2(std::get<0>(info.first), ioctx);
+      r = util::create_ioctx(ictx->md_ctx, "child image",
+                             std::get<0>(info.first), std::get<2>(info.first),
+                             &ioctx);
       if (r < 0) {
-        lderr(cct) << "Error accessing child image pool "
-                   << std::get<1>(info.first) << dendl;
         return r;
       }
-      ioctx.set_namespace(std::get<2>(info.first));
 
       for (auto &id_it : info.second) {
         string name;
index c80f05dd9665e3af876277beb8cad5e9c91cdcdb..e8f5e6f4201850936bea57a5f7ff8d2139379620 100644 (file)
@@ -87,17 +87,13 @@ public:
       return 1;
     }
 
-    r = rados.ioctx_create2(m_pool.first, m_pool_ioctx);
+    r = util::create_ioctx(image_ctx.md_ctx, "child image", m_pool.first, {},
+                           &m_pool_ioctx);
     if (r == -ENOENT) {
-      ldout(cct, 1) << "pool '" << m_pool.second << "' no longer exists"
-                    << dendl;
       return 1;
     } else if (r < 0) {
-      lderr(cct) << "can't create ioctx for pool '" << m_pool.second
-                 << "'" << dendl;
       return r;
     }
-    m_pool_ioctx.set_namespace(m_pspec.pool_namespace);
 
     librados::ObjectReadOperation op;
     cls_client::get_children_start(&op, m_pspec);