Cleanup (debugging a crash related to trees/inodes)

[?]
Dec 2, 2020, 5:38 PM
5BRU2RRWOQBMS2V3RQM7PRFR5UILYZ73GISHAKJA6KIZGC5M2MFAC

Dependencies

  • [2] OCBM7IFE New release: pijul-1.0.0-alpha.8
  • [3] R3H7D42U Debugging `pijul git`: proper error reporting
  • [4] NX5I5H53 New published versions
  • [5] WI5BS6BS New published versions
  • [6] 7UPL3Y2A Unrecord: don't restore the same unrecorded file deletion twice in the inodes and tree tables
  • [7] OUWD436A Version bump
  • [8] L4JXJHWX pijul/*: reorganize imports and remove extern crate
  • [9] SXEYMYF7 Fixing the bad changes in history (unfortunately, by rebooting).
  • [10] B5Z4IMEU Generating Cargo.nix for pijul 1.0.0-alpha.6
  • [11] 3S4DR77Z Version updates
  • [12] I52XSRUH Massive cleanup, and simplification
  • [13] 43AJ37IX Getting rid of edge validation, which does not work for zombie conflicts

Change contents

  • edit in pijul/src/commands/debug.rs at line 3
    [4.2737][4.2737:2753](),[4.2753][4.5642:5662](),[4.5662][4.2753:2754](),[4.2753][4.2753:2754]()
    use clap::Clap;
    use libpijul::TxnT;
  • edit in pijul/src/commands/debug.rs at line 5
    [4.177812]
    [4.177836]
    use clap::Clap;
    use libpijul::{Base32, TxnT};
    use log::debug;
  • edit in pijul/src/commands/debug.rs at line 22
    [4.5711]
    [4.5711]
    libpijul::pristine::debug_revinodes(&txn);
  • edit in pijul/src/commands/debug.rs at line 25
    [4.5818]
    [4.178214]
    let c: libpijul::ChangeId = libpijul::ChangeId::from_base32(b"L4ITS7QS3M4P6").unwrap();
    debug!("{:?}", txn.get_external(c));
  • replacement in pijul/Cargo.toml at line 4
    [4.196462][2.0:26]()
    version = "1.0.0-alpha.8"
    [4.196462]
    [4.196488]
    version = "1.0.0-alpha.11"
  • replacement in pijul/Cargo.toml at line 49
    [4.197456][2.27:94]()
    libpijul = { version = "1.0.0-alpha.6", features = [ "tarball" ] }
    [4.197456]
    [4.197523]
    libpijul = { version = "1.0.0-alpha.7", features = [ "tarball" ] }
  • replacement in libpijul/src/unrecord/working_copy.rs at line 17
    [4.226518][4.226518:226645]()
    let inode = inode.to_owned();
    txn.del_revinodes(pos, None)?;
    txn.del_inodes(inode, None)?;
    [4.226518]
    [4.226645]
    del_inodes_with_rev(txn, inode, pos)?;
  • replacement in libpijul/src/unrecord/working_copy.rs at line 98
    [4.152][4.152:259]()
    txn.put_tree(file_id.as_file_id(), inode)?;
    txn.put_revtree(inode, file_id.as_file_id())?;
    [4.152]
    [3.1571]
    put_tree_with_rev(txn, file_id.as_file_id(), inode)?;
  • replacement in libpijul/src/unrecord/working_copy.rs at line 149
    [4.231296][4.231296:231440]()
    let inode = inode.to_owned();
    txn.del_revinodes(position, None)?;
    txn.del_inodes(inode, None)?;
    [4.231296]
    [4.231440]
    del_inodes_with_rev(txn, inode, position)?;
  • edit in libpijul/src/record.rs at line 179
    [4.494753][4.494753:495140]()
    }
    Ok(None) => continue,
    Err(_) => {
    let parent = txn.get_revtree(item.inode, None).unwrap().to_owned();
    info!("recursively deleting {:?} {:?}", parent, item.inode);
    crate::fs::rec_delete(txn, parent, item.inode, false)?;
    continue;
  • edit in libpijul/src/record.rs at line 180
    [4.495162]
    [4.495162]
    _ => continue,
  • edit in libpijul/src/pristine/sanakirja.rs at line 421
    [4.545544]
    [4.545544]
    type Revinodes = Db<Position<ChangeId>, Inode>;
  • edit in libpijul/src/pristine/sanakirja.rs at line 424
    [4.545669][4.545669:545701]()
    // #[cfg(debug_assertions)]
  • edit in libpijul/src/pristine/sanakirja.rs at line 425
    [4.545759]
    [4.545759]
    #[cfg(debug_assertions)]
    sanakirja_cursor!(revinodes, Position<ChangeId>, Inode);
  • edit in libpijul/src/pristine/sanakirja.rs at line 635
    [4.552961][4.552961:552993](),[4.552993][4.36949:36950]()
    // #[cfg(debug_assertions)]
  • edit in libpijul/src/pristine/sanakirja.rs at line 641
    [4.553202]
    [4.553221]
    #[cfg(debug_assertions)]
    fn iter_revinodes<'txn>(
    &'txn self,
    ) -> super::Cursor<Self, &'txn Self, Self::RevinodesCursor, Position<ChangeId>, Inode> {
    self.cursor_revinodes(&self.revinodes, None)
    }
  • edit in libpijul/src/pristine/mod.rs at line 141
    [4.589844]
    [4.589844]
    table!(revinodes);
  • edit in libpijul/src/pristine/mod.rs at line 260
    [4.36994][4.36994:37026]()
    // #[cfg(debug_assertions)]
  • edit in libpijul/src/pristine/mod.rs at line 261
    [4.37074][4.37074:37139]()
    #[cfg(not(debug_assertions))]
    fn debug_inodes(&self) {}
  • edit in libpijul/src/pristine/mod.rs at line 264
    [4.37267]
    [4.37267]
    #[cfg(debug_assertions)]
    cursor!(revinodes, Position<ChangeId>, Inode);
    #[cfg(debug_assertions)]
    fn iter_revinodes<'txn>(
    &'txn self,
    ) -> Cursor<Self, &'txn Self, Self::RevinodesCursor, Position<ChangeId>, Inode>;
  • edit in libpijul/src/pristine/mod.rs at line 562
    [4.611728]
    [4.45204]
    #[cfg(debug_assertions)]
    pub fn debug_revinodes<T: TxnT>(txn: &T) {
    debug!("debug_revinodes");
    for t in txn.iter_revinodes() {
    debug!("debug_revinodes = {:?}", t)
    }
    debug!("/debug_revinodes");
    }
  • edit in libpijul/src/pristine/mod.rs at line 866
    [4.621464][4.621464:621492]()
    // #[cfg(debug_assertions)]
  • edit in libpijul/src/pristine/mod.rs at line 867
    [4.621548]
    [4.621548]
    #[cfg(debug_assertions)]
    initialized_cursor!(revinodes, Position<ChangeId>, Inode);
  • edit in libpijul/src/pristine/mod.rs at line 1146
    [4.50319]
    [4.50319]
    Ok(())
    }
    pub(crate) fn del_inodes_with_rev<T: MutTxnT>(
    txn: &mut T,
    inode: Inode,
    position: Position<ChangeId>,
    ) -> Result<bool, anyhow::Error> {
    if txn.del_inodes(inode, Some(position))? {
    assert!(txn.del_revinodes(position, Some(inode))?);
    Ok(true)
    } else {
    Ok(false)
    }
    }
    pub(crate) fn put_tree_with_rev<T: MutTxnT>(
    txn: &mut T,
    file_id: PathId,
    inode: Inode,
    ) -> Result<(), anyhow::Error> {
    txn.put_tree(file_id, inode)?;
    txn.put_revtree(inode, file_id)?;
  • edit in libpijul/src/pristine/mod.rs at line 1172
    [4.50333]
    [4.50333]
    pub(crate) fn del_tree_with_rev<T: MutTxnT>(
    txn: &mut T,
    file_id: PathId,
    inode: Inode,
    ) -> Result<bool, anyhow::Error> {
    if txn.del_tree(file_id, Some(inode))? {
    if !file_id.basename.is_empty() {
    assert!(txn.del_revtree(inode, Some(file_id))?);
    }
    Ok(true)
    } else {
    Ok(false)
    }
    }
  • replacement in libpijul/src/output/output.rs at line 238
    [4.680701][4.680701:680852]()
    assert!(txn.del_revtree(inode, Some(parent.as_file_id()))?);
    assert!(txn.del_tree(parent.as_file_id(), Some(inode))?);
    [4.680701]
    [4.680852]
    del_tree_with_rev(txn, parent.as_file_id(), inode)?;
  • replacement in libpijul/src/output/output.rs at line 258
    [3.1729][4.681737:681836](),[4.681737][4.681737:681836]()
    txn.put_tree(file_id_, inode)?;
    txn.put_revtree(inode, file_id_)?;
    [3.1729]
    [4.681836]
    put_tree_with_rev(txn, file_id_, inode)?;
  • replacement in libpijul/src/output/output.rs at line 266
    [3.1793][4.682206:682297](),[4.682206][4.682206:682297]()
    txn.put_tree(file_id_, inode)?;
    txn.put_revtree(inode, file_id_)?;
    [3.1793]
    [4.682297]
    put_tree_with_rev(txn, file_id_, inode)?;
  • replacement in libpijul/src/output/output.rs at line 280
    [3.1853][4.682802:682885](),[4.682802][4.682802:682885]()
    txn.put_tree(file_id_, inode)?;
    txn.put_revtree(inode, file_id_)?;
    [3.1853]
    [4.682885]
    put_tree_with_rev(txn, file_id_, inode)?;
  • replacement in libpijul/src/output/output.rs at line 357
    [4.685693][4.685693:685885]()
    assert!(txn.del_tree(fileid.as_file_id(), Some(*inode))?);
    if !fileid.basename.is_empty() {
    assert!(txn.del_revtree(*inode, Some(fileid.as_file_id()))?);
    }
    [4.685693]
    [4.685885]
    del_tree_with_rev(txn, fileid.as_file_id(), *inode)?;
  • replacement in libpijul/src/output/output.rs at line 359
    [4.685946][4.685946:686069]()
    assert!(txn.del_inodes(*inode, Some(vertex))?);
    assert!(txn.del_revinodes(vertex, Some(*inode))?);
    [4.685946]
    [4.686069]
    debug!("kill_dead_files {:?} {:?}", inode, vertex);
    del_inodes_with_rev(txn, *inode, vertex)?;
  • replacement in libpijul/src/fs.rs at line 171
    [4.743256][4.743256:743414]()
    assert!(txn.del_tree(parent_id.as_file_id(), Some(inode))?);
    assert!(txn.del_revtree(inode, Some(parent_id.as_file_id()))?);
    [4.743256]
    [4.743414]
    del_tree_with_rev(txn, parent_id.as_file_id(), inode)?;
  • replacement in libpijul/src/fs.rs at line 173
    [4.743482][4.743482:743619]()
    assert!(txn.del_revinodes(vertex, Some(inode))?);
    assert!(txn.del_inodes(inode, Some(vertex))?);
    [4.743482]
    [4.743619]
    del_inodes_with_rev(txn, inode, vertex)?;
  • replacement in libpijul/src/fs.rs at line 175
    [4.743637][4.743637:743764]()
    txn.put_tree(parent_id.as_file_id(), child)?;
    txn.put_revtree(child, parent_id.as_file_id())?;
    [4.743637]
    [4.743764]
    put_tree_with_rev(txn, parent_id.as_file_id(), child)?;
  • replacement in libpijul/src/fs.rs at line 191
    [4.744222][4.744222:744345]()
    txn.put_tree(parent_id.as_file_id(), child_inode)?;
    txn.put_revtree(child_inode, parent_id.as_file_id())?;
    [4.744222]
    [4.744345]
    put_tree_with_rev(txn, parent_id.as_file_id(), child_inode)?;
  • replacement in libpijul/src/fs.rs at line 248
    [4.746252][4.746252:746499]()
    // org id pbMhYNkbwXVN5IhA6QR+oGisezusrYj/GXR0zMRLtTU=
    assert!(txn.del_tree(fileref.as_file_id(), Some(inode))?);
    assert!(txn.del_revtree(inode, Some(fileref.as_file_id()))?);
    // org id yM7YkGaAlCc1HX7iY/8kRuL9f2moGbKyzXKA/sGOdlM=
    [4.746252]
    [4.746499]
    del_tree_with_rev(txn, fileref.as_file_id(), inode)?;
  • replacement in libpijul/src/fs.rs at line 298
    [4.747947][4.747947:748177]()
    if !txn.del_tree(file_id.as_file_id(), Some(inode))? {
    debug!(
    "rec_delete (is_dir): {:?} {:?} not present",
    file_id.as_file_id(),
    inode
    );
    }
    [4.747947]
    [4.748177]
    assert!(txn.del_tree(file_id.as_file_id(), Some(inode))?);
  • replacement in libpijul/src/fs.rs at line 300
    [4.748183][4.748183:748543]()
    if txn.del_tree(parent.as_file_id(), Some(inode))? {
    assert!(txn.del_revtree(inode, Some(parent.as_file_id()))?);
    if update_inodes {
    if let Some(vertex) = txn.get_inodes(inode, None) {
    assert!(txn.del_revinodes(vertex, Some(inode))?);
    assert!(txn.del_inodes(inode, Some(vertex))?);
    }
    [4.748183]
    [4.748543]
    if del_tree_with_rev(txn, parent.as_file_id(), inode)? {
    if let Some(vertex) = txn.get_inodes(inode, None) {
    del_inodes_with_rev(txn, inode, vertex)?;
  • replacement in libpijul/src/apply.rs at line 268
    [4.953809][4.953809:953864]()
    // org id zzKI7nUCrGP6P9+0nk29zZnRY1qcdFJH2tXwOxTn/xM=
    [4.953809]
    [4.953864]
  • edit in libpijul/src/apply.rs at line 277
    [4.954080][4.954080:954143]()
    // org id 8cpuyZX4ja1VYT3lhtYBMXJenBtvUbVEGky3wZ6W/HM=
  • edit in libpijul/src/apply.rs at line 292
    [4.954670][4.954670:954733]()
    // org id iTzVDtyzdcIEH3EDPbaq8PfGH9WgwLTd5XSxI5nK4Kc=
  • replacement in libpijul/src/apply.rs at line 294
    [4.954864][4.954864:954997]()
    txn.del_revtree(inode, Some(parent.as_file_id()))?;
    txn.del_tree(parent.as_file_id(), Some(inode))?;
    [4.954864]
    [4.954997]
    del_tree_with_rev(txn, parent.as_file_id(), inode)?;
  • edit in libpijul/src/apply.rs at line 296
    [4.955011]
    [4.955011]
    // Delete the directory, if it's there.
  • replacement in libpijul/src/apply.rs at line 306
    [4.955339][4.955339:955450]()
    txn.del_inodes(inode, Some(vertex))?;
    txn.del_revinodes(vertex, Some(inode))?;
    [4.955339]
    [4.955450]
    del_inodes_with_rev(txn, inode, vertex)?;
  • replacement in libpijul/src/apply.rs at line 312
    [4.955493][4.955493:955548]()
    // org id QIECdrRSNOnrMRRD9QO87SUCSg4dt9OUS5V6GZPPmeM=
    [4.955493]
    [4.955548]