]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Librbd: Fix incorrect metadata filter behavior 5976/head
authorHaomai Wang <haomai@xsky.com>
Fri, 18 Sep 2015 04:17:53 +0000 (12:17 +0800)
committerHaomai Wang <haomai@xsky.com>
Fri, 18 Sep 2015 09:20:23 +0000 (17:20 +0800)
Signed-off-by: Haomai Wang <haomai@xsky.com>
src/librbd/ImageCtx.cc
src/test/librbd/test_internal.cc

index bbe7fa78db78b9e6b66d96fd0e65957776881fff..c68b45ccf2beb34fc89b303c590ae102728f36be 100644 (file)
@@ -815,9 +815,12 @@ public:
 
     string start = prefix;
     for (map<string, bufferlist>::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<string, bool>::iterator cit = configs.find(key);
       if ( cit != configs.end()) {
index 36a58f5f3551307c192fee5b26119a48409e4c30..bf551165416e6ca632959f3d2c57f6eea1f886a7 100644 (file)
@@ -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<string, bool> 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<string, bool> test_confs = boost::assign::map_list_of(
+    "aaaaaaa", false)(
+    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", false)(
+    "cccccccccccccc", false);
+  map<string, bool>::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<string, bufferlist> 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);