Debugging synchronisation
[?]
Feb 4, 2021, 8:39 AM
G4JEQLLX6Q7VVFVAEJZAVQXX33MQ36CSCYSMJ5NQM5VZ76DXKU6QCDependencies
- [2]
AOX2XQISActually, with the correct functions, Unsized pages are always slower than Sized pages (especially for writing) - [3]
UAQX27N4Tests - [4]
EAAYH6BQDebugging put - [5]
6UVFCERMFormatting, debugging, etc. - [6]
YWFYZNLZCleanup + inter-process concurrency - [7]
X3QVVQISMore debugging (del seems to work now) - [8]
FMN7X4J2Micro-improvements, now noticeably faster than std::collections::BTreeMap - [9]
YXKP4AIWNew file locks, with multiple sets of free pages - [10]
6DMPXOATMore debugging - [11]
OP6SVMODResetting history - [12]
WS4ZQM4RDebugging, tests, etc. - [13]
OTWDDJE7Trait/type cleanup - [14]
AFKBHYVEComparing the two implementations of leaves (sized/unsized). Sized are faster for writes, slower for reads. - [15]
H3FVSQIQUnsized pages
Change contents
- edit in sanakirja-core/src/lib.rs at line 139
}pub fn null() -> Self {CowPage {data: core::ptr::null_mut(),offset: 0,} - edit in sanakirja-core/src/btree/page_unsized/put.rs at line 160
}{let hdr = header(left.0.as_page());assert_eq!(hdr.n() as u64 * 16, hdr.left_page() & 0xfff);}{let hdr = header(right.0.as_page());assert_eq!(hdr.n() as u64 * 16, hdr.left_page() & 0xfff); - edit in sanakirja-core/src/btree/page_unsized/put.rs at line 161
assert!(!split.0.is_null()); - edit in sanakirja-core/src/btree/page_unsized/alloc.rs at line 81
assert_eq!(hdr.n() as u64 * 16, hdr.left_page() & 0xfff); // Just for the test with (u64, u64). - edit in sanakirja-core/src/btree/mod.rs at line 286
impl<K: Representable + ?Sized, V: Representable + ?Sized, P: BTreePage<K, V>> Db_<K, V, P> {pub fn from_page(db: CowPage) -> Self {Db_ {db,k: core::marker::PhantomData,v: core::marker::PhantomData,p: core::marker::PhantomData,}}} - edit in sanakirja/src/tests.rs at line 142
type B = btree::page::Page<u64, ()>; - edit in sanakirja/src/tests.rs at line 147
type B = btree::page::Page<u64, ()>; - edit in sanakirja/src/tests.rs at line 226
check_free(&mut txn, &refs);debug!("{:?}", refs);}fn check_free(txn: &mut MutTxn<&Env, ()>, refs: &BTreeMap<u64, usize>) { - replacement in sanakirja/src/tests.rs at line 240
while let Some((k, _)) = curs.next(&mut txn).unwrap() {while let Some((k, _)) = curs.next(txn).unwrap() { - edit in sanakirja/src/tests.rs at line 242
assert!(refs.get(k).is_none()) - replacement in sanakirja/src/tests.rs at line 245
debug!("{:?}", refs);for (r, _) in refs.iter() {assert!(*r < txn.length)} - edit in sanakirja/src/tests.rs at line 285
env_logger::try_init().unwrap_or(()); - replacement in sanakirja/src/tests.rs at line 287[3.1912]→[3.1912:2076](∅→∅),[3.2076]→[3.2467:2539](∅→∅),[3.2539]→[3.2152:2283](∅→∅),[3.2152]→[3.2152:2283](∅→∅),[3.2283]→[3.2540:2589](∅→∅),[3.2589]→[3.2336:2381](∅→∅),[3.2336]→[3.2336:2381](∅→∅),[3.2381]→[3.27376:27436](∅→∅),[3.27436]→[3.2444:2536](∅→∅),[3.2444]→[3.2444:2536](∅→∅),[3.2536]→[3.2590:2639](∅→∅),[3.2639]→[3.2589:2688](∅→∅),[3.2589]→[3.2589:2688](∅→∅)
let env = Env::new("/tmp/sanakirja0", 4096 * 20, 2).unwrap();let mut txn = Env::mut_txn_begin(&env).unwrap();debug!("txn.root = {:?}", txn.env.root);let db = create_db::<MutTxn<&Env, ()>, u64, ()>(&mut txn).unwrap();debug!("db = {:?}", db.db.offset);txn.set_root(0, db.db.offset);txn.commit().unwrap();debug!("1. commit done");let txn = Env::mut_txn_begin(&env).unwrap();debug!("txn.root = {:?}", txn.env.root);let db: Db<u64, ()> = txn.root_db(0).unwrap().unwrap();debug!("txn.root = {:?}", db);txn.commit().unwrap();debug!("2. commit done");let txn = Env::mut_txn_begin(&env).unwrap();debug!("txn.root = {:?}", txn.env.root);txn.commit().unwrap();debug!("commit done");env_logger::try_init().unwrap_or(());let mut child = unsafe { libc::fork() };if child == 0 {// childlet env = Env::new("/tmp/sanakirja0", 4096 * 20, 2).unwrap();// Mutable txnlet mut txn = Env::mut_txn_begin(&env).unwrap();info!("started child mutable txn {:?}", txn.env.root.lock());let db = create_db::<MutTxn<&Env, ()>, u64, ()>(&mut txn).unwrap();debug!("db = {:?}", db.db.offset);txn.set_root(0, db.db.offset);std::thread::sleep(std::time::Duration::from_secs(2));txn.commit().unwrap();info!("committed");let t = std::time::SystemTime::now();let mut txn = Env::mut_txn_begin(&env).unwrap();// Since the parent has an immutable transaction started, we// need to wait for at least some time (1s - 100ms of// synchronisation margin).assert!(t.elapsed().unwrap() >= std::time::Duration::from_millis(900));info!("started child mutable txn {:?}", txn.env.root.lock());let db = create_db::<MutTxn<&Env, ()>, u64, ()>(&mut txn).unwrap();debug!("db = {:?}", db.db.offset);txn.set_root(0, db.db.offset);std::thread::sleep(std::time::Duration::from_secs(1));txn.commit().unwrap();unsafe { libc::exit(0) }} else {// parentstd::thread::sleep(std::time::Duration::from_secs(1));let env = Env::new("/tmp/sanakirja0", 4096 * 20, 2).unwrap();// Immutableinfo!("starting parent txn {:?}", env.root);let txn = Env::txn_begin(&env).unwrap();info!("started parent txn");std::thread::sleep(std::time::Duration::from_secs(3));std::mem::drop(txn);unsafe { libc::wait(&mut child) };} - edit in sanakirja/src/tests.rs at line 388
debug!("{:?}", txn.free);check_free(&mut txn, &refs); - replacement in sanakirja/src/tests.rs at line 391
println!("sized length = {:?}", txn.length >> 12);let len = txn.length >> 12;println!("sized length = {:?}", len); - replacement in sanakirja/src/tests.rs at line 407
println!("unsized length = {:?}", txn.length >> 12);println!("unsized length = {:?}", (txn.length >> 12) - len);add_refs(&txn, &db, &mut refs).unwrap();for (p, r) in refs.iter() {if *r >= 2 {error!("{:?} referenced twice", p);err += 1}}assert_eq!(err, 0);check_free(&mut txn, &refs); - edit in sanakirja/src/environment/muttxn.rs at line 38
debug!("unlock exclusive {:?}", *root); - replacement in sanakirja/src/environment/muttxn.rs at line 145[3.84183]→[3.27474:27536](∅→∅),[3.3434]→[3.84279:84354](∅→∅),[3.27536]→[3.84279:84354](∅→∅),[3.84279]→[3.84279:84354](∅→∅),[3.84354]→[3.37493:37523](∅→∅),[3.37523]→[3.84381:84510](∅→∅),[3.84381]→[3.84381:84510](∅→∅),[3.84510]→[3.52979:53114](∅→∅),[3.53114]→[3.84560:84575](∅→∅),[3.84560]→[3.84560:84575](∅→∅)
let mut free_db: btree::Db<u64, ()> = btree::Db {db: std::mem::replace(&mut self.free,CowPage {data: std::ptr::null_mut(),offset: 0,},),k: std::marker::PhantomData,v: std::marker::PhantomData,p: std::marker::PhantomData,};let mut free_db: btree::Db<u64, ()> =btree::Db::from_page(std::mem::replace(&mut self.free, CowPage::null())); - edit in sanakirja/src/environment/muttxn.rs at line 164
self.free = free_db.db; - edit in sanakirja/src/environment/muttxn.rs at line 178
*root = (*root + 1) % env.roots.len(); - edit in sanakirja/src/environment/muttxn.rs at line 183
debug!("commit: unlock {:?}", *root); - edit in sanakirja/src/environment/muttxn.rs at line 186
debug!("commit: unlock file"); - edit in sanakirja/src/environment/muttxn.rs at line 190
*root = (*root + 1) % env.roots.len(); - edit in sanakirja/src/environment/mod.rs at line 375
use log::*; - edit in sanakirja/src/environment/mod.rs at line 378
debug!("root lock"); - replacement in sanakirja/src/environment/mod.rs at line 381
debug!("shared {:?}", root);env_.roots[root].rw.lock_shared(); - edit in sanakirja/src/environment/mod.rs at line 384
debug!("old_n_txn: {:?}", old_n_txn); - edit in sanakirja/src/environment/mod.rs at line 386
env_.roots[root].rw.lock_shared(); - edit in sanakirja/src/environment/mod.rs at line 387
debug!("file lock shared"); - edit in sanakirja/src/environment/mod.rs at line 400
unsafe { env.roots[self.root].rw.unlock_shared() } - edit in sanakirja/src/environment/mod.rs at line 403
unsafe { env.roots[self.root].rw.unlock_shared() } - edit in sanakirja/Cargo.toml at line 17
# lmdb-rs = "*" - edit in sanakirja/Cargo.toml at line 23[3.108745]
libc = "*"# lmdb-rs = "*"