comparison rust/hg-core/src/dirstate_tree/dirstate_map.rs @ 47682:78f7f0d490ee

dirstate-v2: Move fixed-size tree metadata into the docket file Before this changeset, the dirstate-v2 data file contained not only nodes and paths that may be reused when appending to an existing file, but also some fixed-size metadata that applies to the entire tree and was added at the end of the data file for every append. This moves that metadata into the docket file, so that repeated "append" operations without meaningful changes don’t actually need to grow any file. Differential Revision: https://phab.mercurial-scm.org/D11098
author Simon Sapin <simon.sapin@octobus.net>
date Thu, 15 Jul 2021 23:02:17 +0200
parents d94118365ec5
children 284a20269a97
comparison
equal deleted inserted replaced
47681:d94118365ec5 47682:78f7f0d490ee
422 422
423 #[timed] 423 #[timed]
424 pub fn new_v2( 424 pub fn new_v2(
425 on_disk: &'on_disk [u8], 425 on_disk: &'on_disk [u8],
426 data_size: usize, 426 data_size: usize,
427 metadata: &[u8],
427 ) -> Result<Self, DirstateError> { 428 ) -> Result<Self, DirstateError> {
428 if let Some(data) = on_disk.get(..data_size) { 429 if let Some(data) = on_disk.get(..data_size) {
429 Ok(on_disk::read(data)?) 430 Ok(on_disk::read(data, metadata)?)
430 } else { 431 } else {
431 Err(DirstateV2ParseError.into()) 432 Err(DirstateV2ParseError.into())
432 } 433 }
433 } 434 }
434 435
1092 } 1093 }
1093 } 1094 }
1094 Ok(packed) 1095 Ok(packed)
1095 } 1096 }
1096 1097
1097 /// Returns new data together with whether that data should be appended to 1098 /// Returns new data and metadata together with whether that data should be
1098 /// the existing data file whose content is at `self.on_disk` (true), 1099 /// appended to the existing data file whose content is at
1099 /// instead of written to a new data file (false). 1100 /// `self.on_disk` (true), instead of written to a new data file
1101 /// (false).
1100 #[timed] 1102 #[timed]
1101 fn pack_v2( 1103 fn pack_v2(
1102 &mut self, 1104 &mut self,
1103 now: Timestamp, 1105 now: Timestamp,
1104 can_append: bool, 1106 can_append: bool,
1105 ) -> Result<(Vec<u8>, bool), DirstateError> { 1107 ) -> Result<(Vec<u8>, Vec<u8>, bool), DirstateError> {
1106 // TODO: how do we want to handle this in 2038? 1108 // TODO: how do we want to handle this in 2038?
1107 let now: i32 = now.0.try_into().expect("time overflow"); 1109 let now: i32 = now.0.try_into().expect("time overflow");
1108 let mut paths = Vec::new(); 1110 let mut paths = Vec::new();
1109 for node in self.iter_nodes() { 1111 for node in self.iter_nodes() {
1110 let node = node?; 1112 let node = node?;