]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Librbd: Add tests for aware metadata config
authorHaomai Wang <haomaiwang@gmail.com>
Mon, 30 Mar 2015 09:46:42 +0000 (17:46 +0800)
committerHaomai Wang <haomaiwang@gmail.com>
Mon, 30 Mar 2015 10:29:22 +0000 (18:29 +0800)
Signed-off-by: Haomai Wang <haomaiwang@gmail.com>
src/librbd/ImageCtx.cc
src/librbd/ImageCtx.h
src/test/librbd/test_internal.cc

index 9fd209fa1278969b4c1b6377f58a2c4ee7991cda..f884bd4225182be7456131dbffe37857aeaab230 100644 (file)
@@ -811,14 +811,14 @@ namespace librbd {
     size_t conf_prefix_len = prefix.size();
 
     string start = prefix;
-    int r = 0, j = 0;
     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.size() <= conf_prefix_len || it->first.compare(0, conf_prefix_len, prefix))
         return false;
 
-      for (int i = 0; i < len; ++i) {
-        if (!it->first.compare(conf_prefix_len, it->first.size() - conf_prefix_len, configs[i])) {
-          res->insert(make_pair(it->first, it->second));
+      for (size_t i = 0; i < len; ++i) {
+        string key = it->first.substr(conf_prefix_len, it->first.size() - conf_prefix_len);
+        if (!key.compare(configs[i])) {
+          res->insert(make_pair(key, it->second));
           break;
         }
       }
@@ -841,7 +841,6 @@ namespace librbd {
       "rbd_balance_snap_reads"
     };
     static uint64_t max_conf_items = 128;
-    size_t conf_prefix_len = METADATA_CONF_PREFIX.size();
 
     string start = METADATA_CONF_PREFIX;
     int r = 0, j = 0;
@@ -853,6 +852,8 @@ namespace librbd {
         lderr(cct) << __func__ << " couldn't list conf metadatas: " << r << dendl;
         break;
       }
+      if (pairs.empty())
+        break;
       
       is_continue = _aware_metadata_confs(METADATA_CONF_PREFIX, aware_confs, sizeof(aware_confs) / sizeof(char*),
                                           pairs, &res);
index 7e883f8371bb27d7659fd516ab92c84b4db6bcc9..45ab38b79229671364b6e9bead95e17146a10ab8 100644 (file)
@@ -210,6 +210,7 @@ namespace librbd {
     void aware_metadata_confs();
     static bool _aware_metadata_confs(const string &prefix, const char **configs, size_t len,
                                       map<string, bufferlist> &pairs, map<string, bufferlist> *res);
+  };
 }
 
 #endif
index a6d1bcf529f21443b6f59c71d9bad1a6e5d444dd..7a4b7cbd03b39a416b2eb22258112458f7c1bf67 100644 (file)
@@ -361,3 +361,40 @@ TEST_F(TestInternal, MultipleResize) {
   ASSERT_EQ(0, librbd::get_size(ictx, &size));
   ASSERT_EQ(0U, size);
 }
+
+TEST_F(TestInternal, MetadatConfig) {
+  REQUIRE_FEATURE(RBD_FEATURE_LAYERING);
+
+  const char *test_confs[] = {
+    "aaaaaaa",
+    "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+    "cccccccccccccc",
+  };
+  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[prefix+test_confs[0]].append("value1");
+  pairs[prefix+test_confs[1]].append("value2");
+  pairs[prefix+test_confs[2]].append("value3");
+  pairs[prefix+"asdfsdaf"].append("value6");
+  pairs[prefix+"zxvzxcv123"].append("value5");
+
+  is_continue = ictx->_aware_metadata_confs(prefix, test_confs, sizeof(test_confs) / sizeof(char*),
+                                            pairs, &res);
+  ASSERT_TRUE(is_continue);
+  ASSERT_TRUE(res.size() == 3U);
+  ASSERT_TRUE(res.count(test_confs[0]));
+  ASSERT_TRUE(res.count(test_confs[1]));
+  ASSERT_TRUE(res.count(test_confs[2]));
+  res.clear();
+
+  pairs["zzzzzzzz"].append("value7");
+  is_continue = ictx->_aware_metadata_confs(prefix, test_confs, sizeof(test_confs) / sizeof(char*),
+                                            pairs, &res);
+  ASSERT_FALSE(is_continue);
+  ASSERT_TRUE(res.size() == 3U);
+}