From aee5f06442d73f178357b91cf17d371f0a2f9029 Mon Sep 17 00:00:00 2001 From: Martin Hoffmann Date: Fri, 6 Dec 2024 13:07:34 +0100 Subject: [PATCH] Only update in-place if the size is exactly the same. --- src/utils/archive.rs | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/utils/archive.rs b/src/utils/archive.rs index 635688d5..22c2e072 100644 --- a/src/utils/archive.rs +++ b/src/utils/archive.rs @@ -373,21 +373,14 @@ impl Archive { ).map_err(AccessError::Inconsistent)?; let new_size = Self::object_size(name, data); - if Self::fits(found.header.size, new_size) { - // We can squeeze the new object data into its current space. - ObjectHeader::update_size(found.start, new_size, &mut self.file)?; + + // Only update in place if the size is the same. This avoids small + // empty spaces that will never be reused. + if found.header.size == new_size { self.file.write(found.meta_start(), |write| { meta.write(write)?; write.write(data) })?; - // If there’s empty space, we need to mark and add that. - let empty_size = found.header.size - new_size; - if empty_size > 0 { - self.create_empty( - found.start + new_size, - empty_size, - )?; - } } else { self.delete_found(hash, found)?; @@ -883,13 +876,6 @@ impl ObjectHeader { storage.write(start, |write| self.write_into(write)) } - /// Updates the object size of a header beginning at the given position. - fn update_size( - start: u64, new_size: u64, storage: &mut Storage - ) -> Result<(), ArchiveError> { - storage.write(start, |write| write.write_u64(new_size)) - } - /// Updates the next pointer of a header beginning at the given position. fn update_next( start: u64, new_next: Option, storage: &mut Storage