From: PCzhangPC Date: Mon, 16 Oct 2017 14:46:40 +0000 (+0800) Subject: rbd:can not copy all image-metas if we have more than 64 key/value pairs X-Git-Tag: v13.0.1~386^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=71178643b2361557f31094e2490d4124b27cd7ff;p=ceph.git rbd:can not copy all image-metas if we have more than 64 key/value pairs Signed-off-by: PCzhangPC --- diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 9b322997014d..cda39a24eca8 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -1900,18 +1900,28 @@ int validate_pool(IoCtx &io_ctx, CephContext *cct) { return -EINVAL; } int r; + const uint32_t MAX_KEYS = 64; map 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;