From 8209789dc3c3fea46498f8f82b974945e58d26cf Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 23 Aug 2018 14:36:45 -0400 Subject: [PATCH] librbd: use helper method to create librados::IoCtxs Signed-off-by: Jason Dillaman --- src/librbd/Utils.cc | 25 +++++++++- src/librbd/Utils.h | 7 ++- src/librbd/api/Group.cc | 46 ++++++++----------- src/librbd/api/Image.cc | 29 +++--------- src/librbd/api/Migration.cc | 34 ++++++-------- src/librbd/api/Mirror.cc | 8 ++-- src/librbd/api/Snapshot.cc | 6 +-- src/librbd/image/DetachChildRequest.cc | 8 ++-- src/librbd/image/OpenRequest.cc | 6 +-- src/librbd/image/RefreshParentRequest.cc | 8 ++-- src/librbd/internal.cc | 15 +++--- .../operation/SnapshotUnprotectRequest.cc | 8 +--- 12 files changed, 90 insertions(+), 110 deletions(-) diff --git a/src/librbd/Utils.cc b/src/librbd/Utils.cc index a858ddf857c31..77b702c64362d 100644 --- a/src/librbd/Utils.cc +++ b/src/librbd/Utils.cc @@ -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& 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 diff --git a/src/librbd/Utils.h b/src/librbd/Utils.h index c2925a33ce0e5..c0b68b9f873a1 100644 --- a/src/librbd/Utils.h +++ b/src/librbd/Utils.h @@ -17,7 +17,6 @@ namespace librbd { class ImageCtx; namespace util { - namespace detail { template @@ -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& pool_namespace, + librados::IoCtx* dst_io_ctx); +} // namespace util } // namespace librbd #endif // CEPH_LIBRBD_UTILS_H diff --git a/src/librbd/api/Group.cc b/src/librbd/api/Group.cc index b6a0168548315..d1fa9b9010c62 100644 --- a/src/librbd/api/Group.cc +++ b/src/librbd/api/Group.cc @@ -60,7 +60,6 @@ int group_snap_list(librados::IoCtx& group_ioctx, const char *group_name, std::vector *cls_snaps) { CephContext *cct = (CephContext *)group_ioctx.cct(); - librados::Rados rados(group_ioctx); string group_id; vector 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 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 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::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::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::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::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::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::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, diff --git a/src/librbd/api/Image.cc b/src/librbd/api/Image.cc index c008e61bf18be..6fdc087509433 100644 --- a/src/librbd/api/Image.cc +++ b/src/librbd/api/Image.cc @@ -111,16 +111,12 @@ int Image::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 image_ids; r = cls_client::get_children(&ioctx, RBD_CHILDREN, parent_spec, @@ -136,13 +132,11 @@ int Image::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::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::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::create( diff --git a/src/librbd/api/Migration.cc b/src/librbd/api/Migration.cc index 5aeb38a665693..1e60a3c32226a 100644 --- a/src/librbd/api/Migration.cc +++ b/src/librbd/api/Migration.cc @@ -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::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::create( @@ -1159,10 +1155,10 @@ int Migration::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::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::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; } diff --git a/src/librbd/api/Mirror.cc b/src/librbd/api/Mirror.cc index 1f4fc17e34c41..4e12158dcc7bf 100644 --- a/src/librbd/api/Mirror.cc +++ b/src/librbd/api/Mirror.cc @@ -286,17 +286,15 @@ int Mirror::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; diff --git a/src/librbd/api/Snapshot.cc b/src/librbd/api/Snapshot.cc index fb5c70ba151f2..0015adadb2a0a 100644 --- a/src/librbd/api/Snapshot.cc +++ b/src/librbd/api/Snapshot.cc @@ -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; diff --git a/src/librbd/image/DetachChildRequest.cc b/src/librbd/image/DetachChildRequest.cc index 592611298c72e..da8952351f01c 100644 --- a/src/librbd/image/DetachChildRequest.cc +++ b/src/librbd/image/DetachChildRequest.cc @@ -67,15 +67,13 @@ void DetachChildRequest::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); diff --git a/src/librbd/image/OpenRequest.cc b/src/librbd/image/OpenRequest.cc index b18b512ad57f9..7ea98408924d5 100644 --- a/src/librbd/image/OpenRequest.cc +++ b/src/librbd/image/OpenRequest.cc @@ -470,11 +470,9 @@ Context *OpenRequest::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; } diff --git a/src/librbd/image/RefreshParentRequest.cc b/src/librbd/image/RefreshParentRequest.cc index 9028078d3837b..5afb245867ef4 100644 --- a/src/librbd/image/RefreshParentRequest.cc +++ b/src/librbd/image/RefreshParentRequest.cc @@ -115,16 +115,14 @@ void RefreshParentRequest::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; diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index e70b64ba5b823..f7eec3c4d6994 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -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; diff --git a/src/librbd/operation/SnapshotUnprotectRequest.cc b/src/librbd/operation/SnapshotUnprotectRequest.cc index c80f05dd9665e..e8f5e6f420185 100644 --- a/src/librbd/operation/SnapshotUnprotectRequest.cc +++ b/src/librbd/operation/SnapshotUnprotectRequest.cc @@ -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); -- 2.39.5