Zombie folder up repair

pmeunier
Jan 25, 2026, 4:58 PM
56KXBKTS3EG442RERJ25DL6BQFGMQTB57U6Z6MLNAXLHTW6KKZ5AC

Dependencies

  • [2] MMQCFCIE Correctness of the new algorithm for detecting missing contexts
  • [3] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [4] OXZVZDQZ Simplification of missing context repairs

Change contents

  • replacement in libpijul/src/apply.rs at line 394
    [3.1618][3.1618:1640]()
    for i in inodes {
    [3.1618]
    [3.1640]
    for &i in inodes.iter() {
  • edit in libpijul/src/apply.rs at line 397
    [3.1702]
    [3.951738]
    for &i in inodes.iter() {
    repair_up(txn, T::graph_mut(channel), i)?;
    }
  • edit in libpijul/src/apply.rs at line 585
    [3.1875]
    [2.205]
    info!("repair_zombies {:?}", root);
  • edit in libpijul/src/apply.rs at line 759
    [3.4659]
    [3.4659]
    pub(crate) fn repair_up<T: GraphMutTxnT + TreeTxnT>(
    txn: &mut T,
    channel: &mut T::Graph,
    root: Position<ChangeId>,
    ) -> Result<(), LocalApplyError<T>> {
    info!("repair_zombies {:?}", root);
    let mut stack = vec![root.inode_vertex()];
    let mut visited = BTreeSet::new();
    let mut add = Vec::new();
    while let Some(elt) = stack.pop() {
    if !visited.insert(elt) {
    continue;
    }
    let mut is_alive = false;
    let mut is_dead = false;
    for e in iter_adjacent(
    txn,
    channel,
    elt,
    EdgeFlags::PARENT | EdgeFlags::FOLDER,
    EdgeFlags::all(),
    )? {
    let e = e?;
    let deleted = e.flag().contains(EdgeFlags::DELETED);
    if e.flag().contains(EdgeFlags::PARENT | EdgeFlags::FOLDER) {
    is_alive |= !deleted;
    is_dead |= deleted;
    }
    }
    if is_dead && !is_alive {
    for e in iter_adjacent(
    txn,
    channel,
    elt,
    EdgeFlags::PARENT | EdgeFlags::FOLDER,
    EdgeFlags::all(),
    )? {
    let e = e?;
    if e.flag()
    .contains(EdgeFlags::PARENT | EdgeFlags::DELETED | EdgeFlags::FOLDER)
    {
    let parent = txn.find_block_end(channel, e.dest())?;
    add.push((*parent, elt));
    stack.push(*parent)
    }
    }
    for (a, b) in add.drain(..) {
    put_graph_with_rev(
    txn,
    channel,
    EdgeFlags::PSEUDO | EdgeFlags::FOLDER,
    a,
    b,
    ChangeId::ROOT,
    )?;
    }
    }
    }
    Ok(())
    }