From 4f553b0e2b2b83dcd1a8e69f70ee53a031631883 Mon Sep 17 00:00:00 2001 From: Haomai Wang Date: Fri, 18 Sep 2015 12:17:53 +0800 Subject: [PATCH] Librbd: Fix incorrect metadata filter behavior Signed-off-by: Haomai Wang --- src/librbd/ImageCtx.cc | 5 +++- src/test/librbd/test_internal.cc | 47 +++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index bbe7fa78db78b..c68b45ccf2beb 100644 --- a/src/librbd/ImageCtx.cc +++ b/src/librbd/ImageCtx.cc @@ -815,9 +815,12 @@ public: string start = prefix; for (map::iterator it = pairs.begin(); it != pairs.end(); ++it) { - if (it->first.size() <= conf_prefix_len || it->first.compare(0, conf_prefix_len, prefix)) + if (it->first.compare(0, MIN(conf_prefix_len, it->first.size()), prefix) > 0) return false; + if (it->first.size() <= conf_prefix_len) + continue; + string key = it->first.substr(conf_prefix_len, it->first.size() - conf_prefix_len); map::iterator cit = configs.find(key); if ( cit != configs.end()) { diff --git a/src/test/librbd/test_internal.cc b/src/test/librbd/test_internal.cc index 36a58f5f35513..bf551165416e6 100644 --- a/src/test/librbd/test_internal.cc +++ b/src/test/librbd/test_internal.cc @@ -369,7 +369,7 @@ TEST_F(TestInternal, MultipleResize) { ASSERT_EQ(0U, size); } -TEST_F(TestInternal, MetadatConfig) { +TEST_F(TestInternal, Metadata) { REQUIRE_FEATURE(RBD_FEATURE_LAYERING); map test_confs = boost::assign::map_list_of( @@ -411,6 +411,51 @@ TEST_F(TestInternal, MetadatConfig) { ASSERT_STREQ(val.c_str(), "value3"); } +TEST_F(TestInternal, MetadataFilter) { + REQUIRE_FEATURE(RBD_FEATURE_LAYERING); + + map test_confs = boost::assign::map_list_of( + "aaaaaaa", false)( + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", false)( + "cccccccccccccc", false); + map::iterator it = test_confs.begin(); + const string prefix = "test_config_"; + bool is_continue; + librbd::ImageCtx *ictx; + ASSERT_EQ(0, open_image(m_image_name, &ictx)); + + librbd::Image image1; + map pairs, res; + pairs["abc"].append("value"); + pairs["abcabc"].append("value"); + pairs[prefix+it->first].append("value1"); + ++it; + pairs[prefix+it->first].append("value2"); + ++it; + pairs[prefix+it->first].append("value3"); + pairs[prefix+"asdfsdaf"].append("value6"); + pairs[prefix+"zxvzxcv123"].append("value5"); + + is_continue = ictx->_filter_metadata_confs(prefix, test_confs, pairs, &res); + ASSERT_TRUE(is_continue); + ASSERT_TRUE(res.size() == 3U); + it = test_confs.begin(); + ASSERT_TRUE(res.count(it->first)); + ASSERT_TRUE(it->second); + ++it; + ASSERT_TRUE(res.count(it->first)); + ASSERT_TRUE(it->second); + ++it; + ASSERT_TRUE(res.count(it->first)); + ASSERT_TRUE(it->second); + res.clear(); + + pairs["zzzzzzzz"].append("value7"); + is_continue = ictx->_filter_metadata_confs(prefix, test_confs, pairs, &res); + ASSERT_FALSE(is_continue); + ASSERT_TRUE(res.size() == 3U); +} + TEST_F(TestInternal, SnapshotCopyup) { REQUIRE_FEATURE(RBD_FEATURE_LAYERING); -- 2.47.3