<< "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(
: 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);
}
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);
}
};
+ 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;