]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: optionally filter internal image-meta when copying/cloning
authorJason Dillaman <dillaman@redhat.com>
Tue, 25 Feb 2020 13:54:37 +0000 (08:54 -0500)
committerJason Dillaman <dillaman@redhat.com>
Thu, 27 Feb 2020 13:22:58 +0000 (08:22 -0500)
Any ".rbd"-prefixed image-meta keys will be considered RBD-internal and
will not be added to the new image when copied/cloned.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/librbd/api/Config.cc
src/librbd/api/PoolMetadata.cc
src/librbd/deep_copy/MetadataCopyRequest.cc
src/librbd/image/GetMetadataRequest.cc
src/librbd/image/GetMetadataRequest.h
src/librbd/image/RefreshRequest.cc
src/librbd/internal.cc
src/test/librbd/deep_copy/test_mock_MetadataCopyRequest.cc
src/test/librbd/image/test_mock_RefreshRequest.cc
src/test/rbd_mirror/image_replayer/snapshot/test_mock_ApplyImageStateRequest.cc
src/tools/rbd_mirror/image_replayer/snapshot/ApplyImageStateRequest.cc

index 3d781d8b034978a6b6a5f8c5cd999c38e4862ca1..174e9a588647ef5272d7d21d6e65e1e0aaebe980 100644 (file)
@@ -172,8 +172,9 @@ int Config<I>::list(I *image_ctx, std::vector<config_option_t> *options) {
   std::map<std::string, bufferlist> pairs;
   C_SaferCond ctx;
   auto req = image::GetMetadataRequest<I>::create(
-    image_ctx->md_ctx, image_ctx->header_oid, ImageCtx::METADATA_CONF_PREFIX,
-    ImageCtx::METADATA_CONF_PREFIX, 0U, &pairs, &ctx);
+    image_ctx->md_ctx, image_ctx->header_oid, true,
+    ImageCtx::METADATA_CONF_PREFIX, ImageCtx::METADATA_CONF_PREFIX, 0U, &pairs,
+    &ctx);
   req->send();
 
   r = ctx.wait();
index 1449cba9ef31e28a653cfdc5fa584fc8440fc4a7..ae3d43c69679313a99cfe423900c76aba0c4aee3 100644 (file)
@@ -99,7 +99,7 @@ int PoolMetadata<I>::list(librados::IoCtx& io_ctx, const std::string &start,
   pairs->clear();
   C_SaferCond ctx;
   auto req = image::GetMetadataRequest<I>::create(
-    io_ctx, RBD_INFO, "", start, max, pairs, &ctx);
+    io_ctx, RBD_INFO, false, "", start, max, pairs, &ctx);
   req->send();
 
   int r = ctx.wait();
index 283e927332d17b3faf58a37a4f6c87a14f3f0c09..c584bea54b8094addfd371a466147b7fa8085ce4 100644 (file)
@@ -46,7 +46,7 @@ void MetadataCopyRequest<I>::list_src_metadata() {
     MetadataCopyRequest<I>,
     &MetadataCopyRequest<I>::handle_list_src_metadata>(this);
   auto req = image::GetMetadataRequest<I>::create(
-    m_src_image_ctx->md_ctx, m_src_image_ctx->header_oid, "",
+    m_src_image_ctx->md_ctx, m_src_image_ctx->header_oid, true, "",
     m_last_metadata_key, MAX_METADATA_ITEMS, &m_metadata, ctx);
   req->send();
 }
