X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=ceph%2Fsrc%2Flibrbd%2Fimage%2FCloneRequest.cc;h=a1c30c187db52fdc43a2293f221269afa76c1c9f;hb=b32b81446b3b05102be0267e79203f59329c1d97;hp=3753b94f85f95f160b681466b919b6686da34f7a;hpb=215dd7151453fae88e6f968c975b6ce309d42dcf;p=ceph.git diff --git a/ceph/src/librbd/image/CloneRequest.cc b/ceph/src/librbd/image/CloneRequest.cc index 3753b94f8..a1c30c187 100644 --- a/ceph/src/librbd/image/CloneRequest.cc +++ b/ceph/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(); } }