[Updated] D12581: rust-dirstate-v2: clean up previous data file after the docket is written
Alphare (Raphaël Gomès)
phabricator at mercurial-scm.org
Fri Apr 22 15:53:15 UTC 2022
Closed by commit rHG802e2c25dab8: rust-dirstate-v2: clean up previous data file after the docket is written (authored by Alphare).
This revision was automatically updated to reflect the committed changes.
This revision was not accepted when it landed; it landed in state "Needs Review".
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D12581?vs=33301&id=33306
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D12581/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D12581
AFFECTED FILES
rust/hg-core/src/repo.rs
CHANGE DETAILS
diff --git a/rust/hg-core/src/repo.rs b/rust/hg-core/src/repo.rs
--- a/rust/hg-core/src/repo.rs
+++ b/rust/hg-core/src/repo.rs
@@ -434,7 +434,7 @@
// TODO: Maintain a `DirstateMap::dirty` flag, and return early here if
// it’s unset
let parents = self.dirstate_parents()?;
- let packed_dirstate = if self.has_dirstate_v2() {
+ let (packed_dirstate, old_uuid_to_remove) = if self.has_dirstate_v2() {
let uuid = self.dirstate_data_file_uuid.get_or_init(self)?;
let mut uuid = uuid.as_ref();
let can_append = uuid.is_some();
@@ -443,14 +443,16 @@
if !append {
uuid = None
}
- let uuid = if let Some(uuid) = uuid {
- std::str::from_utf8(uuid)
+ let (uuid, old_uuid) = if let Some(uuid) = uuid {
+ let as_str = std::str::from_utf8(uuid)
.map_err(|_| {
HgError::corrupted("non-UTF-8 dirstate data file ID")
})?
- .to_owned()
+ .to_owned();
+ let old_uuid_to_remove = Some(as_str.to_owned());
+ (as_str, old_uuid_to_remove)
} else {
- DirstateDocket::new_uid()
+ (DirstateDocket::new_uid(), None)
};
let data_filename = format!("dirstate.{}", uuid);
let data_filename = self.hg_vfs().join(data_filename);
@@ -480,7 +482,8 @@
}
})()
.when_writing_file(&data_filename)?;
- DirstateDocket::serialize(
+
+ let packed_dirstate = DirstateDocket::serialize(
parents,
tree_metadata,
data_size,
@@ -488,11 +491,20 @@
)
.map_err(|_: std::num::TryFromIntError| {
HgError::corrupted("overflow in dirstate docket serialization")
- })?
+ })?;
+
+ (packed_dirstate, old_uuid)
} else {
- map.pack_v1(parents)?
+ (map.pack_v1(parents)?, None)
};
- self.hg_vfs().atomic_write("dirstate", &packed_dirstate)?;
+
+ let vfs = self.hg_vfs();
+ vfs.atomic_write("dirstate", &packed_dirstate)?;
+ if let Some(uuid) = old_uuid_to_remove {
+ // Remove the old data file after the new docket pointing to the
+ // new data file was written.
+ vfs.remove_file(format!("dirstate.{}", uuid))?;
+ }
Ok(())
}
}
To: Alphare, #hg-reviewers
Cc: mercurial-patches
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-patches/attachments/20220422/1685d95a/attachment-0002.html>
More information about the Mercurial-patches
mailing list