Adding a cache in find_alive to improve performance in some cases
Dependencies
- [2]
RRCSHAYZFormatting - [3]
YN63NUZOSanakirja 1.0 - [4]
SFQBWL6PImproving unrecord performance (8 times faster on my tests) - [5]
AD6M434Ofind_alive performance (matters a lot for unrecord) - [6]
6YMDOZIBRefactoring apply - [7]
SXEYMYF7Fixing the bad changes in history (unfortunately, by rebooting). - [8]
T7CAACFBFixing zombie conflicts (some vertices were wrongly detected alive) - [9]
WZVCLZKYaddress clippy lints - [10]
VO5OQW4WRemoving anyhow in libpijul - [11]
I24UEJQLVarious post-fire fixes - [12]
CCLLB7OIUpgrading to Sanakirja 0.15 + version bump - [13]
I52XSRUHMassive cleanup, and simplification
Change contents
- edit in libpijul/src/missing_context.rs at line 6
use std::cell::RefCell; - edit in libpijul/src/missing_context.rs at line 8
use std::rc::Rc; - replacement in libpijul/src/missing_context.rs at line 77
let mut alive = find_alive_up(txn, channel, &mut ws.files, c, change_id)?;let alive = find_alive_up(txn,channel,&mut ws.files,c,change_id,&mut ws.alive_up_cache,)?;let mut alive = alive.borrow_mut();debug!("files = {:?}", ws.files); - replacement in libpijul/src/missing_context.rs at line 96
&mut alive,&mut *alive, - replacement in libpijul/src/missing_context.rs at line 101
repair_regular_up(txn, channel, &alive, d, EdgeFlags::PSEUDO)?;repair_regular_up(txn, channel, &*alive, d, EdgeFlags::PSEUDO)?; - replacement in libpijul/src/missing_context.rs at line 114
debug!("put_graph_with_rev {:?} -> {:?}", ancestor, d);debug!("repair_regular_up {:?} → {:?}", ancestor, d); - edit in libpijul/src/missing_context.rs at line 122
debug!("repair_missing_up {:?} {:?}", ancestor, d); - edit in libpijul/src/missing_context.rs at line 139
debug!("repair_missing_down_context {:?}", c); - replacement in libpijul/src/missing_context.rs at line 141
let mut alive = find_alive_down(txn, channel, c)?;let alive = find_alive_down(txn, channel, c, &mut ws.alive_down_cache)?;let mut alive = alive.borrow_mut();debug!("alive = {:?}", alive); - replacement in libpijul/src/missing_context.rs at line 147
crate::alive::remove_redundant_children(graph, vids, &mut alive, c);crate::alive::remove_redundant_children(graph, vids, &mut *alive, c); - edit in libpijul/src/missing_context.rs at line 371
alive_down_cache: HashMap<Vertex<ChangeId>, Rc<RefCell<HashSet<Vertex<ChangeId>>>>>,alive_up_cache: HashMap<Vertex<ChangeId>,(Rc<RefCell<HashSet<Vertex<ChangeId>>>>,Rc<RefCell<HashSet<Vertex<ChangeId>>>>,),>, - replacement in libpijul/src/missing_context.rs at line 518
let alive = find_alive_down(txn, channel, p)?;repair_missing_up_context(txn, channel, ws, change_id, inode, dest_vertex, &alive)?;let alive = find_alive_down(txn, channel, p, &mut ws.alive_down_cache)?;repair_missing_up_context(txn,channel,ws,change_id,inode,dest_vertex,&*alive.borrow(),)?; - replacement in libpijul/src/find_alive.rs at line 2
use crate::HashSet;use crate::{HashMap, HashSet};use std::cell::RefCell;use std::rc::Rc;type Alive = Rc<RefCell<HashSet<Vertex<ChangeId>>>>; - replacement in libpijul/src/find_alive.rs at line 12
) -> Result<HashSet<Vertex<ChangeId>>, BlockError<T::GraphError>> {let mut stack = vec![(SerializedEdge::empty(vertex0.start_pos(), ChangeId::ROOT),0,)];cache: &mut HashMap<Vertex<ChangeId>, Alive>,) -> Result<Alive, BlockError<T::GraphError>> {let mut stack = vec![SerializedEdge::empty(vertex0.start_pos(), ChangeId::ROOT)]; - replacement in libpijul/src/find_alive.rs at line 16
let mut alive = HashSet::default();while let Some((elt, len)) = stack.pop() {let alive = Rc::new(RefCell::new(HashSet::new()));while let Some(elt) = stack.pop() { - edit in libpijul/src/find_alive.rs at line 22
if let Some(c) = cache.get(vertex) {alive.borrow_mut().extend(c.borrow().iter().cloned());continue;} else {cache.insert(*vertex, alive.clone());} - replacement in libpijul/src/find_alive.rs at line 42
assert!(alive.is_empty());assert!(alive.borrow().is_empty()); - replacement in libpijul/src/find_alive.rs at line 45
alive.insert(*vertex);alive.borrow_mut().insert(*vertex); - replacement in libpijul/src/find_alive.rs at line 53
stack.push((*v, len + 1))stack.push(*v) - replacement in libpijul/src/find_alive.rs at line 65
) -> Result<HashSet<Vertex<ChangeId>>, BlockError<T::GraphError>> {let mut alive = HashSet::default();cache: &mut HashMap<Vertex<ChangeId>, (Alive, Alive)>,) -> Result<Alive, BlockError<T::GraphError>> {debug!("find alive up: {:?}", vertex0);let alive = Rc::new(RefCell::new(HashSet::default()));let files_ = Rc::new(RefCell::new(HashSet::default())); - edit in libpijul/src/find_alive.rs at line 81
debug!("vertex = {:?}", vertex);let is_cached = if let Some((c, f)) = cache.get(&vertex) {alive.borrow_mut().extend(c.borrow().iter().cloned());files_.borrow_mut().extend(f.borrow().iter().cloned());files.extend(f.borrow().iter().cloned());// We're not continuing here, since the while loop below// needs to insert stuff into `files` and `files_`.true} else {cache.insert(vertex, (alive.clone(), files_.clone()));false}; - replacement in libpijul/src/find_alive.rs at line 115
alive.insert(vertex);debug!("is alive + is file {:?}", vertex);alive.borrow_mut().insert(vertex);files_.borrow_mut().insert(vertex); - replacement in libpijul/src/find_alive.rs at line 123
alive.insert(vertex);debug!("is alive {:?}", vertex);alive.borrow_mut().insert(vertex); - replacement in libpijul/src/find_alive.rs at line 132
alive.insert(vertex);debug!("is alive {:?}", vertex);alive.borrow_mut().insert(vertex);files_.borrow_mut().insert(vertex); - replacement in libpijul/src/find_alive.rs at line 138
} else {} else if !is_cached {