From: Jason Dillaman Date: Fri, 30 Oct 2020 14:27:32 +0000 (-0400) Subject: librbd/migration: allow native v2 images to be opened by name X-Git-Tag: v16.1.0~702^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8a9f6dde28e66ce84626f2a46d5e59dd55140e83;p=ceph.git librbd/migration: allow native v2 images to be opened by name When in import-only mode, allow the source image to be opened by name in case it's a V2 image format w/o its image id specified in the JSON. Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/api/Migration.cc b/src/librbd/api/Migration.cc index 8093b78b3716..51d5602b73f7 100644 --- a/src/librbd/api/Migration.cc +++ b/src/librbd/api/Migration.cc @@ -546,7 +546,7 @@ int Migration::prepare_import( } std::unique_ptr format; - r = source_spec_builder.build_format(source_spec_object, &format); + r = source_spec_builder.build_format(source_spec_object, true, &format); if (r < 0) { lderr(cct) << "failed to build migration format handler: " << cpp_strerror(r) << dendl; diff --git a/src/librbd/migration/NativeFormat.cc b/src/librbd/migration/NativeFormat.cc index cb3b5164abb2..e15e2820f38f 100644 --- a/src/librbd/migration/NativeFormat.cc +++ b/src/librbd/migration/NativeFormat.cc @@ -47,8 +47,9 @@ std::string NativeFormat::build_source_spec( template NativeFormat::NativeFormat( - I* image_ctx, const json_spirit::mObject& json_object) - : m_image_ctx(image_ctx), m_json_object(json_object) { + I* image_ctx, const json_spirit::mObject& json_object, bool import_only) + : m_image_ctx(image_ctx), m_json_object(json_object), + m_import_only(import_only) { } template @@ -103,7 +104,7 @@ void NativeFormat::open(Context* on_finish) { m_image_ctx->name = m_image_name; uint64_t flags = 0; - if (m_image_id.empty()) { + if (m_image_id.empty() && !m_import_only) { flags |= OPEN_FLAG_OLD_FORMAT; } else { m_image_ctx->id = m_image_id; diff --git a/src/librbd/migration/NativeFormat.h b/src/librbd/migration/NativeFormat.h index d91fbf77b635..0b2406ecbc83 100644 --- a/src/librbd/migration/NativeFormat.h +++ b/src/librbd/migration/NativeFormat.h @@ -28,11 +28,13 @@ public: const std::string& image_id); static NativeFormat* create(ImageCtxT* image_ctx, - const json_spirit::mObject& json_object) { - return new NativeFormat(image_ctx, json_object); + const json_spirit::mObject& json_object, + bool import_only) { + return new NativeFormat(image_ctx, json_object, import_only); } - NativeFormat(ImageCtxT* image_ctx, const json_spirit::mObject& json_object); + NativeFormat(ImageCtxT* image_ctx, const json_spirit::mObject& json_object, + bool import_only); NativeFormat(const NativeFormat&) = delete; NativeFormat& operator=(const NativeFormat&) = delete; @@ -58,6 +60,7 @@ public: private: ImageCtxT* m_image_ctx; json_spirit::mObject m_json_object; + bool m_import_only; int64_t m_pool_id = -1; std::string m_pool_namespace; diff --git a/src/librbd/migration/OpenSourceImageRequest.cc b/src/librbd/migration/OpenSourceImageRequest.cc index eb480644426d..499525395d3c 100644 --- a/src/librbd/migration/OpenSourceImageRequest.cc +++ b/src/librbd/migration/OpenSourceImageRequest.cc @@ -54,12 +54,14 @@ void OpenSourceImageRequest::open_source() { 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()) { // implies legacy migration from RBD image in same cluster source_spec = NativeFormat::build_source_spec( m_migration_info.pool_id, m_migration_info.pool_namespace, m_migration_info.image_name, m_migration_info.image_id); + import_only = false; } SourceSpecBuilder source_spec_builder{src_image_ctx}; @@ -73,7 +75,8 @@ void OpenSourceImageRequest::open_source() { return; } - r = source_spec_builder.build_format(source_spec_object, &m_format); + r = source_spec_builder.build_format(source_spec_object, import_only, + &m_format); if (r < 0) { lderr(cct) << "failed to build migration format handler: " << cpp_strerror(r) << dendl; diff --git a/src/librbd/migration/SourceSpecBuilder.cc b/src/librbd/migration/SourceSpecBuilder.cc index 2b8d0a3885fa..99c5e10c0cd2 100644 --- a/src/librbd/migration/SourceSpecBuilder.cc +++ b/src/librbd/migration/SourceSpecBuilder.cc @@ -45,7 +45,7 @@ int SourceSpecBuilder::parse_source_spec( template int SourceSpecBuilder::build_format( - const json_spirit::mObject& source_spec_object, + const json_spirit::mObject& source_spec_object, bool import_only, std::unique_ptr* format) const { auto cct = m_image_ctx->cct; ldout(cct, 10) << dendl; @@ -59,7 +59,8 @@ int SourceSpecBuilder::build_format( auto& type = type_value_it->second.get_str(); if (type == "native") { - format->reset(NativeFormat::create(m_image_ctx, source_spec_object)); + format->reset(NativeFormat::create(m_image_ctx, source_spec_object, + import_only)); } else if (type == "raw") { format->reset(RawFormat::create(m_image_ctx, source_spec_object, this)); } else { diff --git a/src/librbd/migration/SourceSpecBuilder.h b/src/librbd/migration/SourceSpecBuilder.h index be32c5dc031c..3948ca030042 100644 --- a/src/librbd/migration/SourceSpecBuilder.h +++ b/src/librbd/migration/SourceSpecBuilder.h @@ -30,7 +30,7 @@ public: 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, + int build_format(const json_spirit::mObject& format_object, bool import_only, std::unique_ptr* format) const; int build_stream(const json_spirit::mObject& source_spec_object,