rust/hg-core/src/dirstate_tree/on_disk.rs
changeset 47681 d94118365ec5
parent 47680 a8b0f29dc0d7
child 47682 78f7f0d490ee
--- a/rust/hg-core/src/dirstate_tree/on_disk.rs	Thu Jul 15 10:31:43 2021 +0200
+++ b/rust/hg-core/src/dirstate_tree/on_disk.rs	Thu Jul 08 19:23:44 2021 +0200
@@ -73,6 +73,9 @@
     nodes_with_entry_count: Size,
     nodes_with_copy_source_count: Size,
 
+    /// How many bytes of this data file are not used anymore
+    unreachable_bytes: Size,
+
     /// If non-zero, a hash of ignore files that were used for some previous
     /// run of the `status` algorithm.
     ///
@@ -205,7 +208,7 @@
 /// Make sure that size-affecting changes are made knowingly
 fn _static_assert_size_of() {
     let _ = std::mem::transmute::<DocketHeader, [u8; 81]>;
-    let _ = std::mem::transmute::<Root, [u8; 36]>;
+    let _ = std::mem::transmute::<Root, [u8; 40]>;
     let _ = std::mem::transmute::<Node, [u8; 43]>;
 }
 
@@ -283,6 +286,9 @@
         return Ok(DirstateMap::empty(on_disk));
     }
     let root = read_root(on_disk)?;
+    let mut unreachable_bytes = root.unreachable_bytes.get();
+    // Each append writes a new `Root`, so it’s never reused
+    unreachable_bytes += std::mem::size_of::<Root>() as u32;
     let dirstate_map = DirstateMap {
         on_disk,
         root: dirstate_map::ChildNodes::OnDisk(read_nodes(
@@ -292,6 +298,7 @@
         nodes_with_entry_count: root.nodes_with_entry_count.get(),
         nodes_with_copy_source_count: root.nodes_with_copy_source_count.get(),
         ignore_patterns_hash: root.ignore_patterns_hash,
+        unreachable_bytes,
     };
     Ok(dirstate_map)
 }
@@ -573,6 +580,7 @@
         nodes_with_copy_source_count: dirstate_map
             .nodes_with_copy_source_count
             .into(),
+        unreachable_bytes: dirstate_map.unreachable_bytes.into(),
         ignore_patterns_hash: dirstate_map.ignore_patterns_hash,
     };
     writer.out.extend(root.as_bytes());