]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd/migration: make SourceSpecBuilder::parse_source_spec() static
authorIlya Dryomov <idryomov@gmail.com>
Wed, 17 Jul 2024 13:06:33 +0000 (15:06 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Tue, 30 Jul 2024 21:05:51 +0000 (23:05 +0200)
In preparation for divorcing NativeFormat from FormatInterface and
changing when/how src_image_ctx is created, make parse_source_spec()
independent of src_image_ctx.  The "invalid source-spec JSON" error is
duplicated by the "failed to parse migration source-spec" error, so
just get rid of the former to spare having to pass CephContext to
parse_source_spec().

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
src/librbd/migration/OpenSourceImageRequest.cc
src/librbd/migration/OpenSourceImageRequest.h
src/librbd/migration/SourceSpecBuilder.cc
src/librbd/migration/SourceSpecBuilder.h

index f3a9e7f174d7bb10cd8073968fbbb2174678542a..079aaec61facbc11166004f6d26bfdc8431982a5 100644 (file)
@@ -33,26 +33,8 @@ OpenSourceImageRequest<I>::OpenSourceImageRequest(
 
 template <typename I>
 void OpenSourceImageRequest<I>::send() {
-  open_source();
-}
-
-template <typename I>
-void OpenSourceImageRequest<I>::open_source() {
   ldout(m_cct, 10) << dendl;
 
-  // note that all source image ctx properties are placeholders
-  *m_src_image_ctx = I::create("", "", CEPH_NOSNAP, m_dst_io_ctx, true);
-  auto src_image_ctx = *m_src_image_ctx;
-  src_image_ctx->child = m_dst_image_ctx;
-
-  // use default layout values (can be overridden by source layers later)
-  src_image_ctx->order = 22;
-  src_image_ctx->layout = file_layout_t();
-  src_image_ctx->layout.stripe_count = 1;
-  src_image_ctx->layout.stripe_unit = 1ULL << src_image_ctx->order;
-  src_image_ctx->layout.object_size = 1Ull << src_image_ctx->order;
-  src_image_ctx->layout.pool_id = -1;
-
   bool import_only = true;
   auto source_spec = m_migration_info.source_spec;
   if (source_spec.empty()) {
@@ -67,20 +49,40 @@ void OpenSourceImageRequest<I>::open_source() {
                    << "source_snap_id=" << m_src_snap_id << ", "
                    << "import_only=" << import_only << dendl;
 
-  SourceSpecBuilder<I> source_spec_builder{src_image_ctx};
   json_spirit::mObject source_spec_object;
-  int r = source_spec_builder.parse_source_spec(source_spec,
-                                                &source_spec_object);
+  int r = SourceSpecBuilder<I>::parse_source_spec(source_spec,
+                                                  &source_spec_object);
   if (r < 0) {
     lderr(m_cct) << "failed to parse migration source-spec: "
                  << cpp_strerror(r) << dendl;
-    (*m_src_image_ctx)->state->close();
     finish(r);
     return;
   }
 
-  r = source_spec_builder.build_format(source_spec_object, import_only,
-                                       &m_format);
+  open_source(source_spec_object, import_only);
+}
+
+template <typename I>
+void OpenSourceImageRequest<I>::open_source(
+    const json_spirit::mObject& source_spec_object, bool import_only) {
+  ldout(m_cct, 10) << dendl;
+
+  // note that all source image ctx properties are placeholders
+  *m_src_image_ctx = I::create("", "", CEPH_NOSNAP, m_dst_io_ctx, true);
+  auto src_image_ctx = *m_src_image_ctx;
+  src_image_ctx->child = m_dst_image_ctx;
+
+  // use default layout values (can be overridden by source layers later)
+  src_image_ctx->order = 22;
+  src_image_ctx->layout = file_layout_t();
+  src_image_ctx->layout.stripe_count = 1;
+  src_image_ctx->layout.stripe_unit = 1ULL << src_image_ctx->order;
+  src_image_ctx->layout.object_size = 1Ull << src_image_ctx->order;
+  src_image_ctx->layout.pool_id = -1;
+
+  SourceSpecBuilder<I> source_spec_builder{src_image_ctx};
+  int r = source_spec_builder.build_format(source_spec_object, import_only,
+                                           &m_format);
   if (r < 0) {
     lderr(m_cct) << "failed to build migration format handler: "
                  << cpp_strerror(r) << dendl;
index 6ad5542eeca611126da18eaa92febe08ab1f2ec0..0f62665d9094789e6bea828e0631a0049d1c2dbc 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "include/rados/librados_fwd.hpp"
 #include "librbd/Types.h"
+#include "json_spirit/json_spirit.h"
 #include <map>
 #include <memory>
 
@@ -78,7 +79,8 @@ private:
   uint64_t m_image_size = 0;
   SnapInfos m_snap_infos;
 
-  void open_source();
+  void open_source(const json_spirit::mObject& source_spec_object,
+                   bool import_only);
   void handle_open_source(int r);
 
   void get_image_size();
index b334d8769f76066292ed37eb2f6765c4d6385384..74b29a11bbad3679efcdbbf58fbcb3ccc11eda5a 100644 (file)
@@ -30,12 +30,9 @@ const std::string TYPE_KEY{"type"};
 template <typename I>
 int SourceSpecBuilder<I>::parse_source_spec(
     const std::string& source_spec,
-    json_spirit::mObject* source_spec_object) const {
-  auto cct = m_image_ctx->cct;
-  ldout(cct, 10) << dendl;
-
+    json_spirit::mObject* source_spec_object) {
   json_spirit::mValue json_root;
-  if(json_spirit::read(source_spec, json_root)) {
+  if (json_spirit::read(source_spec, json_root)) {
     try {
       *source_spec_object = json_root.get_obj();
       return 0;
@@ -43,7 +40,6 @@ int SourceSpecBuilder<I>::parse_source_spec(
     }
   }
 
-  lderr(cct) << "invalid source-spec JSON" << dendl;
   return -EBADMSG;
 }
 
index 191cb1cbdd386eb713fe7ef2876e208e3414a8d6..58f83139476a7039e819c6942f0818a299c52e95 100644 (file)
@@ -7,7 +7,6 @@
 #include "include/int_types.h"
 #include <json_spirit/json_spirit.h>
 #include <memory>
-#include <optional>
 #include <string>
 
 struct Context;
@@ -25,12 +24,12 @@ struct StreamInterface;
 template <typename ImageCtxT>
 class SourceSpecBuilder {
 public:
+  static int parse_source_spec(const std::string& source_spec,
+                               json_spirit::mObject* source_spec_object);
+
   SourceSpecBuilder(ImageCtxT* image_ctx) : m_image_ctx(image_ctx) {
   }
 
-  int parse_source_spec(const std::string& source_spec,
-                        json_spirit::mObject* source_spec_object) const;
-
   int build_format(const json_spirit::mObject& format_object, bool import_only,
                    std::unique_ptr<FormatInterface>* format) const;
 
@@ -43,7 +42,6 @@ public:
 
 private:
   ImageCtxT* m_image_ctx;
-
 };
 
 } // namespace migration