namespace librbd {
namespace cls_client {
- void get_immutable_metadata_start(librados::ObjectReadOperation *op) {
- bufferlist bl, empty_bl;
+ void get_initial_metadata_start(librados::ObjectReadOperation *op) {
+ bufferlist bl, empty_bl, features_bl;
snapid_t snap = CEPH_NOSNAP;
::encode(snap, bl);
op->exec("rbd", "get_size", bl);
op->exec("rbd", "get_object_prefix", empty_bl);
+
+ ::encode(snap, features_bl);
+ ::encode(true, features_bl);
+ op->exec("rbd", "get_features", features_bl);
}
- int get_immutable_metadata_finish(bufferlist::iterator *it,
- std::string *object_prefix,
- uint8_t *order) {
+ int get_initial_metadata_finish(bufferlist::iterator *it,
+ std::string *object_prefix,
+ uint8_t *order,
+ uint64_t *features) {
try {
uint64_t size;
+ uint64_t incompatible_features;
// get_size
::decode(*order, *it);
::decode(size, *it);
// get_object_prefix
::decode(*object_prefix, *it);
+ // get_features
+ ::decode(*features, *it);
+ ::decode(incompatible_features, *it);
} catch (const buffer::error &err) {
return -EBADMSG;
}
}
- int get_immutable_metadata(librados::IoCtx *ioctx, const std::string &oid,
- std::string *object_prefix, uint8_t *order)
+ int get_initial_metadata(librados::IoCtx *ioctx, const std::string &oid,
+ std::string *object_prefix, uint8_t *order, uint64_t *features)
{
librados::ObjectReadOperation op;
- get_immutable_metadata_start(&op);
+ get_initial_metadata_start(&op);
bufferlist out_bl;
int r = ioctx->operate(oid, &op, &out_bl);
}
bufferlist::iterator it = out_bl.begin();
- return get_immutable_metadata_finish(&it, object_prefix, order);
+ return get_initial_metadata_finish(&it, object_prefix, order, features);
}
void get_mutable_metadata_start(librados::ObjectReadOperation *op,
namespace librbd {
namespace cls_client {
// high-level interface to the header
- void get_immutable_metadata_start(librados::ObjectReadOperation *op);
- int get_immutable_metadata_finish(bufferlist::iterator *it,
- std::string *object_prefix,
- uint8_t *order);
- int get_immutable_metadata(librados::IoCtx *ioctx, const std::string &oid,
- std::string *object_prefix, uint8_t *order);
+ void get_initial_metadata_start(librados::ObjectReadOperation *op);
+ int get_initial_metadata_finish(bufferlist::iterator *it,
+ std::string *object_prefix,
+ uint8_t *order,
+ uint64_t *features);
+ int get_initial_metadata(librados::IoCtx *ioctx, const std::string &oid,
+ std::string *object_prefix, uint8_t *order, uint64_t *features);
void get_mutable_metadata_start(librados::ObjectReadOperation *op,
bool read_only);
<< dendl;
send_close_image(*result);
} else {
- send_v2_get_immutable_metadata();
+ send_v2_get_initial_metadata();
}
return nullptr;
}
<< "rbd directory, searching in rbd trash..." << dendl;
send_v2_get_name_from_trash();
} else {
- send_v2_get_immutable_metadata();
+ send_v2_get_initial_metadata();
}
-
return nullptr;
}
}
send_close_image(*result);
} else {
- send_v2_get_immutable_metadata();
+ send_v2_get_initial_metadata();
}
return nullptr;
}
template <typename I>
-void OpenRequest<I>::send_v2_get_immutable_metadata() {
+void OpenRequest<I>::send_v2_get_initial_metadata() {
CephContext *cct = m_image_ctx->cct;
ldout(cct, 10) << this << " " << __func__ << dendl;
m_image_ctx->header_oid = util::header_name(m_image_ctx->id);
librados::ObjectReadOperation op;
- cls_client::get_immutable_metadata_start(&op);
+ cls_client::get_initial_metadata_start(&op);
using klass = OpenRequest<I>;
librados::AioCompletion *comp = create_rados_callback<
- klass, &klass::handle_v2_get_immutable_metadata>(this);
+ klass, &klass::handle_v2_get_initial_metadata>(this);
m_out_bl.clear();
m_image_ctx->md_ctx.aio_operate(m_image_ctx->header_oid, comp, &op,
&m_out_bl);
}
template <typename I>
-Context *OpenRequest<I>::handle_v2_get_immutable_metadata(int *result) {
+Context *OpenRequest<I>::handle_v2_get_initial_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);
+ *result = cls_client::get_initial_metadata_finish(
+ &it, &m_image_ctx->object_prefix, &m_image_ctx->order, &m_image_ctx->features);
}
if (*result < 0) {
- lderr(cct) << "failed to retreive immutable metadata: "
+ lderr(cct) << "failed to retreive initial metadata: "
<< cpp_strerror(*result) << dendl;
send_close_image(*result);
- } else {
+ return nullptr;
+ }
+
+ if (m_image_ctx->test_features(RBD_FEATURE_STRIPINGV2)) {
send_v2_get_stripe_unit_count();
+ } else {
+ send_v2_get_create_timestamp();
}
return nullptr;
* V2_GET_NAME_FROM_TRASH |
* | |
* v |
- * V2_GET_IMMUTABLE_METADATA |
+ * V2_GET_INITIAL_METADATA |
* | |
* v |
- * V2_GET_STRIPE_UNIT_COUNT |
- * | |
+ * V2_GET_STRIPE_UNIT_COUNT (skip if |
+ * | disabled) |
* v |
* V2_GET_CREATE_TIMESTAMP |
* | |
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);
+ void send_v2_get_initial_metadata();
+ Context *handle_v2_get_initial_metadata(int *result);
void send_v2_get_stripe_unit_count();
Context *handle_v2_get_stripe_unit_count(int *result);