]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
librbd: get image name on open if it is opened by id
authorMykola Golub <mgolub@mirantis.com>
Tue, 23 Feb 2016 09:28:00 +0000 (11:28 +0200)
committerMykola Golub <mgolub@mirantis.com>
Wed, 24 Feb 2016 14:28:05 +0000 (16:28 +0200)
Signed-off-by: Mykola Golub <mgolub@mirantis.com>
src/librbd/image/OpenRequest.cc
src/librbd/image/OpenRequest.h
src/test/librbd/test_internal.cc

index cb0979aec6a120381b61923b306342176cfccf7e..68abbba620abb23b264498d3505b745bd3651b97 100644 (file)
@@ -102,7 +102,7 @@ void OpenRequest<I>::send_v2_detect_header() {
                                    comp, &op, &m_out_bl);
     comp->release();
   } else {
-    send_v2_get_immutable_metadata();
+    send_v2_get_name();
   }
 }
 
@@ -141,7 +141,7 @@ void OpenRequest<I>::send_v2_get_id() {
                                     comp, &op, &m_out_bl);
     comp->release();
   } else {
-    send_v2_get_immutable_metadata();
+    send_v2_get_name();
   }
 }
 
@@ -164,6 +164,42 @@ Context *OpenRequest<I>::handle_v2_get_id(int *result) {
   return nullptr;
 }
 
+template <typename I>
+void OpenRequest<I>::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<I>;
+  librados::AioCompletion *comp = create_rados_ack_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 <typename I>
+Context *OpenRequest<I>::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) {
+    lderr(cct) << "failed to retreive name: "
+               << cpp_strerror(*result) << dendl;
+    send_close_image(*result);
+  } else {
+    send_v2_get_immutable_metadata();
+  }
+
+  return nullptr;
+}
+
 template <typename I>
 void OpenRequest<I>::send_v2_get_immutable_metadata() {
   CephContext *cct = m_image_ctx->cct;
index 599fdcefdd2277fc4324094a322bf886c64abf3b..48aed3787ee7dcd656da6fd4c69d374ad9502399 100644 (file)
@@ -38,7 +38,7 @@ private:
    *    \-----> V2_DETECT_HEADER                    |             .
    *                |                               |             .
    *                v                               |             .
-   *            V2_GET_ID                           |             .
+   *            V2_GET_ID|NAME                      |             .
    *                |                               |             .
    *                v                               |             .
    *            V2_GET_IMMUTABLE_METADATA           |             .
@@ -78,6 +78,9 @@ private:
   void send_v2_get_id();
   Context *handle_v2_get_id(int *result);
 
+  void send_v2_get_name();
+  Context *handle_v2_get_name(int *result);
+
   void send_v2_get_immutable_metadata();
   Context *handle_v2_get_immutable_metadata(int *result);
 
index 7c2f759999aa144b956e3fdc89122e87f6187376..c1121da7db4ffecc12e680354725ef9518c07c9e 100644 (file)
@@ -6,6 +6,7 @@
 #include "librbd/AioImageRequest.h"
 #include "librbd/AioImageRequestWQ.h"
 #include "librbd/ExclusiveLock.h"
+#include "librbd/ImageState.h"
 #include "librbd/ImageWatcher.h"
 #include "librbd/internal.h"
 #include "librbd/ObjectMap.h"
@@ -71,6 +72,20 @@ public:
   }
 };
 
+TEST_F(TestInternal, OpenByID) {
+   REQUIRE_FORMAT_V2();
+
+   librbd::ImageCtx *ictx;
+   ASSERT_EQ(0, open_image(m_image_name, &ictx));
+   std::string id = ictx->id;
+   close_image(ictx);
+
+   ictx = new librbd::ImageCtx("", id, nullptr, m_ioctx, true);
+   ASSERT_EQ(0, ictx->state->open());
+   ASSERT_EQ(ictx->name, m_image_name);
+   close_image(ictx);
+}
+
 TEST_F(TestInternal, IsExclusiveLockOwner) {
   REQUIRE_FEATURE(RBD_FEATURE_EXCLUSIVE_LOCK);