]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd/migration: allow native v2 images to be opened by name
authorJason Dillaman <dillaman@redhat.com>
Fri, 30 Oct 2020 14:27:32 +0000 (10:27 -0400)
committerJason Dillaman <dillaman@redhat.com>
Sun, 1 Nov 2020 14:22:38 +0000 (09:22 -0500)
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 <dillaman@redhat.com>
src/librbd/api/Migration.cc
src/librbd/migration/NativeFormat.cc
src/librbd/migration/NativeFormat.h
src/librbd/migration/OpenSourceImageRequest.cc
src/librbd/migration/SourceSpecBuilder.cc
src/librbd/migration/SourceSpecBuilder.h

index 8093b78b3716830ff61ca9fab9c758a1a90175f2..51d5602b73f7f962d09740badaf6675f746773f4 100644 (file)
@@ -546,7 +546,7 @@ int Migration<I>::prepare_import(
   }
 
   std::unique_ptr<migration::FormatInterface> 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;
index cb3b5164abb2b2e07228ae0b54b2e3b193bcbaed..e15e2820f38fa721d845e0c8cbf40b1a21960a6d 100644 (file)
@@ -47,8 +47,9 @@ std::string NativeFormat<I>::build_source_spec(
 
 template <typename I>
 NativeFormat<I>::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 <typename I>
@@ -103,7 +104,7 @@ void NativeFormat<I>::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;
index d91fbf77b6352dbb10c71db52a742c4d21eaab72..0b2406ecbc83b15f8db2d335cbdc66723e6e52ed 100644 (file)
@@ -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;
index eb480644426dd3f2c47ac09143ef4eb55910d60e..499525395d3cb730845647a8dab4c5a0aa510275 100644 (file)
@@ -54,12 +54,14 @@ void OpenSourceImageRequest<I>::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<I>::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<I> source_spec_builder{src_image_ctx};
@@ -73,7 +75,8 @@ void OpenSourceImageRequest<I>::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;
index 2b8d0a3885fa9c733431ec4df2556f1681d0e027..99c5e10c0cd27d4607cb08d8a99e127b5f1aa1ba 100644 (file)
@@ -45,7 +45,7 @@ int SourceSpecBuilder<I>::parse_source_spec(
 
 template <typename I>
 int SourceSpecBuilder<I>::build_format(
-    const json_spirit::mObject& source_spec_object,
+    const json_spirit::mObject& source_spec_object, bool import_only,
     std::unique_ptr<FormatInterface>* format) const {
   auto cct = m_image_ctx->cct;
   ldout(cct, 10) << dendl;
@@ -59,7 +59,8 @@ int SourceSpecBuilder<I>::build_format(
 
   auto& type = type_value_it->second.get_str();
   if (type == "native") {
-    format->reset(NativeFormat<I>::create(m_image_ctx, source_spec_object));
+    format->reset(NativeFormat<I>::create(m_image_ctx, source_spec_object,
+                                          import_only));
   } else if (type == "raw") {
     format->reset(RawFormat<I>::create(m_image_ctx, source_spec_object, this));
   } else {
index be32c5dc031c8560c429fec779a008dd6e348c59..3948ca0300424eb37fac344807c7d73aa5659711 100644 (file)
@@ -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<FormatInterface>* format) const;
 
   int build_stream(const json_spirit::mObject& source_spec_object,