From f523d7059c2fb3b6a08a3ef4e31e86b84469bdbe Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Tue, 25 Feb 2020 08:54:37 -0500 Subject: [PATCH] librbd: optionally filter internal image-meta when copying/cloning 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 --- src/librbd/api/Config.cc | 5 +++-- src/librbd/api/PoolMetadata.cc | 2 +- src/librbd/deep_copy/MetadataCopyRequest.cc | 2 +- src/librbd/image/GetMetadataRequest.cc | 20 ++++++++++++++----- src/librbd/image/GetMetadataRequest.h | 18 +++++++++-------- src/librbd/image/RefreshRequest.cc | 4 ++-- src/librbd/internal.cc | 2 +- .../test_mock_MetadataCopyRequest.cc | 3 ++- .../librbd/image/test_mock_RefreshRequest.cc | 5 +++-- .../test_mock_ApplyImageStateRequest.cc | 3 ++- .../snapshot/ApplyImageStateRequest.cc | 2 +- 11 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/librbd/api/Config.cc b/src/librbd/api/Config.cc index 3d781d8b03497..174e9a588647e 100644 --- a/src/librbd/api/Config.cc +++ b/src/librbd/api/Config.cc @@ -172,8 +172,9 @@ int Config::list(I *image_ctx, std::vector *options) { std::map pairs; C_SaferCond ctx; auto req = image::GetMetadataRequest::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(); diff --git a/src/librbd/api/PoolMetadata.cc b/src/librbd/api/PoolMetadata.cc index 1449cba9ef31e..ae3d43c696793 100644 --- a/src/librbd/api/PoolMetadata.cc +++ b/src/librbd/api/PoolMetadata.cc @@ -99,7 +99,7 @@ int PoolMetadata::list(librados::IoCtx& io_ctx, const std::string &start, pairs->clear(); C_SaferCond ctx; auto req = image::GetMetadataRequest::create( - io_ctx, RBD_INFO, "", start, max, pairs, &ctx); + io_ctx, RBD_INFO, false, "", start, max, pairs, &ctx); req->send(); int r = ctx.wait(); diff --git a/src/librbd/deep_copy/MetadataCopyRequest.cc b/src/librbd/deep_copy/MetadataCopyRequest.cc index 283e927332d17..c584bea54b809 100644 --- a/src/librbd/deep_copy/MetadataCopyRequest.cc +++ b/src/librbd/deep_copy/MetadataCopyRequest.cc @@ -46,7 +46,7 @@ void MetadataCopyRequest::list_src_metadata() { MetadataCopyRequest, &MetadataCopyRequest::handle_list_src_metadata>(this); auto req = image::GetMetadataRequest::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(); } diff --git a/src/librbd/image/GetMetadataRequest.cc b/src/librbd/image/GetMetadataRequest.cc index a662bcfe92aa2..1410c90058b42 100644 --- a/src/librbd/image/GetMetadataRequest.cc +++ b/src/librbd/image/GetMetadataRequest.cc @@ -19,15 +19,21 @@ namespace librbd { namespace image { +namespace { + +static const std::string INTERNAL_KEY_PREFIX{".rbd"}; + +} // anonymous namespace using util::create_rados_callback; template GetMetadataRequest::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(m_io_ctx.cct())) { @@ -79,7 +85,11 @@ void GetMetadataRequest::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)}); diff --git a/src/librbd/image/GetMetadataRequest.h b/src/librbd/image/GetMetadataRequest.h index c4b883f36a4be..d97ce16107e24 100644 --- a/src/librbd/image/GetMetadataRequest.h +++ b/src/librbd/image/GetMetadataRequest.h @@ -24,17 +24,18 @@ public: typedef std::map 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; diff --git a/src/librbd/image/RefreshRequest.cc b/src/librbd/image/RefreshRequest.cc index 82963c8869306..d5bc63071702e 100644 --- a/src/librbd/image/RefreshRequest.cc +++ b/src/librbd/image/RefreshRequest.cc @@ -500,7 +500,7 @@ void RefreshRequest::send_v2_get_metadata() { auto ctx = create_context_callback< RefreshRequest, &RefreshRequest::handle_v2_get_metadata>(this); auto req = GetMetadataRequest::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::send_v2_get_pool_metadata() { auto ctx = create_context_callback< RefreshRequest, &RefreshRequest::handle_v2_get_pool_metadata>(this); auto req = GetMetadataRequest::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(); } diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index a2900e3111d40..a68405ae26e62 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -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(); diff --git a/src/test/librbd/deep_copy/test_mock_MetadataCopyRequest.cc b/src/test/librbd/deep_copy/test_mock_MetadataCopyRequest.cc index 11dd5158cc2ce..7018f58ce139f 100644 --- a/src/test/librbd/deep_copy/test_mock_MetadataCopyRequest.cc +++ b/src/test/librbd/deep_copy/test_mock_MetadataCopyRequest.cc @@ -33,7 +33,8 @@ struct GetMetadataRequest { 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* pairs, diff --git a/src/test/librbd/image/test_mock_RefreshRequest.cc b/src/test/librbd/image/test_mock_RefreshRequest.cc index bfc9cfe295974..0b35e6c0529b8 100644 --- a/src/test/librbd/image/test_mock_RefreshRequest.cc +++ b/src/test/librbd/image/test_mock_RefreshRequest.cc @@ -46,13 +46,14 @@ struct GetMetadataRequest { 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* 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; diff --git a/src/test/rbd_mirror/image_replayer/snapshot/test_mock_ApplyImageStateRequest.cc b/src/test/rbd_mirror/image_replayer/snapshot/test_mock_ApplyImageStateRequest.cc index 303aedb2cdcf2..f937024eaf5d7 100644 --- a/src/test/rbd_mirror/image_replayer/snapshot/test_mock_ApplyImageStateRequest.cc +++ b/src/test/rbd_mirror/image_replayer/snapshot/test_mock_ApplyImageStateRequest.cc @@ -32,7 +32,8 @@ struct GetMetadataRequest { 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* pairs, diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/ApplyImageStateRequest.cc b/src/tools/rbd_mirror/image_replayer/snapshot/ApplyImageStateRequest.cc index 9a2e4e0687676..b0a0a2c3b3ed4 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/ApplyImageStateRequest.cc +++ b/src/tools/rbd_mirror/image_replayer/snapshot/ApplyImageStateRequest.cc @@ -148,7 +148,7 @@ void ApplyImageStateRequest::get_image_meta() { ApplyImageStateRequest, &ApplyImageStateRequest::handle_get_image_meta>(this); auto req = librbd::image::GetMetadataRequest::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(); } -- 2.39.5