initial code repo
[stor4nfv.git] / src / ceph / src / librbd / image / CreateRequest.h
diff --git a/src/ceph/src/librbd/image/CreateRequest.h b/src/ceph/src/librbd/image/CreateRequest.h
new file mode 100644 (file)
index 0000000..9d77838
--- /dev/null
@@ -0,0 +1,193 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#ifndef CEPH_LIBRBD_IMAGE_CREATE_REQUEST_H
+#define CEPH_LIBRBD_IMAGE_CREATE_REQUEST_H
+
+#include "include/int_types.h"
+#include "include/buffer.h"
+#include "common/WorkQueue.h"
+#include "librbd/ObjectMap.h"
+#include "include/rados/librados.hpp"
+#include "include/rbd_types.h"
+#include "cls/rbd/cls_rbd_types.h"
+#include "include/rbd/librbd.hpp"
+#include "librbd/ImageCtx.h"
+#include "common/Timer.h"
+#include "librbd/journal/TypeTraits.h"
+
+class Context;
+
+using librados::IoCtx;
+
+namespace journal {
+  class Journaler;
+}
+
+namespace librbd {
+namespace image {
+
+template <typename ImageCtxT = ImageCtx>
+class CreateRequest {
+public:
+  static CreateRequest *create(IoCtx &ioctx, const std::string &image_name,
+                               const std::string &image_id, uint64_t size,
+                               const ImageOptions &image_options,
+                               const std::string &non_primary_global_image_id,
+                               const std::string &primary_mirror_uuid,
+                               bool skip_mirror_enable,
+                               ContextWQ *op_work_queue, Context *on_finish) {
+    return new CreateRequest(ioctx, image_name, image_id, size, image_options,
+                             non_primary_global_image_id, primary_mirror_uuid,
+                             skip_mirror_enable, op_work_queue,
+                             on_finish);
+  }
+
+  static int validate_order(CephContext *cct, uint8_t order);
+
+  void send();
+
+private:
+  /**
+   * @verbatim
+   *
+   *                                  <start> . . . . > . . . . .
+   *                                     |                      .
+   *                                     v                      .
+   *                               VALIDATE POOL                v (pool validation
+   *                                     |                      .  disabled)
+   *                                     v                      .
+   *                             VALIDATE OVERWRITE             .
+   *                                     |                      .
+   *                                     v                      .
+   * (error: bottom up)           CREATE ID OBJECT. . < . . . . .
+   *  _______<_______                    |
+   * |               |                   v
+   * |               |          ADD IMAGE TO DIRECTORY
+   * |               |               /   |
+   * |      REMOVE ID OBJECT<-------/    v
+   * |               |           NEGOTIATE FEATURES (when using default features)
+   * |               |                   |
+   * |               |                   v         (stripingv2 disabled)
+   * |               |              CREATE IMAGE. . . . > . . . .
+   * v               |               /   |                      .
+   * |      REMOVE FROM DIR<--------/    v                      .
+   * |               |          SET STRIPE UNIT COUNT           .
+   * |               |               /   |  \ . . . . . > . . . .
+   * |      REMOVE HEADER OBJ<------/    v                     /. (object-map
+   * |               |\           OBJECT MAP RESIZE . . < . . * v  disabled)
+   * |               | \              /  |  \ . . . . . > . . . .
+   * |               |  *<-----------/   v                     /. (journaling
+   * |               |             FETCH MIRROR MODE. . < . . * v  disabled)
+   * |               |                /   |                     .
+   * |     REMOVE OBJECT MAP<--------/    v                     .
+   * |               |\             JOURNAL CREATE              .
+   * |               | \               /  |                     .
+   * v               |  *<------------/   v                     .
+   * |               |           MIRROR IMAGE ENABLE            .
+   * |               |                /   |                     .
+   * |        JOURNAL REMOVE*<-------/    |                     .
+   * |                                    v                     .
+   * |_____________>___________________<finish> . . . . < . . . .
+   *
+   * @endverbatim
+   */
+
+  CreateRequest(IoCtx &ioctx, const std::string &image_name,
+                const std::string &image_id, uint64_t size,
+                const ImageOptions &image_options,
+                const std::string &non_primary_global_image_id,
+                const std::string &primary_mirror_uuid,
+                bool skip_mirror_enable,
+                ContextWQ *op_work_queue, Context *on_finish);
+
+  IoCtx &m_ioctx;
+  IoCtx m_data_io_ctx;
+  std::string m_image_name;
+  std::string m_image_id;
+  uint64_t m_size;
+  uint8_t m_order = 0;
+  uint64_t m_features = 0;
+  uint64_t m_stripe_unit = 0;
+  uint64_t m_stripe_count = 0;
+  uint8_t m_journal_order = 0;
+  uint8_t m_journal_splay_width = 0;
+  std::string m_journal_pool;
+  std::string m_data_pool;
+  int64_t m_data_pool_id = -1;
+  const std::string m_non_primary_global_image_id;
+  const std::string m_primary_mirror_uuid;
+  bool m_skip_mirror_enable;
+  bool m_negotiate_features = false;
+
+  ContextWQ *m_op_work_queue;
+  Context *m_on_finish;
+
+  CephContext *m_cct;
+  int m_r_saved;  // used to return actual error after cleanup
+  bool m_force_non_primary;
+  file_layout_t m_layout;
+  std::string m_id_obj, m_header_obj, m_objmap_name;
+
+  bufferlist m_outbl;
+  rbd_mirror_mode_t m_mirror_mode;
+  cls::rbd::MirrorImage m_mirror_image_internal;
+
+  void validate_pool();
+  void handle_validate_pool(int r);
+
+  void validate_overwrite();
+  void handle_validate_overwrite(int r);
+
+  void create_id_object();
+  void handle_create_id_object(int r);
+
+  void add_image_to_directory();
+  void handle_add_image_to_directory(int r);
+
+  void negotiate_features();
+  void handle_negotiate_features(int r);
+
+  void create_image();
+  void handle_create_image(int r);
+
+  void set_stripe_unit_count();
+  void handle_set_stripe_unit_count(int r);
+
+  void object_map_resize();
+  void handle_object_map_resize(int r);
+
+  void fetch_mirror_mode();
+  void handle_fetch_mirror_mode(int r);
+
+  void journal_create();
+  void handle_journal_create(int r);
+
+  void mirror_image_enable();
+  void handle_mirror_image_enable(int r);
+
+  void complete(int r);
+
+  // cleanup
+  void journal_remove();
+  void handle_journal_remove(int r);
+
+  void remove_object_map();
+  void handle_remove_object_map(int r);
+
+  void remove_header_object();
+  void handle_remove_header_object(int r);
+
+  void remove_from_dir();
+  void handle_remove_from_dir(int r);
+
+  void remove_id_object();
+  void handle_remove_id_object(int r);
+};
+
+} //namespace image
+} //namespace librbd
+
+extern template class librbd::image::CreateRequest<librbd::ImageCtx>;
+
+#endif // CEPH_LIBRBD_IMAGE_CREATE_REQUEST_H