Skip to content

Commit

Permalink
librbd: fix don&ceph#39;t send get_stripe_unit_count if striping is n…
Browse files Browse the repository at this point in the history
…ot enabled by gmayyyha · Pull Request ceph#17660 · ceph/ceph · GitHub

* striping-feature-21360:
  librbd: fix don't send get_stripe_unit_count if striping is not enabled
  • Loading branch information
Mykola Golub committed Sep 27, 2017
2 parents 2237624 + 3995fe2 commit 96dfa6e
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 32 deletions.
27 changes: 18 additions & 9 deletions src/cls/rbd/cls_rbd_client.cc
Expand Up @@ -13,36 +13,45 @@
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;
}
return 0;

}

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);
Expand All @@ -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,
Expand Down
13 changes: 7 additions & 6 deletions src/cls/rbd/cls_rbd_client.h
Expand Up @@ -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);
Expand Down
28 changes: 16 additions & 12 deletions src/librbd/image/OpenRequest.cc
Expand Up @@ -150,7 +150,7 @@ Context *OpenRequest<I>::handle_v2_get_id(int *result) {
<< dendl;
send_close_image(*result);
} else {
send_v2_get_immutable_metadata();
send_v2_get_initial_metadata();
}
return nullptr;
}
Expand Down Expand Up @@ -190,9 +190,8 @@ Context *OpenRequest<I>::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;
}

Expand Down Expand Up @@ -236,48 +235,53 @@ Context *OpenRequest<I>::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 <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->old_format = false;
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);
comp->release();
}

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;
Expand Down
10 changes: 5 additions & 5 deletions src/librbd/image/OpenRequest.h
Expand Up @@ -46,11 +46,11 @@ class OpenRequest {
* 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 |
* | |
Expand Down Expand Up @@ -102,8 +102,8 @@ class OpenRequest {
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);
Expand Down

0 comments on commit 96dfa6e

Please sign in to comment.