]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: fix don't send get_stripe_unit_count if striping is not enabled 17660/head
authorYanhu Cao <gmayyyha@gmail.com>
Tue, 12 Sep 2017 02:28:08 +0000 (10:28 +0800)
committerYanhu Cao <gmayyyha@gmail.com>
Mon, 25 Sep 2017 08:12:19 +0000 (16:12 +0800)
Fixes: http://tracker.ceph.com/issues/21360
Signed-off-by: Yanhu Cao <gmayyyha@gmail.com>
src/cls/rbd/cls_rbd_client.cc
src/cls/rbd/cls_rbd_client.h
src/librbd/image/OpenRequest.cc
src/librbd/image/OpenRequest.h

index 8da8b8d5a3215e643e8ad85f9f86be35ae492f85..026d1219d680b5c0dedf860d0641bb10da15743f 100644 (file)
 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,
index d84351ece24b2ec2a63207e7fa3419c1b7960b37..4afe4b1112cabeb8cafd5ac4aa346205c01e78e9 100644 (file)
@@ -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);
index a78778af636271eebc8ef74ade04c7015262ba28..6f97f7ca7c5e011f47e8088722023557369061f3 100644 (file)
@@ -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;
 }
@@ -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;
 }
 
@@ -236,14 +235,14 @@ 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;
 
@@ -251,11 +250,11 @@ void OpenRequest<I>::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<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);
@@ -263,21 +262,26 @@ void OpenRequest<I>::send_v2_get_immutable_metadata() {
 }
 
 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;
index 5dd088770b710ea3bf5b7f4bd4b05887e07aeacd..8ea1ff10a2e8411f674796b2d29e4e38b75746c9 100644 (file)
@@ -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);