From f6e760bfad39f36c0c60e0864a8f113ab9c4970c Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Sat, 15 Mar 2025 09:43:21 +0100 Subject: [PATCH] refactor: explicitly handle release_until() return value --- include/dwarfs/writer/internal/chunkable.h | 3 ++- include/dwarfs/writer/internal/fragment_chunkable.h | 2 +- src/writer/internal/entry.cpp | 2 ++ src/writer/internal/fragment_chunkable.cpp | 4 ++-- src/writer/internal/inode_manager.cpp | 2 ++ src/writer/segmenter.cpp | 5 ++++- test/segmenter_benchmark.cpp | 2 +- 7 files changed, 14 insertions(+), 6 deletions(-) diff --git a/include/dwarfs/writer/internal/chunkable.h b/include/dwarfs/writer/internal/chunkable.h index 67cf5753..36e7076e 100644 --- a/include/dwarfs/writer/internal/chunkable.h +++ b/include/dwarfs/writer/internal/chunkable.h @@ -23,6 +23,7 @@ #include #include +#include namespace dwarfs { @@ -39,7 +40,7 @@ class chunkable { virtual std::string description() const = 0; virtual std::span span() const = 0; virtual void add_chunk(size_t block, size_t offset, size_t size) = 0; - virtual void release_until(size_t offset) = 0; + virtual std::error_code release_until(size_t offset) = 0; }; } // namespace writer::internal diff --git a/include/dwarfs/writer/internal/fragment_chunkable.h b/include/dwarfs/writer/internal/fragment_chunkable.h index 2fcb1c7b..b25a9c94 100644 --- a/include/dwarfs/writer/internal/fragment_chunkable.h +++ b/include/dwarfs/writer/internal/fragment_chunkable.h @@ -50,7 +50,7 @@ class fragment_chunkable : public chunkable { std::string description() const override; std::span span() const override; void add_chunk(size_t block, size_t offset, size_t size) override; - void release_until(size_t offset) override; + std::error_code release_until(size_t offset) override; private: inode const& ino_; diff --git a/src/writer/internal/entry.cpp b/src/writer/internal/entry.cpp index af48219b..8b912f78 100644 --- a/src/writer/internal/entry.cpp +++ b/src/writer/internal/entry.cpp @@ -264,6 +264,8 @@ void file::scan(mmif* mm, progress& prog, while (s >= chunk_size) { cs.update(mm->as(offset), chunk_size); + // release_until() is best-effort, we can ignore the return value + // NOLINTNEXTLINE(bugprone-unused-return-value) mm->release_until(offset); offset += chunk_size; s -= chunk_size; diff --git a/src/writer/internal/fragment_chunkable.cpp b/src/writer/internal/fragment_chunkable.cpp index 620c514d..6a288515 100644 --- a/src/writer/internal/fragment_chunkable.cpp +++ b/src/writer/internal/fragment_chunkable.cpp @@ -61,8 +61,8 @@ void fragment_chunkable::add_chunk(size_t block, size_t offset, size_t size) { frag_.add_chunk(block, offset, size); } -void fragment_chunkable::release_until(size_t offset) { - mm_.release_until(offset_ + offset); +std::error_code fragment_chunkable::release_until(size_t offset) { + return mm_.release_until(offset_ + offset); } } // namespace dwarfs::writer::internal diff --git a/src/writer/internal/inode_manager.cpp b/src/writer/internal/inode_manager.cpp index 56654ce2..21ed41ad 100644 --- a/src/writer/internal/inode_manager.cpp +++ b/src/writer/internal/inode_manager.cpp @@ -385,6 +385,8 @@ class inode_ : public inode { size_t chunk_size, T&& scanner) { while (size >= chunk_size) { std::forward(scanner)(mm->span(offset, chunk_size)); + // release_until() is best-effort, we can ignore the return value + // NOLINTNEXTLINE(bugprone-unused-return-value) mm->release_until(offset); offset += chunk_size; size -= chunk_size; diff --git a/src/writer/segmenter.cpp b/src/writer/segmenter.cpp index cfc5769c..bfaa86ce 100644 --- a/src/writer/segmenter.cpp +++ b/src/writer/segmenter.cpp @@ -1071,7 +1071,10 @@ segmenter_::append_to_block( prog_.filesystem_size += size_in_bytes; if (block.full()) [[unlikely]] { - chkable.release_until(offset_in_bytes + size_in_bytes); + if (auto ec = chkable.release_until(offset_in_bytes + size_in_bytes)) { + LOG_DEBUG << cfg_.context + << "error releasing chunkable: " << ec.message(); + } finish_chunk(chkable); block_ready(); } diff --git a/test/segmenter_benchmark.cpp b/test/segmenter_benchmark.cpp index 41eff872..2ff07170 100644 --- a/test/segmenter_benchmark.cpp +++ b/test/segmenter_benchmark.cpp @@ -55,7 +55,7 @@ class bench_chunkable : public dwarfs::writer::internal::chunkable { void add_chunk(size_t /*block*/, size_t /*offset*/, size_t /*size*/) override {} - void release_until(size_t /*offset*/) override {} + std::error_code release_until(size_t /*offset*/) override { return {}; } private: std::vector data_;