Reduce VABC memory usage
BlockExtentWriter caches data in memory up until get gets a complete
extent. For full OTAs, extents are chopped to 2MB chunks. But for
incremental OTAs, extents can be as large as single file size. We have
observed a single extent to span >100MB disk space on pixel. This incurs
significant memory overhead depending on layout of file system image.
To reduce VABC memory usage, bound memory cache by 1MB
Test: th
Bug: 279305177
Change-Id: I75dbdd60f7e9939fc0fcabe7510fc7ff800087be
diff --git a/payload_consumer/block_extent_writer.h b/payload_consumer/block_extent_writer.h
index 902e3e1..eeae36d 100644
--- a/payload_consumer/block_extent_writer.h
+++ b/payload_consumer/block_extent_writer.h
@@ -28,6 +28,7 @@
// Cache data upto size of one extent before writing.
class BlockExtentWriter : public chromeos_update_engine::ExtentWriter {
public:
+ static constexpr size_t BUFFER_SIZE = 1024 * 1024;
BlockExtentWriter() = default;
~BlockExtentWriter() = default;
// Returns true on success.
@@ -44,15 +45,18 @@
size_t BlockSize() const { return block_size_; }
private:
+ bool WriteExtent(const void* bytes, size_t count);
bool NextExtent();
- [[nodiscard]] size_t ConsumeWithBuffer(const uint8_t* bytes, size_t count);
+ [[nodiscard]] size_t ConsumeWithBuffer(const uint8_t* const bytes,
+ const size_t count);
// It's a non-owning pointer, because PartitionWriter owns the CowWruter. This
// allows us to use a single instance of CowWriter for all operations applied
// to the same partition.
google::protobuf::RepeatedPtrField<Extent> extents_;
- size_t cur_extent_idx_;
+ size_t cur_extent_idx_{};
std::vector<uint8_t> buffer_;
- size_t block_size_;
+ size_t block_size_{};
+ size_t offset_in_extent_{};
};
} // namespace chromeos_update_engine