From: Yanhu Cao Date: Tue, 12 Sep 2017 02:28:08 +0000 (+0800) Subject: librbd: fix don't send get_stripe_unit_count if striping is not enabled X-Git-Tag: v13.0.1~693^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3995fe2965fc9c452a4803ccfc3161f519f1510b;p=ceph.git librbd: fix don't send get_stripe_unit_count if striping is not enabled Fixes: http://tracker.ceph.com/issues/21360 Signed-off-by: Yanhu Cao --- diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index 8da8b8d5a32..026d1219d68 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -13,24 +13,33 @@ 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; } @@ -38,11 +47,11 @@ namespace librbd { } - 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); @@ -51,7 +60,7 @@ namespace librbd { } 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, diff --git a/src/cls/rbd/cls_rbd_client.h b/src/cls/rbd/cls_rbd_client.h index d84351ece24..4afe4b1112c 100644 --- a/src/cls/rbd/cls_rbd_client.h +++ b/src/cls/rbd/cls_rbd_client.h @@ -21,12 +21,13 @@ namespace librados { 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); diff --git a/src/librbd/image/OpenRequest.cc b/src/librbd/image/OpenRequest.cc index a78778af636..6f97f7ca7c5 100644 --- a/src/librbd/image/OpenRequest.cc +++ b/src/librbd/image/OpenRequest.cc @@ -150,7 +150,7 @@ Context *OpenRequest::handle_v2_get_id(int *result) { << dendl; send_close_image(*result); } else { - send_v2_get_immutable_metadata(); + send_v2_get_initial_metadata(); } return nullptr; } @@ -190,9 +190,8 @@ Context *OpenRequest::handle_v2_get_name(int *result) { << "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; } @@ -236,14 +235,14 @@ Context *OpenRequest::handle_v2_get_name_from_trash(int *result) { } send_close_image(*result); } else { - send_v2_get_immutable_metadata(); + send_v2_get_initial_metadata(); } return nullptr; } template -void OpenRequest::send_v2_get_immutable_metadata() { +void OpenRequest::send_v2_get_initial_metadata() { CephContext *cct = m_image_ctx->cct; ldout(cct, 10) << this << " " << __func__ << dendl; @@ -251,11 +250,11 @@ void OpenRequest::send_v2_get_immutable_metadata() { 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; 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); @@ -263,21 +262,26 @@ void OpenRequest::send_v2_get_immutable_metadata() { } template -Context *OpenRequest::handle_v2_get_immutable_metadata(int *result) { +Context *OpenRequest::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; diff --git a/src/librbd/image/OpenRequest.h b/src/librbd/image/OpenRequest.h index 5dd088770b7..8ea1ff10a2e 100644 --- a/src/librbd/image/OpenRequest.h +++ b/src/librbd/image/OpenRequest.h @@ -46,11 +46,11 @@ private: * 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 | * | | @@ -102,8 +102,8 @@ private: 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);