]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd:'rbd image-meta remove' of missing key does not return error 16393/head
authorPCzhangPC <pengcheng.zhang@easystack.cn>
Thu, 27 Jul 2017 03:16:06 +0000 (11:16 +0800)
committerPCzhangPC <pengcheng.zhang@easystack.cn>
Thu, 27 Jul 2017 03:16:06 +0000 (11:16 +0800)
Fixes:http://tracker.ceph.com/issues/16990
Signed-off-by: PCzhangPC <pengcheng.zhang@easystack.cn>
src/librbd/Operations.cc
src/test/librbd/test_librbd.cc
src/tools/rbd/action/ImageMeta.cc

index af0cb1220d465554b35e4d252cd1ad5ebf7f6f3c..3fc256d72ceebf9f685604750b59d85d706e3091 100644 (file)
@@ -1428,6 +1428,11 @@ int Operations<I>::metadata_remove(const std::string &key) {
     return -EROFS;
   }
 
+  std::string value;
+  r = cls_client::metadata_get(&m_image_ctx.md_ctx, m_image_ctx.header_oid, key, &value);
+  if(r < 0)
+    return r;
+
   {
     RWLock::RLocker owner_lock(m_image_ctx.owner_lock);
     C_SaferCond metadata_ctx;
index 99354e93951956696ea7dcbb42846d96ada6a3cf..4e60359ef274efcf9c07f4b50f1bb39485fe1f64 100644 (file)
@@ -4336,7 +4336,7 @@ TEST_F(TestLibRBD, Metadata)
   ASSERT_STREQ(vals + strlen(vals) + 1, "value2");
 
   ASSERT_EQ(0, rbd_metadata_remove(image1, "key1"));
-  ASSERT_EQ(0, rbd_metadata_remove(image1, "key3"));
+  ASSERT_EQ(-ENOENT, rbd_metadata_remove(image1, "key3"));
   value_len = sizeof(value);
   ASSERT_EQ(-ENOENT, rbd_metadata_get(image1, "key3", value, &value_len));
   ASSERT_EQ(0, rbd_metadata_list(image1, "", 0, keys, &keys_len, vals,
@@ -4502,7 +4502,7 @@ TEST_F(TestLibRBD, MetadataPP)
 
   pairs.clear();
   ASSERT_EQ(0, image1.metadata_remove("key1"));
-  ASSERT_EQ(0, image1.metadata_remove("key3"));
+  ASSERT_EQ(-ENOENT, image1.metadata_remove("key3"));
   ASSERT_TRUE(image1.metadata_get("key3", &value) < 0);
   ASSERT_EQ(0, image1.metadata_list("", 0, &pairs));
   ASSERT_EQ(1U, pairs.size());
index d3147ab0e9ca95b7a622798f11a7133cc73d5363..d6dec85f6a99b9c14cab4ee2db58ce94baed211a 100644 (file)
@@ -97,9 +97,12 @@ static int do_metadata_set(librbd::Image& image, const char *key,
 static int do_metadata_remove(librbd::Image& image, const char *key)
 {
   int r = image.metadata_remove(key);
-  if (r < 0) {
-    std::cerr << "failed to remove metadata " << key << " of image : "
-              << cpp_strerror(r) << std::endl;
+  if (r == -ENOENT) {
+      std::cerr << "rbd: no existing metadata key " << key << " of image : "
+                << cpp_strerror(r) << std::endl;
+  } else if(r < 0) {
+      std::cerr << "failed to remove metadata " << key << " of image : "
+                << cpp_strerror(r) << std::endl;
   }
   return r;
 }