pijul nest
guest [sign in]

Debugging synchronisation

[?]
Feb 4, 2021, 8:39 AM
G4JEQLLX6Q7VVFVAEJZAVQXX33MQ36CSCYSMJ5NQM5VZ76DXKU6QC

Dependencies

  • [2] AOX2XQIS Actually, with the correct functions, Unsized pages are always slower than Sized pages (especially for writing)
  • [3] UAQX27N4 Tests
  • [4] EAAYH6BQ Debugging put
  • [5] 6UVFCERM Formatting, debugging, etc.
  • [6] YWFYZNLZ Cleanup + inter-process concurrency
  • [7] X3QVVQIS More debugging (del seems to work now)
  • [8] FMN7X4J2 Micro-improvements, now noticeably faster than std::collections::BTreeMap
  • [9] YXKP4AIW New file locks, with multiple sets of free pages
  • [10] 6DMPXOAT More debugging
  • [11] OP6SVMOD Resetting history
  • [12] WS4ZQM4R Debugging, tests, etc.
  • [13] OTWDDJE7 Trait/type cleanup
  • [14] AFKBHYVE Comparing the two implementations of leaves (sized/unsized). Sized are faster for writes, slower for reads.
  • [15] H3FVSQIQ Unsized pages

Change contents

  • edit in sanakirja-core/src/lib.rs at line 139
    [3.495]
    [3.495]
    }
    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
    [3.31744][2.1148:1393]()
    }
    {
    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
    [3.31750][2.1394:1395](),[2.1395][3.31750:31783](),[3.31750][3.31750:31783]()
    assert!(!split.0.is_null());
  • edit in sanakirja-core/src/btree/page_unsized/alloc.rs at line 81
    [3.3525][2.1691:1795]()
    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
    [3.52188]
    [3.15084]
    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
    [3.9943]
    [3.9943]
    type B = btree::page::Page<u64, ()>;
  • edit in sanakirja/src/tests.rs at line 147
    [3.5701][3.5701:5742]()
    type B = btree::page::Page<u64, ()>;
  • edit in sanakirja/src/tests.rs at line 226
    [3.7458]
    [3.7458]
    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
    [3.7726][3.7726:7790]()
    while let Some((k, _)) = curs.next(&mut txn).unwrap() {
    [3.7726]
    [3.7790]
    while let Some((k, _)) = curs.next(txn).unwrap() {
  • edit in sanakirja/src/tests.rs at line 242
    [3.7827]
    [3.7827]
    assert!(refs.get(k).is_none())
  • replacement in sanakirja/src/tests.rs at line 245
    [3.7843][3.7843:7869]()
    debug!("{:?}", refs);
    [3.7843]
    [3.7869]
    for (r, _) in refs.iter() {
    assert!(*r < txn.length)
    }
  • edit in sanakirja/src/tests.rs at line 285
    [3.1751][3.1751:1793]()
    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");
    [3.1912]
    [3.2688]
    env_logger::try_init().unwrap_or(());
    let mut child = unsafe { libc::fork() };
    if child == 0 {
    // child
    let env = Env::new("/tmp/sanakirja0", 4096 * 20, 2).unwrap();
    // Mutable txn
    let 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 {
    // parent
    std::thread::sleep(std::time::Duration::from_secs(1));
    let env = Env::new("/tmp/sanakirja0", 4096 * 20, 2).unwrap();
    // Immutable
    info!("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
    [3.12573]
    [2.2354]
    debug!("{:?}", txn.free);
    check_free(&mut txn, &refs);
  • replacement in sanakirja/src/tests.rs at line 391
    [2.2378][2.2378:2433]()
    println!("sized length = {:?}", txn.length >> 12);
    [2.2378]
    [3.412]
    let len = txn.length >> 12;
    println!("sized length = {:?}", len);
  • replacement in sanakirja/src/tests.rs at line 407
    [3.760][2.2493:2550]()
    println!("unsized length = {:?}", txn.length >> 12);
    [3.760]
    [3.12890]
    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
    [3.81081]
    [3.148]
    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,
    };
    [3.84183]
    [3.84575]
    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
    [3.85506]
    [3.85506]
    self.free = free_db.db;
  • edit in sanakirja/src/environment/muttxn.rs at line 178
    [3.85777][3.85777:85828]()
    *root = (*root + 1) % env.roots.len();
  • edit in sanakirja/src/environment/muttxn.rs at line 183
    [3.85909]
    [3.907]
    debug!("commit: unlock {:?}", *root);
  • edit in sanakirja/src/environment/muttxn.rs at line 186
    [3.1021]
    [3.1021]
    debug!("commit: unlock file");
  • edit in sanakirja/src/environment/muttxn.rs at line 190
    [3.85966]
    [3.85966]
    *root = (*root + 1) % env.roots.len();
  • edit in sanakirja/src/environment/mod.rs at line 375
    [3.4709]
    [3.105716]
    use log::*;
  • edit in sanakirja/src/environment/mod.rs at line 378
    [3.105774]
    [3.105774]
    debug!("root lock");
  • replacement in sanakirja/src/environment/mod.rs at line 381
    [3.105889][3.4710:4711]()
    [3.105889]
    [3.4711]
    debug!("shared {:?}", root);
    env_.roots[root].rw.lock_shared();
  • edit in sanakirja/src/environment/mod.rs at line 384
    [3.4794]
    [3.4794]
    debug!("old_n_txn: {:?}", old_n_txn);
  • edit in sanakirja/src/environment/mod.rs at line 386
    [3.4826][3.4826:4877]()
    env_.roots[root].rw.lock_shared();
  • edit in sanakirja/src/environment/mod.rs at line 387
    [3.4943]
    [3.4943]
    debug!("file lock shared");
  • edit in sanakirja/src/environment/mod.rs at line 400
    [3.106187]
    [3.5085]
    unsafe { env.roots[self.root].rw.unlock_shared() }
  • edit in sanakirja/src/environment/mod.rs at line 403
    [3.5196][3.5196:5259]()
    unsafe { env.roots[self.root].rw.unlock_shared() }
  • edit in sanakirja/Cargo.toml at line 17
    [3.2944][3.5512:5528]()
    # lmdb-rs = "*"
  • edit in sanakirja/Cargo.toml at line 23
    [3.108745]
    libc = "*"
    # lmdb-rs = "*"