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()) {
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(
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);