Merge ' sstables: consumer: reuse the fragmented_temporary_buffer in read_bytes()' from Michał Chojnowski

primitive_consumer::read_bytes() destroys and creates a vector for every value it reads.
This happens for every cell.
We can save a bit of work by reusing the vector.

Closes #10512

* github.com:scylladb/scylla:
  sstables: consumer: reuse the fragmented_temporary_buffer in read_bytes()
  utils: fragmented_temporary_buffer: add release()
This commit is contained in:
Avi Kivity
2022-05-08 11:26:31 +03:00
2 changed files with 7 additions and 2 deletions

View File

@@ -220,8 +220,9 @@ public:
}
inline read_status read_bytes(temporary_buffer<char>& data, uint32_t len, fragmented_temporary_buffer& where) {
if (data.size() >= len) {
std::vector<temporary_buffer<char>> fragments;
fragments.push_back(data.share(0,len));
auto fragments = std::move(where).release();
fragments.clear();
fragments.push_back(data.share(0, len));
where = fragmented_temporary_buffer(std::move(fragments), len);
data.trim_front(len);
return read_status::ready;

View File

@@ -99,6 +99,10 @@ public:
}
return fragmented_temporary_buffer(std::move(fragments), data_size);
}
vector_type release() && noexcept {
return std::move(_fragments);
}
};
class fragmented_temporary_buffer::view {