]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd:can not copy all image-metas if we have more than 64 key/value pairs
authorPCzhangPC <pengcheng.zhang@easystack.cn>
Mon, 16 Oct 2017 14:46:40 +0000 (22:46 +0800)
committerShinobu Kinjo <shinobu@redhat.com>
Wed, 13 Dec 2017 23:05:39 +0000 (18:05 -0500)
Signed-off-by: PCzhangPC <pengcheng.zhang@easystack.cn>
(cherry picked from commit 71178643b2361557f31094e2490d4124b27cd7ff)

src/librbd/internal.cc

index acbe336629ccd4c52aee6ed94e4e06a533865b30..d2661f37c82b4502b8a5ff87db0eb82c21a8ea32 100644 (file)
@@ -1890,18 +1890,28 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) {
       return -EINVAL;
     }
     int r;
+    const uint32_t MAX_KEYS = 64;
     map<string, bufferlist> pairs;
+    std::string last_key = "";
+    bool more_results = true;
 
-    r = cls_client::metadata_list(&src->md_ctx, src->header_oid, "", 0, &pairs);
-    if (r < 0 && r != -EOPNOTSUPP && r != -EIO) {
-      lderr(cct) << "couldn't list metadata: " << cpp_strerror(r) << dendl;
-      return r;
-    } else if (r == 0 && !pairs.empty()) {
-      r = cls_client::metadata_set(&dest->md_ctx, dest->header_oid, pairs);
-      if (r < 0) {
-        lderr(cct) << "couldn't set metadata: " << cpp_strerror(r) << dendl;
+    while (more_results) {
+      r = cls_client::metadata_list(&src->md_ctx, src->header_oid, last_key, 0, &pairs);
+      if (r < 0 && r != -EOPNOTSUPP && r != -EIO) {
+        lderr(cct) << "couldn't list metadata: " << cpp_strerror(r) << dendl;
         return r;
+      } else if (r == 0 && !pairs.empty()) {
+        r = cls_client::metadata_set(&dest->md_ctx, dest->header_oid, pairs);
+        if (r < 0) {
+          lderr(cct) << "couldn't set metadata: " << cpp_strerror(r) << dendl;
+          return r;
+        }
+
+        last_key = pairs.rbegin()->first;
       }
+
+      more_results = (pairs.size() == MAX_KEYS);
+      pairs.clear();
     }
 
     ZTracer::Trace trace;