From: Ricardo Dias Date: Fri, 24 Feb 2017 18:35:31 +0000 (+0000) Subject: librbd: open image gets name from directory or trash X-Git-Tag: v12.0.2~106^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cde8a9a3eb71e6cb4bb846b9e0327e0498670c4f;p=ceph.git librbd: open image gets name from directory or trash Signed-off-by: Ricardo Dias --- diff --git a/src/librbd/image/OpenRequest.cc b/src/librbd/image/OpenRequest.cc index f448466eab4f..6dca04050110 100644 --- a/src/librbd/image/OpenRequest.cc +++ b/src/librbd/image/OpenRequest.cc @@ -184,10 +184,61 @@ Context *OpenRequest::handle_v2_get_name(int *result) { bufferlist::iterator it = m_out_bl.begin(); *result = cls_client::dir_get_name_finish(&it, &m_image_ctx->name); } - if (*result < 0) { + 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; + } else if (*result == -ENOENT) { + lderr(cct) << "image id " << m_image_ctx->id << " does not exist in rbd " + << "trash, failed to retrieve image name: " + << cpp_strerror(*result) << dendl; + } else { + lderr(cct) << "failed to retreive name from trash: " + << cpp_strerror(*result) << dendl; + } + send_close_image(*result); } else { send_v2_get_immutable_metadata(); } diff --git a/src/librbd/image/OpenRequest.h b/src/librbd/image/OpenRequest.h index cd77844516e8..3ae8602fb4bc 100644 --- a/src/librbd/image/OpenRequest.h +++ b/src/librbd/image/OpenRequest.h @@ -43,6 +43,9 @@ private: * V2_GET_ID|NAME | * | | * v | + * V2_GET_NAME_FROM_TRASH | + * | | + * v | * V2_GET_IMMUTABLE_METADATA | * | | * v | @@ -93,6 +96,9 @@ private: void send_v2_get_name(); Context *handle_v2_get_name(int *result); + void send_v2_get_name_from_trash(); + Context *handle_v2_get_name_from_trash(int *result); + void send_v2_get_immutable_metadata(); Context *handle_v2_get_immutable_metadata(int *result);