From: PCzhangPC Date: Fri, 20 Oct 2017 06:21:09 +0000 (+0800) Subject: librbd: cannot clone all image-metas if we have more than 64 key/value pairs X-Git-Tag: v13.0.1~347^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ccc56384032be7f6bd48e28b6825b3ce589c7cf7;p=ceph.git librbd: cannot clone all image-metas if we have more than 64 key/value pairs Signed-off-by: PCzhangPC --- diff --git a/src/librbd/image/CloneRequest.cc b/src/librbd/image/CloneRequest.cc index 3753b94f85f9..a1c30c187db5 100644 --- a/src/librbd/image/CloneRequest.cc +++ b/src/librbd/image/CloneRequest.cc @@ -18,6 +18,8 @@ #undef dout_prefix #define dout_prefix *_dout << "librbd::image::CloneRequest: " +#define MAX_KEYS 64 + namespace librbd { namespace image { @@ -333,10 +335,11 @@ void CloneRequest::handle_refresh(int r) { template void CloneRequest::send_metadata_list() { - ldout(m_cct, 20) << this << " " << __func__ << dendl; + ldout(m_cct, 20) << this << " " << __func__ << ": " + << "start_key=" << m_last_metadata_key << dendl; librados::ObjectReadOperation op; - cls_client::metadata_list_start(&op, "", 0); + cls_client::metadata_list_start(&op, m_last_metadata_key, 0); using klass = CloneRequest; librados::AioCompletion *comp = @@ -351,19 +354,34 @@ template void CloneRequest::handle_metadata_list(int r) { ldout(m_cct, 20) << this << " " << __func__ << " r=" << r << dendl; + map metadata; if (r == 0) { bufferlist::iterator it = m_out_bl.begin(); - r = cls_client::metadata_list_finish(&it, &m_pairs); + r = cls_client::metadata_list_finish(&it, &metadata); } - if (r < 0 && r != -EOPNOTSUPP && r != -EIO) { - lderr(m_cct) << "couldn't list metadata: " << cpp_strerror(r) << dendl; - m_r_saved = r; - send_remove_child(); - } else if (r == 0 && !m_pairs.empty()) { - send_metadata_set(); + if (r < 0) { + if (r == -EOPNOTSUPP || r == -EIO) { + ldout(m_cct, 10) << "config metadata not supported by OSD" << dendl; + get_mirror_mode(); + } else { + lderr(m_cct) << "couldn't list metadata: " << cpp_strerror(r) << dendl; + m_r_saved = r; + send_remove_child(); + } + + return; + } + + if (!metadata.empty()) { + m_pairs.insert(metadata.begin(), metadata.end()); + m_last_metadata_key = m_pairs.rbegin()->first; + } + + if (metadata.size() == MAX_KEYS) { + send_metadata_list(); } else { - get_mirror_mode(); + send_metadata_set(); } } diff --git a/src/librbd/image/CloneRequest.h b/src/librbd/image/CloneRequest.h index e1622eb1d863..01d7750c39e8 100644 --- a/src/librbd/image/CloneRequest.h +++ b/src/librbd/image/CloneRequest.h @@ -103,6 +103,7 @@ private: uint64_t m_p_features; uint64_t m_features; map m_pairs; + std::string m_last_metadata_key; bufferlist m_out_bl; uint64_t m_size; int m_r_saved = 0;