From: Haomai Wang Date: Fri, 18 Sep 2015 04:17:53 +0000 (+0800) Subject: Librbd: Fix incorrect metadata filter behavior X-Git-Tag: v9.1.0~96^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4f553b0e2b2b83dcd1a8e69f70ee53a031631883;p=ceph.git Librbd: Fix incorrect metadata filter behavior Signed-off-by: Haomai Wang --- diff --git a/src/librbd/ImageCtx.cc b/src/librbd/ImageCtx.cc index bbe7fa78db78..c68b45ccf2be 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 36a58f5f3551..bf551165416e 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);