#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 {
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
class ImageCtx;
namespace util {
-
namespace detail {
template <typename T>
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
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;
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;
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);
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;
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,
}
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) {
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,
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,
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;
}
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;
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,
}
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,
// 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,
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(),
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(
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;
}
}
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;
}
}
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(
"", "", 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;
}
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;
}
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;
}
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;
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;
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);
}
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;
}
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;
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));
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;
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);