comp, &op, &m_out_bl);
comp->release();
} else {
- send_v2_get_immutable_metadata();
+ send_v2_get_name();
}
}
comp, &op, &m_out_bl);
comp->release();
} else {
- send_v2_get_immutable_metadata();
+ send_v2_get_name();
}
}
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;
* \-----> V2_DETECT_HEADER | .
* | | .
* v | .
- * V2_GET_ID | .
+ * V2_GET_ID|NAME | .
* | | .
* v | .
* V2_GET_IMMUTABLE_METADATA | .
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);
#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"
}
};
+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);