]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: open image gets name from directory or trash
authorRicardo Dias <rdias@suse.com>
Fri, 24 Feb 2017 18:35:31 +0000 (18:35 +0000)
committerRicardo Dias <rdias@suse.com>
Tue, 11 Apr 2017 11:09:41 +0000 (12:09 +0100)
Signed-off-by: Ricardo Dias <rdias@suse.com>
src/librbd/image/OpenRequest.cc
src/librbd/image/OpenRequest.h

index f448466eab4f161cd0f0794f73631e0b1e3175aa..6dca04050110c798b9d7507e09165bb73041ddf5 100644 (file)
@@ -184,10 +184,61 @@ Context *OpenRequest<I>::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 <typename I>
+void OpenRequest<I>::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<I>;
+  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 <typename I>
+Context *OpenRequest<I>::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();
   }
index cd77844516e8fa49cada167f0c5a740398cbb558..3ae8602fb4bc9695f837f2748d9ca5eb384a6ce3 100644 (file)
@@ -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);