From 8cfbe9c9c136da3c06f7a938276ae4d071006305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Chojnowski?= Date: Thu, 5 May 2022 17:55:06 +0200 Subject: [PATCH 1/2] utils: fragmented_temporary_buffer: add release() Add a release() method to fragmented_temporary_buffer. This method releases the underlying vector to allow for its reuse. --- utils/fragmented_temporary_buffer.hh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/utils/fragmented_temporary_buffer.hh b/utils/fragmented_temporary_buffer.hh index f4f1428ce4..3c09de78b7 100644 --- a/utils/fragmented_temporary_buffer.hh +++ b/utils/fragmented_temporary_buffer.hh @@ -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 { From ddc535a4a2de858748b639927fbc9264011cef7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Chojnowski?= Date: Thu, 5 May 2022 17:55:43 +0200 Subject: [PATCH 2/2] sstables: consumer: reuse the fragmented_temporary_buffer in read_bytes() 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. --- sstables/consumer.hh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sstables/consumer.hh b/sstables/consumer.hh index 378dd934ee..d83da71c99 100644 --- a/sstables/consumer.hh +++ b/sstables/consumer.hh @@ -220,8 +220,9 @@ public: } inline read_status read_bytes(temporary_buffer& data, uint32_t len, fragmented_temporary_buffer& where) { if (data.size() >= len) { - std::vector> 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;