Mercurial > hg
diff rust/hg-core/src/dirstate_tree/on_disk.rs @ 47476:f23eafb036af
dirstate-v2: Use 32-bit integers instead of 64-bit for offsets
This saves 12 bytes per node. (Nodes representing files or directories.)
These are offsets to other parts of the file. This would only be a limitation
for a `.hg/dirstate` file larger than 4 GiB, which would only happen for a
repository with dozens of millions of files and directories.
Differential Revision: https://phab.mercurial-scm.org/D10920
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 28 Jun 2021 15:41:50 +0200 |
parents | 94e38822d395 |
children | ca8121d26732 |
line wrap: on
line diff
--- a/rust/hg-core/src/dirstate_tree/on_disk.rs Thu Jun 24 21:54:14 2021 +0200 +++ b/rust/hg-core/src/dirstate_tree/on_disk.rs Mon Jun 28 15:41:50 2021 +0200 @@ -17,7 +17,7 @@ use crate::DirstateError; use crate::DirstateParents; use crate::EntryState; -use bytes_cast::unaligned::{I32Be, I64Be, U32Be, U64Be}; +use bytes_cast::unaligned::{I32Be, I64Be, U32Be}; use bytes_cast::BytesCast; use std::borrow::Cow; use std::convert::TryFrom; @@ -135,9 +135,8 @@ /// Counted in bytes from the start of the file /// -/// NOTE: If we decide to never support `.hg/dirstate` files larger than 4 GiB -/// we could save space by using `U32Be` instead. -type Offset = U64Be; +/// NOTE: not supporting `.hg/dirstate` files larger than 4 GiB. +type Offset = U32Be; /// Counted in number of items /// @@ -172,8 +171,8 @@ /// Make sure that size-affecting changes are made knowingly fn _static_assert_size_of() { - let _ = std::mem::transmute::<Header, [u8; 92]>; - let _ = std::mem::transmute::<Node, [u8; 57]>; + let _ = std::mem::transmute::<Header, [u8; 88]>; + let _ = std::mem::transmute::<Node, [u8; 45]>; } /// Unexpected file format found in `.hg/dirstate` with the "v2" format. @@ -589,8 +588,8 @@ where T: BytesCast, { - let start = u64::try_from(out.len()) - // Could only panic on a 128-bit CPU with a dirstate over 16 EiB + let start = u32::try_from(out.len()) + // Could only panic for a dirstate file larger than 4 GiB .expect("dirstate-v2 offset overflow") .into(); let len = u32::try_from(slice.len())