index a662bcfe92aa26962357cbb17a931a912899cf29..1410c90058b425d76b4ccfe9490df33cef3a338f 100644 (file)
 
 namespace librbd {
 namespace image {
+namespace {
+
+static const std::string INTERNAL_KEY_PREFIX{".rbd"};
+
+} // anonymous namespace
 
 using util::create_rados_callback;
 
 template <typename I>
 GetMetadataRequest<I>::GetMetadataRequest(
-    IoCtx &io_ctx, const std::string &oid, const std::string& filter,
-    const std::string& last_key, uint32_t max_results,
-    KeyValues* key_values, Context *on_finish)
-  : m_io_ctx(io_ctx), m_oid(oid), m_filter(filter), m_last_key(last_key),
+    IoCtx &io_ctx, const std::string &oid, bool filter_internal,
+    const std::string& filter_key_prefix, const std::string& last_key,
+    uint32_t max_results, KeyValues* key_values, Context *on_finish)
+  : m_io_ctx(io_ctx), m_oid(oid), m_filter_internal(filter_internal),
+    m_filter_key_prefix(filter_key_prefix), m_last_key(last_key),
     m_max_results(max_results), m_key_values(key_values),
     m_on_finish(on_finish),
     m_cct(reinterpret_cast<CephContext*>(m_io_ctx.cct())) {
@@ -79,7 +85,11 @@ void GetMetadataRequest<I>::handle_metadata_list(int r) {
   }
 
   for (auto it = metadata.begin(); it != metadata.end(); ++it) {
-    if (!m_filter.empty() && !boost::starts_with(it->first, m_filter)) {
+    if (m_filter_internal &&
+        boost::starts_with(it->first, INTERNAL_KEY_PREFIX)) {
+      continue;
+    } else if (!m_filter_key_prefix.empty() &&
+               !boost::starts_with(it->first, m_filter_key_prefix)) {
       continue;
     }
     m_key_values->insert({it->first, std::move(it->second)});
index c4b883f36a4be5fd85152c70e2a6e452be6ebe58..d97ce16107e240d90903083ab7f54fcd92bac865 100644 (file)
@@ -24,17 +24,18 @@ public:
   typedef std::map<std::string, bufferlist> KeyValues;
 
   static GetMetadataRequest* create(
-      IoCtx &io_ctx, const std::string &oid, const std::string& filter,
-      const std::string& last_key, uint32_t max_results, KeyValues* key_values,
-      Context *on_finish) {
-    return new GetMetadataRequest(io_ctx, oid, filter, last_key, max_results,
+      IoCtx &io_ctx, const std::string &oid, bool filter_internal,
+      const std::string& filter_key_prefix, const std::string& last_key,
+      uint32_t max_results, KeyValues* key_values, Context *on_finish) {
+    return new GetMetadataRequest(io_ctx, oid, filter_internal,
+                                  filter_key_prefix, last_key, max_results,
                                   key_values, on_finish);
   }
 
   GetMetadataRequest(
-      IoCtx &io_ctx, const std::string &oid, const std::string& filter,
-      const std::string& last_key, uint32_t max_results, KeyValues* key_values,
-      Context *on_finish);
+      IoCtx &io_ctx, const std::string &oid, bool filter_internal,
+      const std::string& filter_key_prefix, const std::string& last_key,
+      uint32_t max_results, KeyValues* key_values, Context *on_finish);
 
   void send();
 
@@ -56,7 +57,8 @@ private:
    */
   librados::IoCtx m_io_ctx;
   std::string m_oid;
-  std::string m_filter;
+  bool m_filter_internal;
+  std::string m_filter_key_prefix;
   std::string m_last_key;
   uint32_t m_max_results;
   KeyValues* m_key_values;
index 82963c8869306c5704a95590bf5b8d5ba829b1bf..d5bc63071702ea6970ef90a77c35c2f880364410 100644 (file)
@@ -500,7 +500,7 @@ void RefreshRequest<I>::send_v2_get_metadata() {
   auto ctx = create_context_callback<
     RefreshRequest<I>, &RefreshRequest<I>::handle_v2_get_metadata>(this);
   auto req = GetMetadataRequest<I>::create(
-    m_image_ctx.md_ctx, m_image_ctx.header_oid,
+    m_image_ctx.md_ctx, m_image_ctx.header_oid, true,
     ImageCtx::METADATA_CONF_PREFIX, ImageCtx::METADATA_CONF_PREFIX, 0U,
     &m_metadata, ctx);
   req->send();
@@ -529,7 +529,7 @@ void RefreshRequest<I>::send_v2_get_pool_metadata() {
   auto ctx = create_context_callback<
     RefreshRequest<I>, &RefreshRequest<I>::handle_v2_get_pool_metadata>(this);
   auto req = GetMetadataRequest<I>::create(
-    m_pool_metadata_io_ctx, RBD_INFO, ImageCtx::METADATA_CONF_PREFIX,
+    m_pool_metadata_io_ctx, RBD_INFO, true, ImageCtx::METADATA_CONF_PREFIX,
     ImageCtx::METADATA_CONF_PREFIX, 0U, &m_metadata, ctx);
   req->send();
 }
index a2900e3111d4049ae8fab38f9ef117743e101420..a68405ae26e62e881a7d99dec187f06d43665998 100644 (file)
@@ -1639,7 +1639,7 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
 
     C_SaferCond ctx;
     auto req = image::GetMetadataRequest<>::create(
-      ictx->md_ctx, ictx->header_oid, "", start, max, pairs, &ctx);
+      ictx->md_ctx, ictx->header_oid, false, "", start, max, pairs, &ctx);
     req->send();
 
     return ctx.wait();
index 11dd5158cc2ce5f5be3fa079794fe517d3a6311f..7018f58ce139fd065371e3e6af1a0522c533626b 100644 (file)
@@ -33,7 +33,8 @@ struct GetMetadataRequest<MockTestImageCtx> {
   static GetMetadataRequest* s_instance;
   static GetMetadataRequest* create(librados::IoCtx&,
                                     const std::string& oid,
-                                    const std::string& filter,
+                                    bool filter_internal,
+                                    const std::string& filter_key_prefix,
                                     const std::string& last_key,
                                     uint32_t max_results,
                                     std::map<std::string, bufferlist>* pairs,
index bfc9cfe2959748f3b9c98ab3cd77bc36e5e100a7..0b35e6c0529b8572eb7936b3084c63af1fa10ca8 100644 (file)
@@ -46,13 +46,14 @@ struct GetMetadataRequest<MockRefreshImageCtx> {
   static GetMetadataRequest* s_instance;
   static GetMetadataRequest* create(librados::IoCtx&,
                                     const std::string& oid,
-                                    const std::string& filter,
+                                    bool filter_internal,
+                                    const std::string& filter_key_prefix,
                                     const std::string& last_key,
                                     uint32_t max_results,
                                     std::map<std::string, bufferlist>* pairs,
                                     Context* on_finish) {
     ceph_assert(s_instance != nullptr);
-    EXPECT_EQ("conf_", filter);
+    EXPECT_EQ("conf_", filter_key_prefix);
     EXPECT_EQ("conf_", last_key);
     s_instance->oid = oid;
     s_instance->pairs = pairs;
index 303aedb2cdcf293ef814b9b7e2f45df275e811d5..f937024eaf5d7056d25296d5e2cdd3d2c321c272 100644 (file)
@@ -32,7 +32,8 @@ struct GetMetadataRequest<MockTestImageCtx> {
   static GetMetadataRequest* s_instance;
   static GetMetadataRequest* create(librados::IoCtx& io_ctx,
                                     const std::string& oid,
-                                    const std::string& filter,
+                                    bool filter_internal,
+                                    const std::string& filter_key_prefix,
                                     const std::string& last_key,
                                     size_t max_results,
                                     std::map<std::string, bufferlist>* pairs,
index 9a2e4e068767630d139b4e87a72483261172bc98..b0a0a2c3b3ed4f783265e0faf57be29171b072a8 100644 (file)
@@ -148,7 +148,7 @@ void ApplyImageStateRequest<I>::get_image_meta() {
     ApplyImageStateRequest<I>,
     &ApplyImageStateRequest<I>::handle_get_image_meta>(this);
   auto req = librbd::image::GetMetadataRequest<I>::create(
-    m_local_image_ctx->md_ctx, m_local_image_ctx->header_oid, "", "", 0U,
+    m_local_image_ctx->md_ctx, m_local_image_ctx->header_oid, true, "", "", 0U,
     &m_metadata, ctx);
   req->send();
 }