pijul nest
guest [sign in]

Cleanup + inter-process concurrency

[?]
Feb 1, 2021, 8:50 PM
YWFYZNLZ5JHLIFVBRKZK4TSWVPROUPRG77ZB5M7UHT2OKPL4ZSRQC

Dependencies

Change contents

  • replacement in sanakirja-core/src/btree/put.rs at line 19
    [5.4230][5.4230:4259]()
    db: &mut Db<T, K, V, P>,
    [5.4230]
    [5.4259]
    db: &mut Db_<T, K, V, P>,
  • replacement in sanakirja-core/src/btree/mod.rs at line 250
    [5.52016][5.52016:52110]()
    pub struct Db<T: LoadPage, K: Representable<T>, V: Representable<T>, P: BTreePage<T, K, V>> {
    [5.52016]
    [5.31135]
    pub struct Db_<T: LoadPage, K: Representable<T>, V: Representable<T>, P: BTreePage<T, K, V>> {
  • replacement in sanakirja-core/src/btree/mod.rs at line 255
    [5.52188][5.52188:52206]()
    pub fn create_db<
    [5.52188]
    [5.52206]
    pub type Db<T, K, V> = Db_<T, K, V, page::Page<K, V>>;
    pub fn create_db_<
  • replacement in sanakirja-core/src/btree/mod.rs at line 264
    [5.52324][5.52324:52364]()
    ) -> Result<Db<T, K, V, P>, T::Error> {
    [5.52324]
    [5.31157]
    ) -> Result<Db_<T, K, V, P>, T::Error> {
  • replacement in sanakirja-core/src/btree/mod.rs at line 267
    [5.31219][5.52417:52429](),[5.52417][5.52417:52429]()
    Ok(Db {
    [5.31219]
    [5.52429]
    Ok(Db_ {
  • replacement in sanakirja-core/src/btree/mod.rs at line 273
    [5.3887][5.3887:3903]()
    pub fn fork_db<
    [5.3887]
    [5.3903]
    pub fn create_db<
    T: AllocPage + core::fmt::Debug,
    K: Representable<T> + core::fmt::Debug,
    V: Representable<T> + core::fmt::Debug,
    >(
    txn: &mut T,
    ) -> Result<Db_<T, K, V, page::Page<K, V>>, T::Error> {
    create_db_(txn)
    }
    pub fn fork_db_<
  • replacement in sanakirja-core/src/btree/mod.rs at line 290
    [5.4021][5.4021:4086]()
    db: &Db<T, K, V, P>,
    ) -> Result<Db<T, K, V, P>, T::Error> {
    [5.4021]
    [5.4086]
    db: &Db_<T, K, V, P>,
    ) -> Result<Db_<T, K, V, P>, T::Error> {
  • replacement in sanakirja-core/src/btree/mod.rs at line 293
    [5.4118][5.4118:4130]()
    Ok(Db {
    [5.4118]
    [5.4130]
    Ok(Db_ {
  • edit in sanakirja-core/src/btree/mod.rs at line 297
    [5.4199]
    [5.404]
    }
    pub fn fork_db<
    T: AllocPage + core::fmt::Debug,
    K: Representable<T> + core::fmt::Debug,
    V: Representable<T> + core::fmt::Debug,
    >(
    txn: &mut T,
    db: &Db<T, K, V>,
    ) -> Result<Db<T, K, V>, T::Error> {
    fork_db_(txn, db)
  • replacement in sanakirja-core/src/btree/mod.rs at line 313
    [5.518][5.518:543]()
    db: &Db<T, K, V, P>,
    [5.518]
    [5.543]
    db: &Db_<T, K, V, P>,
  • replacement in sanakirja-core/src/btree/del.rs at line 26
    [5.53416][5.53416:53445]()
    db: &mut Db<T, K, V, P>,
    [5.53416]
    [5.53445]
    db: &mut Db_<T, K, V, P>,
  • replacement in sanakirja-core/src/btree/del.rs at line 45
    [5.53873][5.53873:53902]()
    db: &mut Db<T, K, V, P>,
    [5.53873]
    [5.53902]
    db: &mut Db_<T, K, V, P>,
  • replacement in sanakirja-core/src/btree/cursor.rs at line 50
    [5.65307][5.65307:65353]()
    pub fn new(db: &Db<T, K, V, P>) -> Self {
    [5.65307]
    [5.65353]
    pub fn new(db: &Db_<T, K, V, P>) -> Self {
  • edit in sanakirja/src/tests.rs at line 10
    [5.205][5.205:262]()
    use crate::*;
    type B<T> = btree::page::Page<u64, A<T>>;
  • replacement in sanakirja/src/tests.rs at line 37
    [5.979][5.979:1024]()
    type T<'a> = MutTxn<&'a Env<Exclusive>, ()>;
    [5.979]
    [5.1024]
    type T<'a> = MutTxn<&'a Env, ()>;
  • replacement in sanakirja/src/tests.rs at line 42
    [5.1091][5.1091:1140]()
    let env = Env::new_anon(409600000).unwrap();
    [5.1091]
    [5.1140]
    let env = Env::new_anon(409600000, 1).unwrap();
  • replacement in sanakirja/src/tests.rs at line 44
    [5.1193][5.1193:1288]()
    let mut db = create_db::<MutTxn<&Env<Exclusive>, ()>, u64, A<T>, B<T>>(&mut txn).unwrap();
    [5.1193]
    [5.1288]
    let mut db = create_db::<MutTxn<&Env, ()>, u64, A<T>>(&mut txn).unwrap();
  • replacement in sanakirja/src/tests.rs at line 69
    [5.2242][5.2242:2289]()
    let db2 = fork_db(&mut txn, &db).unwrap();
    [5.2242]
    [5.2289]
    let _db2 = fork_db(&mut txn, &db).unwrap();
  • edit in sanakirja/src/tests.rs at line 97
    [5.4293][5.4293:4334]()
    type B = btree::page::Page<u64, ()>;
  • replacement in sanakirja/src/tests.rs at line 98
    [5.4376][5.4376:4425]()
    let env = Env::new_anon(409600000).unwrap();
    [5.4376]
    [5.4425]
    let env = Env::new_anon(409600000, 1).unwrap();
  • replacement in sanakirja/src/tests.rs at line 100
    [5.4478][5.4478:4544]()
    let mut db: Db<_, u64, (), B> = create_db(&mut txn).unwrap();
    [5.4478]
    [5.4544]
    let mut db: Db<_, u64, ()> = create_db(&mut txn).unwrap();
  • edit in sanakirja/src/tests.rs at line 102
    [5.4572][5.4572:4616]()
    let now = std::time::SystemTime::now();
  • edit in sanakirja/src/tests.rs at line 114
    [5.4977][5.4977:5018]()
    type B = btree::page::Page<u64, ()>;
  • replacement in sanakirja/src/tests.rs at line 115
    [5.5060][5.5060:5109]()
    let env = Env::new_anon(409600000).unwrap();
    [5.5060]
    [5.5109]
    let env = Env::new_anon(409600000, 1).unwrap();
  • replacement in sanakirja/src/tests.rs at line 117
    [5.5162][5.5162:5228]()
    let mut db: Db<_, u64, (), B> = create_db(&mut txn).unwrap();
    [5.5162]
    [5.5228]
    let mut db: Db<_, u64, ()> = create_db(&mut txn).unwrap();
  • edit in sanakirja/src/tests.rs at line 120
    [5.5276][5.5276:5320]()
    let now = std::time::SystemTime::now();
  • edit in sanakirja/src/tests.rs at line 135
    [3.8909][3.8909:8950]()
    type B = btree::page::Page<u64, ()>;
  • replacement in sanakirja/src/tests.rs at line 136
    [3.8992][3.8992:9041]()
    let env = Env::new_anon(409600000).unwrap();
    [3.8992]
    [3.9041]
    let env = Env::new_anon(409600000, 1).unwrap();
  • replacement in sanakirja/src/tests.rs at line 138
    [3.9094][3.9094:9160]()
    let mut db: Db<_, u64, (), B> = create_db(&mut txn).unwrap();
    [3.9094]
    [3.9160]
    let mut db: Db<_, u64, ()> = create_db(&mut txn).unwrap();
  • edit in sanakirja/src/tests.rs at line 140
    [3.9186][3.9186:9230]()
    let now = std::time::SystemTime::now();
  • replacement in sanakirja/src/tests.rs at line 155
    [5.5784][5.5784:5833]()
    let env = Env::new_anon(409600000).unwrap();
    [5.5784]
    [5.5833]
    let env = Env::new_anon(409600000, 1).unwrap();
  • replacement in sanakirja/src/tests.rs at line 157
    [5.5886][5.5886:5952]()
    let mut db: Db<_, u64, (), B> = create_db(&mut txn).unwrap();
    [5.5886]
    [3.9953]
    let mut db: Db<_, u64, ()> = create_db(&mut txn).unwrap();
  • edit in sanakirja/src/tests.rs at line 159
    [3.9979][5.5977:6021](),[5.5977][5.5977:6021]()
    let now = std::time::SystemTime::now();
  • replacement in sanakirja/src/tests.rs at line 224
    [5.7976][5.7976:8001]()
    db: &Db<T, K, V, P>,
    [5.7976]
    [5.8001]
    db: &Db_<T, K, V, P>,
  • edit in sanakirja/src/tests.rs at line 248
    [5.8740]
    #[cfg(target_family="unix")]
    #[test]
    fn multi_txn() {
    env_logger::try_init().unwrap_or(());
    std::fs::remove_dir_all("/tmp/sanakirja0").unwrap_or(());
    std::fs::create_dir_all("/tmp/sanakirja0").unwrap();
    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 mut 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 mut 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 mut txn = Env::mut_txn_begin(&env).unwrap();
    debug!("txn.root = {:?}", txn.env.root);
    txn.commit().unwrap();
    debug!("commit done");
    }
  • replacement in sanakirja/src/environment/muttxn.rs at line 6
    [5.80263][4.0:58]()
    impl<E:Borrow<Env>, T> std::fmt::Debug for MutTxn<E, T> {
    [5.80263]
    [5.37172]
    impl<E: Borrow<Env>, T> std::fmt::Debug for MutTxn<E, T> {
  • replacement in sanakirja/src/environment/muttxn.rs at line 14
    [4.98][5.80340:80352](),[5.80340][5.80340:80352]()
    env: E,
    [4.98]
    [5.80352]
    pub(crate) env: E,
  • replacement in sanakirja/src/environment/muttxn.rs at line 18
    [5.37308][5.80400:80470](),[2.1320][5.80400:80470](),[5.80400][5.80400:80470]()
    rc: Option<btree::Db<Self, u64, (), btree::page::Page<u64, ()>>>,
    [2.1320]
    [5.80470]
    rc: Option<btree::Db<Self, u64, ()>>,
  • replacement in sanakirja/src/environment/muttxn.rs at line 30
    [5.80877][5.80877:80900]()
    roots: [u64; 508],
    [5.80877]
    [5.80900]
    roots: Vec<u64>,
  • edit in sanakirja/src/environment/muttxn.rs at line 68
    [5.81918]
    [5.81918]
    for (n, &r) in self.roots.iter().enumerate() {
    if r > 0 {
    if self.parent.roots.get(n).is_none() {
    self.parent.roots.resize(n + 1, 0u64)
    }
    self.parent.roots[n] = r
    }
    }
  • edit in sanakirja/src/environment/muttxn.rs at line 94
    [4.578][5.82455:82513](),[5.82455][5.82455:82513]()
    debug!("{:?} {:?}", v, env_.roots.len());
  • replacement in sanakirja/src/environment/muttxn.rs at line 95
    [4.623][4.623:660]()
    let v0 = *v + n - 1;
    [4.623]
    [5.82513]
    let v0 = (*v + n - 1) % env_.roots.len();
    debug!("v = {:?} v0 = {:?}", v, v0);
  • replacement in sanakirja/src/environment/muttxn.rs at line 100
    [4.808][5.82745:82828](),[5.82745][5.82745:82828]()
    std::ptr::copy_nonoverlapping(page_ptr, next_page_ptr, PAGE_SIZE);
    [4.808]
    [5.82828]
    std::ptr::copy_nonoverlapping(page_ptr.add(8), next_page_ptr.add(8), PAGE_SIZE - 8);
  • replacement in sanakirja/src/environment/muttxn.rs at line 133
    [5.83993][5.83993:84026]()
    roots: [0; 508],
    [5.83993]
    [5.84026]
    roots: Vec::new(),
  • replacement in sanakirja/src/environment/muttxn.rs at line 142
    [5.84183][5.84183:84279]()
    let mut free_db: btree::Db<Self, u64, (), btree::page::Page<u64, ()>> = btree::Db {
    [5.84183]
    [5.84279]
    let mut free_db: btree::Db<Self, u64, ()> = btree::Db {
  • replacement in sanakirja/src/environment/muttxn.rs at line 166
    [5.4489][5.85286:85383](),[5.85286][5.85286:85383]()
    let globptr = maps[0].ptr.offset((PAGE_SIZE * *root) as isize) as *mut GlobalHeader;
    [5.4489]
    [5.85383]
    let globptr = maps[0].ptr.add(*root * PAGE_SIZE) as *mut GlobalHeader;
  • edit in sanakirja/src/environment/muttxn.rs at line 170
    [5.85507]
    [5.85507]
    let root_dbs = std::slice::from_raw_parts_mut(
    maps[0].ptr.add(*root * PAGE_SIZE + GLOBAL_HEADER_SIZE) as *mut u64,
    N_ROOTS,
    );
    for (&r, rr) in self.roots.iter().zip(root_dbs.iter_mut()) {
    debug!("root_db: {:?}", rr as *mut u64);
    debug!("committing root: {:?} {:?}", r, rr);
    *rr = r
    }
  • edit in sanakirja/src/environment/muttxn.rs at line 200
    [5.86111]
    [5.86111]
    if self.roots.get(num).is_none() {
    self.roots.resize(num + 1, 0u64);
    }
  • replacement in sanakirja/src/environment/muttxn.rs at line 219
    [5.86537][5.86537:86624]()
    let mut db: btree::Db<Self, u64, (), btree::page::Page<u64, ()>> = btree::Db {
    [5.86537]
    [5.86624]
    let mut db: btree::Db<Self, u64, ()> = btree::Db {
  • replacement in sanakirja/src/environment/muttxn.rs at line 259
    [5.38235][5.38235:38334](),[5.38334][5.88311:88331](),[5.88311][5.88311:88331](),[5.88331][5.38335:38418]()
    let page = MutPage(CowPage {
    data,
    offset,
    });
    self.occupied_owned_pages.push(MutPage(CowPage { data, offset }));
    [5.38235]
    [5.88385]
    let page = MutPage(CowPage { data, offset });
    self.occupied_owned_pages
    .push(MutPage(CowPage { data, offset }));
  • replacement in sanakirja/src/environment/muttxn.rs at line 286
    [5.1934][5.38850:38880](),[5.38850][5.38850:38880]()
    return Ok(())
    [5.1934]
    [5.1935]
    return Ok(());
  • replacement in sanakirja/src/environment/muttxn.rs at line 316
    [5.2243][5.39361:39391](),[5.89846][5.39361:39391]()
    return Ok(())
    [5.2243]
    [5.2244]
    return Ok(());
  • replacement in sanakirja/src/environment/muttxn.rs at line 346
    [5.2408][5.2408:2463]()
    debug!("put in RC: {:?} {:?}", rc, off|2);
    [5.2408]
    [5.2463]
    debug!("put in RC: {:?} {:?}", rc, off | 2);
  • edit in sanakirja/src/environment/muttxn.rs at line 376
    [5.91588]
    [5.91588]
    }
    }
    impl<E: Borrow<Env>, T> RootDb for MutTxn<E, T> {
    fn root_db<
    K: Representable<Self>,
    V: Representable<Self>,
    >(
    &self,
    n: usize,
    ) -> Result<Option<sanakirja_core::btree::Db<Self, K, V>>, Error> {
    use sanakirja_core::LoadPage;
    if let Some(db) = self.roots.get(n) {
    Ok(Some(sanakirja_core::btree::Db {
    db: self.load_page(*db)?,
    marker: std::marker::PhantomData,
    }))
    } else {
    unsafe {
    let env = self.env.borrow();
    let db = {
    let root = env.root.lock();
    let maps = env.mmaps.lock();
    *(maps[0].ptr.add(*root * PAGE_SIZE + GLOBAL_HEADER_SIZE + 8 * n) as *mut u64)
    };
    if db != 0 {
    Ok(Some(sanakirja_core::btree::Db {
    db: self.load_page(db)?,
    marker: std::marker::PhantomData,
    }))
    } else {
    Ok(None)
    }
    }
    }
  • edit in sanakirja/src/environment/mod.rs at line 2
    [5.91625][5.91625:91687]()
    use parking_lot::lock_api::RawRwLock;
    use parking_lot::Mutex;
  • edit in sanakirja/src/environment/mod.rs at line 4
    [4.1299]
    [5.91733]
    use parking_lot::lock_api::RawRwLock;
    use parking_lot::Mutex;
  • replacement in sanakirja/src/environment/mod.rs at line 7
    [5.91734][5.39915:39944]()
    use sanakirja_core::CowPage;
    [5.91734]
    [4.1300]
    use sanakirja_core::{CowPage, Representable};
  • edit in sanakirja/src/environment/mod.rs at line 10
    [4.1326]
    [4.1326]
    #[cfg(feature = "mmap")]
    use std::fs::OpenOptions;
  • edit in sanakirja/src/environment/mod.rs at line 16
    [4.1434][4.1434:1485]()
    #[cfg(feature = "mmap")]
    use std::fs::OpenOptions;
  • edit in sanakirja/src/environment/mod.rs at line 49
    [5.92836][5.92836:93218]()
    // Lock order: first take thread locks, then process locks.
    // Why are there two synchronization mechanisms?
    // Because we would need to upgrade the read lock into a write lock,
    // and there is no real way to do this with standard mechanisms.
    // So, we take a mutex to make sure no other mutable transaction can start,
    // and then at the time of writing, we also take the RwLock.
  • replacement in sanakirja/src/environment/mod.rs at line 61
    [4.1617][5.93775:93799](),[5.93775][5.93775:93799]()
    root: Mutex<usize>,
    [4.1617]
    [5.93799]
    pub(crate) root: Mutex<usize>,
  • replacement in sanakirja/src/environment/mod.rs at line 121
    [5.95236][4.2029:2137]()
    pub unsafe fn new_nolock<P: AsRef<Path>>(path: P, length: u64, n_roots: usize) -> Result<Self, Error> {
    [5.95236]
    [5.95328]
    pub unsafe fn new_nolock<P: AsRef<Path>>(
    path: P,
    length: u64,
    n_roots: usize,
    ) -> Result<Self, Error> {
  • replacement in sanakirja/src/environment/mod.rs at line 134
    [5.95677][4.2138:2184]()
    let length = (length + 4095) & !4096;
    [5.95677]
    [5.95726]
    let length = (length + 4095) & !4095;
  • edit in sanakirja/src/environment/mod.rs at line 238
    [4.3259][5.99664:99665](),[5.99664][5.99664:99665]()
  • replacement in sanakirja/src/environment/mod.rs at line 257
    [4.4049][4.4049:4131]()
    .open(path.join("db").with_extension(&format!("lock{}", n)))?
    [4.4049]
    [4.4131]
    .open(path.join("db").with_extension(&format!("lock{}", n)))?,
  • replacement in sanakirja/src/environment/mod.rs at line 267
    [4.4230][4.4230:4297]()
    let length = (std::cmp::max(length, 4096) + 4095) & !4096;
    [4.4230]
    [5.102110]
    let length = (std::cmp::max(length, 4096) + 4095) & !4095;
  • replacement in sanakirja/src/environment/mod.rs at line 276
    [4.4432][5.102472:102542](),[5.102472][5.102472:102542]()
    let length = std::cmp::max(length, 4096).next_power_of_two();
    [4.4432]
    [5.102542]
    let length = (std::cmp::max(length, 4096) + 4095) & !4095;
  • edit in sanakirja/src/environment/mod.rs at line 422
    [5.106701]
    [5.106701]
    pub trait RootDb: Sized + sanakirja_core::LoadPage {
    fn root_db<
    K: Representable<Self>,
    V: Representable<Self>,
    >(
    &self,
    n: usize,
    ) -> Result<Option<sanakirja_core::btree::Db<Self, K, V>>, Self::Error>;
    }
  • edit in sanakirja/src/environment/global_header.rs at line 1
    [5.107218]
    [5.107219]
    pub const GLOBAL_HEADER_SIZE: usize = 32;
    pub const N_ROOTS: usize = 508;
  • edit in sanakirja/src/environment/global_header.rs at line 34
    [5.108041][5.108041:108379]()
    }
    }
    pub fn to_le(&self) -> Self {
    GlobalHeader {
    version: self.version.to_le(),
    root: self.root,
    n_roots: self.n_roots,
    crc: self.crc.to_le(),
    free_db: self.free_db.to_le(),
    length: self.length.to_le(),
    rc_db: self.rc_db.to_le(),