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:
Stefan Filip 2020-03-24 13:54:12 -07:00 committed by Facebook GitHub Bot
parent 59ff2a8571
commit c400809eba
2 changed files with 22 additions and 39 deletions

View File

@ -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.

View File

@ -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());