]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: cannot clone all image-metas if we have more than 64 key/value pairs
authorPCzhangPC <pengcheng.zhang@easystack.cn>
Fri, 20 Oct 2017 06:21:09 +0000 (14:21 +0800)
committerPCzhangPC <pengcheng.zhang@easystack.cn>
Fri, 20 Oct 2017 06:21:09 +0000 (14:21 +0800)
Signed-off-by: PCzhangPC <pengcheng.zhang@easystack.cn>
src/librbd/image/CloneRequest.cc
src/librbd/image/CloneRequest.h

index 3753b94f85f95f160b681466b919b6686da34f7a..a1c30c187db52fdc43a2293f221269afa76c1c9f 100644 (file)
@@ -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<I>::handle_refresh(int r) {
 
 template <typename I>
 void CloneRequest<I>::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<I>;
   librados::AioCompletion *comp =
@@ -351,19 +354,34 @@ template <typename I>
 void CloneRequest<I>::handle_metadata_list(int r) {
   ldout(m_cct, 20) << this << " " << __func__ << " r=" << r << dendl;
 
+  map<string, bufferlist> 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();
   }
 }
 
index e1622eb1d863497e3338d18e3892a24ae300fd7b..01d7750c39e851e58e874381138dc8a8d5e0bc3a 100644 (file)
@@ -103,6 +103,7 @@ private:
   uint64_t m_p_features;
   uint64_t m_features;
   map<string, bufferlist> m_pairs;
+  std::string m_last_metadata_key;
   bufferlist m_out_bl;
   uint64_t m_size;
   int m_r_saved = 0;