]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
librbd: allow to provide sparse read result
authorMykola Golub <mgolub@suse.com>
Tue, 7 May 2019 05:39:25 +0000 (06:39 +0100)
committerMykola Golub <mgolub@suse.com>
Thu, 9 May 2019 17:19:21 +0000 (18:19 +0100)
Signed-off-by: Mykola Golub <mgolub@suse.com>
src/librbd/io/ReadResult.cc
src/librbd/io/ReadResult.h

index 8ce351c618a8dd9bad602aef56d08a52cb8ef6f2..dbf8ef48c3e3d402fbece8bbb386c901f8455187 100644 (file)
@@ -77,6 +77,18 @@ struct ReadResult::AssembleResultVisitor : public boost::static_visitor<void> {
                    << "bytes to bl " << reinterpret_cast<void*>(bufferlist.bl)
                    << dendl;
   }
+
+  void operator()(SparseBufferlist &sparse_bufferlist) const {
+    sparse_bufferlist.extent_map->clear();
+    sparse_bufferlist.bl->clear();
+    destriper.assemble_result(cct, sparse_bufferlist.extent_map,
+                              sparse_bufferlist.bl);
+
+    ldout(cct, 20) << "moved resulting " << sparse_bufferlist.extent_map->size()
+                   << " extents of total " << sparse_bufferlist.bl->length()
+                   << " bytes to bl "
+                   << reinterpret_cast<void*>(sparse_bufferlist.bl) << dendl;
+  }
 };
 
 ReadResult::C_ImageReadRequest::C_ImageReadRequest(
@@ -157,6 +169,11 @@ ReadResult::ReadResult(ceph::bufferlist *bl)
   : m_buffer(Bufferlist(bl)) {
 }
 
+ReadResult::ReadResult(std::map<uint64_t, uint64_t> *extent_map,
+                       ceph::bufferlist *bl)
+  : m_buffer(SparseBufferlist(extent_map, bl)) {
+}
+
 void ReadResult::set_clip_length(size_t length) {
   boost::apply_visitor(SetClipLengthVisitor(length), m_buffer);
 }
index 6fb5e4a4c18f26ced445a65231401d90f7a1e370..9efdcb0105cd5dddcc243cf662f6b8cca208822b 100644 (file)
@@ -55,6 +55,7 @@ public:
   ReadResult(char *buf, size_t buf_len);
   ReadResult(const struct iovec *iov, int iov_count);
   ReadResult(ceph::bufferlist *bl);
+  ReadResult(std::map<uint64_t, uint64_t> *extent_map, ceph::bufferlist *bl);
 
   void set_clip_length(size_t length);
   void assemble_result(CephContext *cct);
@@ -87,10 +88,21 @@ private:
     }
   };
 
+  struct SparseBufferlist {
+    std::map<uint64_t, uint64_t> *extent_map;
+    ceph::bufferlist *bl;
+
+    SparseBufferlist(std::map<uint64_t, uint64_t> *extent_map,
+                     ceph::bufferlist *bl)
+      : extent_map(extent_map), bl(bl) {
+    }
+  };
+
   typedef boost::variant<Empty,
                          Linear,
                          Vector,
-                         Bufferlist> Buffer;
+                         Bufferlist,
+                         SparseBufferlist> Buffer;
   struct SetClipLengthVisitor;
   struct AssembleResultVisitor;