From 3c5b19dee40a0d576609a787afef57bb1605e4ac Mon Sep 17 00:00:00 2001 From: Ilya Dryomov Date: Wed, 17 Jul 2024 15:06:33 +0200 Subject: [PATCH] librbd/migration: make SourceSpecBuilder::parse_source_spec() static 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 (cherry picked from commit f172fb97be9a6129be7cdbaa87346dc6c8e8ccb1) --- .../migration/OpenSourceImageRequest.cc | 50 ++++++++++--------- src/librbd/migration/OpenSourceImageRequest.h | 4 +- src/librbd/migration/SourceSpecBuilder.cc | 8 +-- src/librbd/migration/SourceSpecBuilder.h | 8 ++- 4 files changed, 34 insertions(+), 36 deletions(-) diff --git a/src/librbd/migration/OpenSourceImageRequest.cc b/src/librbd/migration/OpenSourceImageRequest.cc index f3a9e7f174d7b..079aaec61facb 100644 --- a/src/librbd/migration/OpenSourceImageRequest.cc +++ b/src/librbd/migration/OpenSourceImageRequest.cc @@ -33,26 +33,8 @@ OpenSourceImageRequest::OpenSourceImageRequest( template void OpenSourceImageRequest::send() { - open_source(); -} - -template -void OpenSourceImageRequest::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::open_source() { << "source_snap_id=" << m_src_snap_id << ", " << "import_only=" << import_only << dendl; - SourceSpecBuilder 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::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 +void OpenSourceImageRequest::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 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; diff --git a/src/librbd/migration/OpenSourceImageRequest.h b/src/librbd/migration/OpenSourceImageRequest.h index 6ad5542eeca61..0f62665d90947 100644 --- a/src/librbd/migration/OpenSourceImageRequest.h +++ b/src/librbd/migration/OpenSourceImageRequest.h @@ -6,6 +6,7 @@ #include "include/rados/librados_fwd.hpp" #include "librbd/Types.h" +#include "json_spirit/json_spirit.h" #include #include @@ -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(); diff --git a/src/librbd/migration/SourceSpecBuilder.cc b/src/librbd/migration/SourceSpecBuilder.cc index b334d8769f760..74b29a11bbad3 100644 --- a/src/librbd/migration/SourceSpecBuilder.cc +++ b/src/librbd/migration/SourceSpecBuilder.cc @@ -30,12 +30,9 @@ const std::string TYPE_KEY{"type"}; template int SourceSpecBuilder::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::parse_source_spec( } } - lderr(cct) << "invalid source-spec JSON" << dendl; return -EBADMSG; } diff --git a/src/librbd/migration/SourceSpecBuilder.h b/src/librbd/migration/SourceSpecBuilder.h index 191cb1cbdd386..58f83139476a7 100644 --- a/src/librbd/migration/SourceSpecBuilder.h +++ b/src/librbd/migration/SourceSpecBuilder.h @@ -7,7 +7,6 @@ #include "include/int_types.h" #include #include -#include #include struct Context; @@ -25,12 +24,12 @@ struct StreamInterface; template 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* format) const; @@ -43,7 +42,6 @@ public: private: ImageCtxT* m_image_ctx; - }; } // namespace migration -- 2.39.5