mirror of
https://github.com/facebook/sapling.git
synced 2024-10-06 06:47:41 +03:00
dag: rename child index iteration to iter_master_flat_segments_with_parent
Summary: `iter_segments_with_parent` has a few more conditions attached to it than the name would imply. We are renaming it to give a better sense of its true behavior. Reviewed By: quark-zju Differential Revision: D20547631 fbshipit-source-id: 406f46b9de5efc9e8e6a8c4bc22ab18fa5bc54bb
This commit is contained in:
parent
59ff2a8571
commit
c400809eba
@ -160,11 +160,11 @@ impl<Store: IdDagStore> IdDag<Store> {
|
||||
}
|
||||
|
||||
/// Iterate through flat segments that have the given parent.
|
||||
pub(crate) fn iter_segments_with_parent<'a>(
|
||||
pub(crate) fn iter_master_flat_segments_with_parent<'a>(
|
||||
&'a self,
|
||||
parent: Id,
|
||||
) -> Result<impl Iterator<Item = Result<Segment>> + 'a> {
|
||||
self.store.iter_segments_with_parent(parent)
|
||||
self.store.iter_master_flat_segments_with_parent(parent)
|
||||
}
|
||||
}
|
||||
|
||||
@ -634,7 +634,7 @@ impl<Store: IdDagStore> IdDag<Store> {
|
||||
}
|
||||
// Can we use `head` in `seg` as `x`?
|
||||
let mut next_id = None;
|
||||
for child_seg in self.iter_segments_with_parent(head)? {
|
||||
for child_seg in self.iter_master_flat_segments_with_parent(head)? {
|
||||
let child_seg = child_seg?;
|
||||
if child_seg.parents()?.len() > 1 {
|
||||
// `child_seg.span().low` is a merge, so `head` is a parent of a merge.
|
||||
|
@ -64,8 +64,8 @@ pub trait IdDagStore {
|
||||
level: Level,
|
||||
) -> Result<Box<dyn Iterator<Item = Result<Segment>> + 'a>>;
|
||||
|
||||
/// Iterate through flat segments that have the given parent.
|
||||
fn iter_segments_with_parent<'a>(
|
||||
/// Iterate through master flat segments that have the given parent.
|
||||
fn iter_master_flat_segments_with_parent<'a>(
|
||||
&'a self,
|
||||
parent: Id,
|
||||
) -> Result<Box<dyn Iterator<Item = Result<Segment>> + 'a>>;
|
||||
@ -209,7 +209,7 @@ impl IdDagStore for IndexedLogStore {
|
||||
Ok(Box::new(iter))
|
||||
}
|
||||
|
||||
fn iter_segments_with_parent<'a>(
|
||||
fn iter_master_flat_segments_with_parent<'a>(
|
||||
&'a self,
|
||||
parent: Id,
|
||||
) -> Result<Box<dyn Iterator<Item = Result<Segment>> + 'a>> {
|
||||
@ -327,7 +327,9 @@ impl IndexedLogStore {
|
||||
// parent -> child for flat segments
|
||||
let seg = Segment(Bytes::copy_from_slice(data));
|
||||
let mut result = Vec::new();
|
||||
if seg.level().ok() == Some(0) {
|
||||
if seg.level().ok() == Some(0)
|
||||
&& seg.high().map(|id| id.group()).ok() == Some(Group::MASTER)
|
||||
{
|
||||
// This should never pass since MAGIC_CLEAR_NON_MASTER[0] != 0.
|
||||
assert_ne!(
|
||||
data,
|
||||
@ -426,7 +428,7 @@ impl IdDagStore for InProcessStore {
|
||||
StoreId::NonMaster(self.non_master_segments.len() - 1)
|
||||
}
|
||||
};
|
||||
if level == 0 {
|
||||
if level == 0 && high.group() == Group::MASTER {
|
||||
for parent in parents {
|
||||
let children = self.parent_index.entry(parent).or_insert(BTreeSet::new());
|
||||
children.insert(store_id);
|
||||
@ -437,19 +439,10 @@ impl IdDagStore for InProcessStore {
|
||||
}
|
||||
|
||||
fn remove_non_master(&mut self) -> Result<()> {
|
||||
for (i, segment) in self.non_master_segments.iter().enumerate() {
|
||||
// Note. The parent index should not contain any non master entries.
|
||||
for segment in self.non_master_segments.iter() {
|
||||
let level = segment.level()?;
|
||||
let head = segment.head()?;
|
||||
let store_id = StoreId::NonMaster(i);
|
||||
|
||||
if level == 0 {
|
||||
let parents = segment.parents()?;
|
||||
for parent in parents {
|
||||
self.parent_index
|
||||
.get_mut(&parent)
|
||||
.map(|set| set.remove(&store_id));
|
||||
}
|
||||
}
|
||||
self.level_head_index
|
||||
.get_mut(level as usize)
|
||||
.map(|head_index| head_index.remove(&head));
|
||||
@ -503,7 +496,7 @@ impl IdDagStore for InProcessStore {
|
||||
}
|
||||
}
|
||||
|
||||
fn iter_segments_with_parent<'a>(
|
||||
fn iter_master_flat_segments_with_parent<'a>(
|
||||
&'a self,
|
||||
parent: Id,
|
||||
) -> Result<Box<dyn Iterator<Item = Result<Segment>> + 'a>> {
|
||||
@ -767,35 +760,25 @@ mod tests {
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_in_process_store_iter_segments_with_parent() {
|
||||
fn test_in_process_store_iter_master_flat_segments_with_parent() {
|
||||
let store = get_in_process_store();
|
||||
|
||||
let answer = store
|
||||
.iter_segments_with_parent(Id(2))
|
||||
.iter_master_flat_segments_with_parent(Id(2))
|
||||
.unwrap()
|
||||
.collect::<Result<Vec<_>>>()
|
||||
.unwrap();
|
||||
let expected = segments_to_owned(&[&LEVEL0_HEAD5, &LEVEL0_HEAD9]);
|
||||
assert_eq!(answer, expected);
|
||||
|
||||
let answer = store
|
||||
.iter_segments_with_parent(Id(13))
|
||||
.unwrap()
|
||||
.collect::<Result<Vec<_>>>()
|
||||
.unwrap();
|
||||
let expected = segments_to_owned(&[&LEVEL0_HEADN2]);
|
||||
assert_eq!(answer, expected);
|
||||
|
||||
let mut answer = store.iter_segments_with_parent(Id(4)).unwrap();
|
||||
let mut answer = store.iter_master_flat_segments_with_parent(Id(13)).unwrap();
|
||||
assert!(answer.next().is_none());
|
||||
|
||||
let answer = store
|
||||
.iter_segments_with_parent(nid(2))
|
||||
.unwrap()
|
||||
.collect::<Result<Vec<_>>>()
|
||||
.unwrap();
|
||||
let expected = segments_to_owned(&[&LEVEL0_HEADN6]);
|
||||
assert_eq!(answer, expected);
|
||||
let mut answer = store.iter_master_flat_segments_with_parent(Id(4)).unwrap();
|
||||
assert!(answer.next().is_none());
|
||||
|
||||
let mut answer = store.iter_master_flat_segments_with_parent(nid(2)).unwrap();
|
||||
assert!(answer.next().is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -817,7 +800,7 @@ mod tests {
|
||||
nid(0)
|
||||
);
|
||||
assert!(store
|
||||
.iter_segments_with_parent(nid(2))
|
||||
.iter_master_flat_segments_with_parent(nid(2))
|
||||
.unwrap()
|
||||
.next()
|
||||
.is_none());
|
||||
|
Loading…
Reference in New Issue
Block a user