]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
cls / librbd: use asynchronous image creation state machine
authorVenky Shankar <vshankar@redhat.com>
Mon, 27 Jun 2016 06:46:32 +0000 (12:16 +0530)
committerVenky Shankar <vshankar@redhat.com>
Sun, 7 Aug 2016 13:23:59 +0000 (18:53 +0530)
... plus changes in rbd class library to use helpers methods.

Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/cls/rbd/cls_rbd_client.cc
src/librbd/internal.cc
src/librbd/internal.h

index b49fe6a70a9cfba80168714f7d31faaeb6f481cb..171e9321967d75cbd3c3e60d4745e3953c8615b6 100644 (file)
@@ -165,13 +165,10 @@ namespace librbd {
                     uint64_t size, uint8_t order, uint64_t features,
                     const std::string &object_prefix)
     {
-      bufferlist bl, bl2;
-      ::encode(size, bl);
-      ::encode(order, bl);
-      ::encode(features, bl);
-      ::encode(object_prefix, (bl));
+      librados::ObjectWriteOperation op;
+      create_image(&op, size, order, features, object_prefix);
 
-      return ioctx->exec(oid, "rbd", "create", bl, bl2);
+      return ioctx->operate(oid, &op);
     }
 
     int get_features(librados::IoCtx *ioctx, const std::string &oid,
@@ -748,10 +745,10 @@ namespace librbd {
     int set_stripe_unit_count(librados::IoCtx *ioctx, const std::string &oid,
                              uint64_t stripe_unit, uint64_t stripe_count)
     {
-      bufferlist in, out;
-      ::encode(stripe_unit, in);
-      ::encode(stripe_count, in);
-      return ioctx->exec(oid, "rbd", "set_stripe_unit_count", in, out);
+      librados::ObjectWriteOperation op;
+      set_stripe_unit_count(&op, stripe_unit, stripe_count);
+
+      return ioctx->operate(oid, &op);
     }
 
     /************************ rbd_id object methods ************************/
@@ -794,9 +791,10 @@ namespace librbd {
 
     int set_id(librados::IoCtx *ioctx, const std::string &oid, std::string id)
     {
-      bufferlist in, out;
-      ::encode(id, in);
-      return ioctx->exec(oid, "rbd", "set_id", in, out);
+      librados::ObjectWriteOperation op;
+      set_id(&op, id);
+
+      return ioctx->operate(oid, &op);
     }
 
     /******************** rbd_directory object methods ********************/
@@ -884,19 +882,19 @@ namespace librbd {
     int dir_add_image(librados::IoCtx *ioctx, const std::string &oid,
                      const std::string &name, const std::string &id)
     {
-      bufferlist in, out;
-      ::encode(name, in);
-      ::encode(id, in);
-      return ioctx->exec(oid, "rbd", "dir_add_image", in, out);
+      librados::ObjectWriteOperation op;
+      dir_add_image(&op, name, id);
+
+      return ioctx->operate(oid, &op);
     }
 
     int dir_remove_image(librados::IoCtx *ioctx, const std::string &oid,
                         const std::string &name, const std::string &id)
     {
-      bufferlist in, out;
-      ::encode(name, in);
-      ::encode(id, in);
-      return ioctx->exec(oid, "rbd", "dir_remove_image", in, out);
+      librados::ObjectWriteOperation op;
+      dir_remove_image(&op, name, id);
+
+      return ioctx->operate(oid, &op);
     }
 
     void dir_remove_image(librados::ObjectWriteOperation *op,
@@ -1128,10 +1126,11 @@ namespace librbd {
 
     int mirror_mode_get(librados::IoCtx *ioctx,
                         cls::rbd::MirrorMode *mirror_mode) {
-      bufferlist in_bl;
+      librados::ObjectReadOperation op;
+      mirror_mode_get_start(&op);
+
       bufferlist out_bl;
-      int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_mode_get", in_bl,
-                          out_bl);
+      int r = ioctx->operate(RBD_MIRRORING, &op, &out_bl);
       if (r == -ENOENT) {
         *mirror_mode = cls::rbd::MIRROR_MODE_DISABLED;
         return 0;
@@ -1139,13 +1138,10 @@ namespace librbd {
         return r;
       }
 
-      try {
-        bufferlist::iterator bl_it = out_bl.begin();
-        uint32_t mirror_mode_decode;
-        ::decode(mirror_mode_decode, bl_it);
-        *mirror_mode = static_cast<cls::rbd::MirrorMode>(mirror_mode_decode);
-      } catch (const buffer::error &err) {
-        return -EBADMSG;
+      bufferlist::iterator it = out_bl.begin();
+      r = mirror_mode_get_finish(&it, mirror_mode);
+      if (r < 0) {
+        return r;
       }
       return 0;
     }
@@ -1316,7 +1312,7 @@ namespace librbd {
       bufferlist::iterator iter = out_bl.begin();
       r = mirror_image_get_finish(&iter, mirror_image);
       if (r < 0) {
-       return r;
+        return r;
       }
       return 0;
     }
@@ -1351,13 +1347,10 @@ namespace librbd {
 
     int mirror_image_set(librados::IoCtx *ioctx, const std::string &image_id,
                         const cls::rbd::MirrorImage &mirror_image) {
-      bufferlist in_bl;
-      ::encode(image_id, in_bl);
-      ::encode(mirror_image, in_bl);
+      librados::ObjectWriteOperation op;
+      mirror_image_set(&op, image_id, mirror_image);
 
-      bufferlist out_bl;
-      int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_image_set", in_bl,
-                         out_bl);
+      int r = ioctx->operate(RBD_MIRRORING, &op);
       if (r < 0) {
         return r;
       }
@@ -1373,12 +1366,10 @@ namespace librbd {
     }
 
     int mirror_image_remove(librados::IoCtx *ioctx, const std::string &image_id) {
-      bufferlist in_bl;
-      ::encode(image_id, in_bl);
+      librados::ObjectWriteOperation op;
+      mirror_image_remove(&op, image_id);
 
-      bufferlist out_bl;
-      int r = ioctx->exec(RBD_MIRRORING, "rbd", "mirror_image_remove", in_bl,
-                         out_bl);
+      int r = ioctx->operate(RBD_MIRRORING, &op);
       if (r < 0) {
         return r;
       }
index b033b7b6d2efb72f6c16ea2253277fa9ab0fc2a1..e7502e58f8f249e340525203ae2de960181bab63 100644 (file)
@@ -24,6 +24,7 @@
 #include "librbd/AioImageRequest.h"
 #include "librbd/AioImageRequestWQ.h"
 #include "librbd/AioObjectRequest.h"
+#include "librbd/image/CreateRequest.h"
 #include "librbd/DiffIterate.h"
 #include "librbd/ExclusiveLock.h"
 #include "librbd/ImageCtx.h"
@@ -1301,6 +1302,21 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
     return r;
   }
 
+  void create_v2(IoCtx& io_ctx, std::string &imgname, uint64_t size,
+                 int order, uint64_t features, uint64_t stripe_unit,
+                 uint64_t stripe_count, uint8_t journal_order,
+                 uint8_t journal_splay_width, const std::string &journal_pool,
+                 const std::string &non_primary_global_image_id,
+                 const std::string &primary_mirror_uuid,
+                 ContextWQ *op_work_queue, Context *ctx) {
+    std::string id = util::generate_image_id(io_ctx);
+    image::CreateRequest<> *req = image::CreateRequest<>::create(
+      io_ctx, imgname, id, size, order, features, stripe_unit,
+      stripe_count, journal_order, journal_splay_width, journal_pool,
+      non_primary_global_image_id, primary_mirror_uuid, op_work_queue, ctx);
+    req->send();
+  }
+
   int create(librados::IoCtx& io_ctx, const char *imgname, uint64_t size,
             int *order)
   {
@@ -1450,10 +1466,17 @@ int mirror_image_disable_internal(ImageCtx *ictx, bool force,
       opts.get(RBD_IMAGE_OPTION_JOURNAL_SPLAY_WIDTH, &journal_splay_width);
       opts.get(RBD_IMAGE_OPTION_JOURNAL_POOL, &journal_pool);
 
-      r = create_v2(io_ctx, imgname, bid, size, order, features, stripe_unit,
-                   stripe_count, journal_order, journal_splay_width,
-                    journal_pool, non_primary_global_image_id,
-                    primary_mirror_uuid);
+      C_SaferCond cond;
+      ContextWQ op_work_queue("librbd::op_work_queue",
+                              cct->_conf->rbd_op_thread_timeout,
+                              ImageCtx::get_thread_pool_instance(cct));
+      std::string imagename(imgname);
+      create_v2(io_ctx, imagename, size, order, features, stripe_unit,
+                stripe_count, journal_order, journal_splay_width, journal_pool,
+                non_primary_global_image_id, primary_mirror_uuid,
+                &op_work_queue, &cond);
+      r = cond.wait();
+      op_work_queue.drain();
     }
 
     int r1 = opts.set(RBD_IMAGE_OPTION_ORDER, order);
index e73d1d01785e5248d4a6fd8d6661d941a52b748d..06b012b9be1248f064624ff6dfabdd75229234b1 100644 (file)
@@ -14,6 +14,7 @@
 #include "include/rbd/librbd.hpp"
 #include "include/rbd_types.h"
 #include "librbd/parent_types.h"
+#include "common/WorkQueue.h"
 
 enum {
   l_librbd_first = 26000,
@@ -97,6 +98,13 @@ namespace librbd {
                    std::set<std::pair<std::string, std::string> > & names);
   int list_children_info(ImageCtx *ictx, librbd::parent_spec parent_spec,
              std::map<std::pair<int64_t, std::string >, std::set<std::string> >& image_info);
+  void create_v2(IoCtx& io_ctx, std::string &imgname, uint64_t size,
+                 int order, uint64_t features, uint64_t stripe_unit,
+                 uint64_t stripe_count, uint8_t journal_order,
+                 uint8_t journal_splay_width, const std::string &journal_pool,
+                 const std::string &non_primary_global_image_id,
+                 const std::string &primary_mirror_uuid,
+                 ContextWQ *op_work_queue, Context *ctx);
   int create(librados::IoCtx& io_ctx, const char *imgname, uint64_t size,
             int *order);
   int create(librados::IoCtx& io_ctx, const char *imgname, uint64_t size,