X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fceph%2Fsrc%2Flibrbd%2Fimage%2FOpenRequest.cc;fp=src%2Fceph%2Fsrc%2Flibrbd%2Fimage%2FOpenRequest.cc;h=0000000000000000000000000000000000000000;hb=7da45d65be36d36b880cc55c5036e96c24b53f00;hp=a78778af636271eebc8ef74ade04c7015262ba28;hpb=691462d09d0987b47e112d6ee8740375df3c51b2;p=stor4nfv.git diff --git a/src/ceph/src/librbd/image/OpenRequest.cc b/src/ceph/src/librbd/image/OpenRequest.cc deleted file mode 100644 index a78778a..0000000 --- a/src/ceph/src/librbd/image/OpenRequest.cc +++ /dev/null @@ -1,599 +0,0 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- -// vim: ts=8 sw=2 smarttab - -#include "librbd/image/OpenRequest.h" -#include "common/dout.h" -#include "common/errno.h" -#include "cls/rbd/cls_rbd_client.h" -#include "librbd/ImageCtx.h" -#include "librbd/Utils.h" -#include "librbd/image/CloseRequest.h" -#include "librbd/image/RefreshRequest.h" -#include "librbd/image/SetSnapRequest.h" -#include -#include "include/assert.h" - -#define dout_subsys ceph_subsys_rbd -#undef dout_prefix -#define dout_prefix *_dout << "librbd::image::OpenRequest: " - -namespace librbd { -namespace image { - -namespace { - -static uint64_t MAX_METADATA_ITEMS = 128; - -} - -using util::create_context_callback; -using util::create_rados_callback; - -template -OpenRequest::OpenRequest(I *image_ctx, bool skip_open_parent, - Context *on_finish) - : m_image_ctx(image_ctx), m_skip_open_parent_image(skip_open_parent), - m_on_finish(on_finish), m_error_result(0), - m_last_metadata_key(ImageCtx::METADATA_CONF_PREFIX) { -} - -template -void OpenRequest::send() { - send_v2_detect_header(); -} - -template -void OpenRequest::send_v1_detect_header() { - librados::ObjectReadOperation op; - op.stat(NULL, NULL, NULL); - - using klass = OpenRequest; - librados::AioCompletion *comp = - create_rados_callback(this); - m_out_bl.clear(); - m_image_ctx->md_ctx.aio_operate(util::old_header_name(m_image_ctx->name), - comp, &op, &m_out_bl); - comp->release(); -} - -template -Context *OpenRequest::handle_v1_detect_header(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << __func__ << ": r=" << *result << dendl; - - if (*result < 0) { - if (*result != -ENOENT) { - lderr(cct) << "failed to stat image header: " << cpp_strerror(*result) - << dendl; - } - send_close_image(*result); - } else { - ldout(cct, 1) << "RBD image format 1 is deprecated. " - << "Please copy this image to image format 2." << dendl; - - m_image_ctx->old_format = true; - m_image_ctx->header_oid = util::old_header_name(m_image_ctx->name); - m_image_ctx->apply_metadata({}); - - send_register_watch(); - } - return nullptr; -} - -template -void OpenRequest::send_v2_detect_header() { - if (m_image_ctx->id.empty()) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - librados::ObjectReadOperation op; - op.stat(NULL, NULL, NULL); - - using klass = OpenRequest; - librados::AioCompletion *comp = - create_rados_callback(this); - m_out_bl.clear(); - m_image_ctx->md_ctx.aio_operate(util::id_obj_name(m_image_ctx->name), - comp, &op, &m_out_bl); - comp->release(); - } else { - send_v2_get_name(); - } -} - -template -Context *OpenRequest::handle_v2_detect_header(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << __func__ << ": r=" << *result << dendl; - - if (*result == -ENOENT) { - send_v1_detect_header(); - } else if (*result < 0) { - lderr(cct) << "failed to stat v2 image header: " << cpp_strerror(*result) - << dendl; - send_close_image(*result); - } else { - m_image_ctx->old_format = false; - send_v2_get_id(); - } - return nullptr; -} - -template -void OpenRequest::send_v2_get_id() { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - librados::ObjectReadOperation op; - cls_client::get_id_start(&op); - - using klass = OpenRequest; - librados::AioCompletion *comp = - create_rados_callback(this); - m_out_bl.clear(); - m_image_ctx->md_ctx.aio_operate(util::id_obj_name(m_image_ctx->name), - comp, &op, &m_out_bl); - comp->release(); -} - -template -Context *OpenRequest::handle_v2_get_id(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << __func__ << ": r=" << *result << dendl; - - if (*result == 0) { - bufferlist::iterator it = m_out_bl.begin(); - *result = cls_client::get_id_finish(&it, &m_image_ctx->id); - } - if (*result < 0) { - lderr(cct) << "failed to retrieve image id: " << cpp_strerror(*result) - << dendl; - send_close_image(*result); - } else { - send_v2_get_immutable_metadata(); - } - return nullptr; -} - -template -void OpenRequest::send_v2_get_name() { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - librados::ObjectReadOperation op; - cls_client::dir_get_name_start(&op, m_image_ctx->id); - - using klass = OpenRequest; - librados::AioCompletion *comp = create_rados_callback< - klass, &klass::handle_v2_get_name>(this); - m_out_bl.clear(); - m_image_ctx->md_ctx.aio_operate(RBD_DIRECTORY, comp, &op, &m_out_bl); - comp->release(); -} - -template -Context *OpenRequest::handle_v2_get_name(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << __func__ << ": r=" << *result << dendl; - - if (*result == 0) { - bufferlist::iterator it = m_out_bl.begin(); - *result = cls_client::dir_get_name_finish(&it, &m_image_ctx->name); - } - if (*result < 0 && *result != -ENOENT) { - lderr(cct) << "failed to retreive name: " - << cpp_strerror(*result) << dendl; - send_close_image(*result); - } else if (*result == -ENOENT) { - // image does not exist in directory, look in the trash bin - ldout(cct, 10) << "image id " << m_image_ctx->id << " does not exist in " - << "rbd directory, searching in rbd trash..." << dendl; - send_v2_get_name_from_trash(); - } else { - send_v2_get_immutable_metadata(); - } - - return nullptr; -} - -template -void OpenRequest::send_v2_get_name_from_trash() { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - librados::ObjectReadOperation op; - cls_client::trash_get_start(&op, m_image_ctx->id); - - using klass = OpenRequest; - librados::AioCompletion *comp = create_rados_callback< - klass, &klass::handle_v2_get_name_from_trash>(this); - m_out_bl.clear(); - m_image_ctx->md_ctx.aio_operate(RBD_TRASH, comp, &op, &m_out_bl); - comp->release(); -} - -template -Context *OpenRequest::handle_v2_get_name_from_trash(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << __func__ << ": r=" << *result << dendl; - - cls::rbd::TrashImageSpec trash_spec; - if (*result == 0) { - bufferlist::iterator it = m_out_bl.begin(); - *result = cls_client::trash_get_finish(&it, &trash_spec); - m_image_ctx->name = trash_spec.name; - } - if (*result < 0) { - if (*result == -EOPNOTSUPP) { - *result = -ENOENT; - } - if (*result == -ENOENT) { - ldout(cct, 5) << "failed to retrieve name for image id " - << m_image_ctx->id << dendl; - } else { - lderr(cct) << "failed to retreive name from trash: " - << cpp_strerror(*result) << dendl; - } - send_close_image(*result); - } else { - send_v2_get_immutable_metadata(); - } - - return nullptr; -} - -template -void OpenRequest::send_v2_get_immutable_metadata() { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - m_image_ctx->old_format = false; - m_image_ctx->header_oid = util::header_name(m_image_ctx->id); - - librados::ObjectReadOperation op; - cls_client::get_immutable_metadata_start(&op); - - using klass = OpenRequest; - librados::AioCompletion *comp = create_rados_callback< - klass, &klass::handle_v2_get_immutable_metadata>(this); - m_out_bl.clear(); - m_image_ctx->md_ctx.aio_operate(m_image_ctx->header_oid, comp, &op, - &m_out_bl); - comp->release(); -} - -template -Context *OpenRequest::handle_v2_get_immutable_metadata(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << __func__ << ": r=" << *result << dendl; - - if (*result == 0) { - bufferlist::iterator it = m_out_bl.begin(); - *result = cls_client::get_immutable_metadata_finish( - &it, &m_image_ctx->object_prefix, &m_image_ctx->order); - } - if (*result < 0) { - lderr(cct) << "failed to retreive immutable metadata: " - << cpp_strerror(*result) << dendl; - send_close_image(*result); - } else { - send_v2_get_stripe_unit_count(); - } - - return nullptr; -} - -template -void OpenRequest::send_v2_get_stripe_unit_count() { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - librados::ObjectReadOperation op; - cls_client::get_stripe_unit_count_start(&op); - - using klass = OpenRequest; - librados::AioCompletion *comp = create_rados_callback< - klass, &klass::handle_v2_get_stripe_unit_count>(this); - m_out_bl.clear(); - m_image_ctx->md_ctx.aio_operate(m_image_ctx->header_oid, comp, &op, - &m_out_bl); - comp->release(); -} - -template -Context *OpenRequest::handle_v2_get_stripe_unit_count(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << __func__ << ": r=" << *result << dendl; - - if (*result == 0) { - bufferlist::iterator it = m_out_bl.begin(); - *result = cls_client::get_stripe_unit_count_finish( - &it, &m_image_ctx->stripe_unit, &m_image_ctx->stripe_count); - } - - if (*result == -ENOEXEC || *result == -EINVAL) { - *result = 0; - } - - if (*result < 0) { - lderr(cct) << "failed to read striping metadata: " << cpp_strerror(*result) - << dendl; - send_close_image(*result); - return nullptr; - } - - send_v2_get_create_timestamp(); - return nullptr; -} - -template -void OpenRequest::send_v2_get_create_timestamp() { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - librados::ObjectReadOperation op; - cls_client::get_create_timestamp_start(&op); - - using klass = OpenRequest; - librados::AioCompletion *comp = create_rados_callback< - klass, &klass::handle_v2_get_create_timestamp>(this); - m_out_bl.clear(); - m_image_ctx->md_ctx.aio_operate(m_image_ctx->header_oid, comp, &op, - &m_out_bl); - comp->release(); -} - -template -Context *OpenRequest::handle_v2_get_create_timestamp(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << ": r=" << *result << dendl; - - if (*result == 0) { - bufferlist::iterator it = m_out_bl.begin(); - *result = cls_client::get_create_timestamp_finish(&it, - &m_image_ctx->create_timestamp); - } - if (*result < 0 && *result != -EOPNOTSUPP) { - lderr(cct) << "failed to retrieve create_timestamp: " - << cpp_strerror(*result) - << dendl; - send_close_image(*result); - return nullptr; - } - - send_v2_get_data_pool(); - return nullptr; -} - -template -void OpenRequest::send_v2_get_data_pool() { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - librados::ObjectReadOperation op; - cls_client::get_data_pool_start(&op); - - using klass = OpenRequest; - librados::AioCompletion *comp = create_rados_callback< - klass, &klass::handle_v2_get_data_pool>(this); - m_out_bl.clear(); - m_image_ctx->md_ctx.aio_operate(m_image_ctx->header_oid, comp, &op, - &m_out_bl); - comp->release(); -} - -template -Context *OpenRequest::handle_v2_get_data_pool(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << ": r=" << *result << dendl; - - int64_t data_pool_id = -1; - if (*result == 0) { - bufferlist::iterator it = m_out_bl.begin(); - *result = cls_client::get_data_pool_finish(&it, &data_pool_id); - } else if (*result == -EOPNOTSUPP) { - *result = 0; - } - - if (*result < 0) { - lderr(cct) << "failed to read data pool: " << cpp_strerror(*result) - << dendl; - send_close_image(*result); - return nullptr; - } - - 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); - if (*result < 0) { - lderr(cct) << "failed to initialize data pool IO context: " - << cpp_strerror(*result) << dendl; - send_close_image(*result); - return nullptr; - } - } - - m_image_ctx->init_layout(); - send_v2_apply_metadata(); - return nullptr; -} - -template -void OpenRequest::send_v2_apply_metadata() { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << ": " - << "start_key=" << m_last_metadata_key << dendl; - - librados::ObjectReadOperation op; - cls_client::metadata_list_start(&op, m_last_metadata_key, MAX_METADATA_ITEMS); - - using klass = OpenRequest; - librados::AioCompletion *comp = - create_rados_callback(this); - m_out_bl.clear(); - m_image_ctx->md_ctx.aio_operate(m_image_ctx->header_oid, comp, &op, - &m_out_bl); - comp->release(); -} - -template -Context *OpenRequest::handle_v2_apply_metadata(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << ": r=" << *result << dendl; - - std::map metadata; - if (*result == 0) { - bufferlist::iterator it = m_out_bl.begin(); - *result = cls_client::metadata_list_finish(&it, &metadata); - } - - if (*result == -EOPNOTSUPP || *result == -EIO) { - ldout(cct, 10) << "config metadata not supported by OSD" << dendl; - } else if (*result < 0) { - lderr(cct) << "failed to retrieve metadata: " << cpp_strerror(*result) - << dendl; - send_close_image(*result); - return nullptr; - } - - if (!metadata.empty()) { - m_metadata.insert(metadata.begin(), metadata.end()); - m_last_metadata_key = metadata.rbegin()->first; - if (boost::starts_with(m_last_metadata_key, - ImageCtx::METADATA_CONF_PREFIX)) { - send_v2_apply_metadata(); - return nullptr; - } - } - - m_image_ctx->apply_metadata(m_metadata); - - send_register_watch(); - return nullptr; -} - -template -void OpenRequest::send_register_watch() { - m_image_ctx->init(); - - if (m_image_ctx->read_only) { - send_refresh(); - return; - } - - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - using klass = OpenRequest; - Context *ctx = create_context_callback< - klass, &klass::handle_register_watch>(this); - m_image_ctx->register_watch(ctx); -} - -template -Context *OpenRequest::handle_register_watch(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << ": r=" << *result << dendl; - - if (*result < 0) { - lderr(cct) << "failed to register watch: " << cpp_strerror(*result) - << dendl; - send_close_image(*result); - } else { - send_refresh(); - } - return nullptr; -} - -template -void OpenRequest::send_refresh() { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - using klass = OpenRequest; - RefreshRequest *req = RefreshRequest::create( - *m_image_ctx, false, m_skip_open_parent_image, - create_context_callback(this)); - req->send(); -} - -template -Context *OpenRequest::handle_refresh(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << __func__ << ": r=" << *result << dendl; - - if (*result < 0) { - lderr(cct) << "failed to refresh image: " << cpp_strerror(*result) - << dendl; - send_close_image(*result); - return nullptr; - } else { - return send_set_snap(result); - } -} - -template -Context *OpenRequest::send_set_snap(int *result) { - if (m_image_ctx->snap_name.empty()) { - *result = 0; - return m_on_finish; - } - - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - using klass = OpenRequest; - SetSnapRequest *req = SetSnapRequest::create( - *m_image_ctx, m_image_ctx->snap_namespace, m_image_ctx->snap_name, - create_context_callback(this)); - req->send(); - return nullptr; -} - -template -Context *OpenRequest::handle_set_snap(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << __func__ << ": r=" << *result << dendl; - - if (*result < 0) { - lderr(cct) << "failed to set image snapshot: " << cpp_strerror(*result) - << dendl; - send_close_image(*result); - return nullptr; - } - - return m_on_finish; -} - -template -void OpenRequest::send_close_image(int error_result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << this << " " << __func__ << dendl; - - m_error_result = error_result; - - using klass = OpenRequest; - Context *ctx = create_context_callback( - this); - CloseRequest *req = CloseRequest::create(m_image_ctx, ctx); - req->send(); -} - -template -Context *OpenRequest::handle_close_image(int *result) { - CephContext *cct = m_image_ctx->cct; - ldout(cct, 10) << __func__ << ": r=" << *result << dendl; - - if (*result < 0) { - lderr(cct) << "failed to close image: " << cpp_strerror(*result) << dendl; - } - if (m_error_result < 0) { - *result = m_error_result; - } - return m_on_finish; -} - -} // namespace image -} // namespace librbd - -template class librbd::image::OpenRequest;