Cleanup + inter-process concurrency
[?]
Feb 1, 2021, 8:50 PM
YWFYZNLZ5JHLIFVBRKZK4TSWVPROUPRG77ZB5M7UHT2OKPL4ZSRQCDependencies
- [2]
PXF3R6SVImproving test coverage for btree::cursor - [3]
X3QVVQISMore debugging (del seems to work now) - [4]
YXKP4AIWNew file locks, with multiple sets of free pages - [5]
EAAYH6BQDebugging put - [6]
ONES3V46reference counting works for put - [7]
OP6SVMODResetting history - [8]
WS4ZQM4RDebugging, tests, etc. - [9]
UAQX27N4Tests - [10]
NQBEOCFOTests cleanup
Change contents
- replacement in sanakirja-core/src/btree/put.rs at line 19
db: &mut Db<T, K, V, P>,db: &mut Db_<T, K, V, P>, - replacement in sanakirja-core/src/btree/mod.rs at line 250
pub struct Db<T: LoadPage, K: Representable<T>, V: Representable<T>, P: BTreePage<T, K, V>> {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
pub fn create_db<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
) -> Result<Db<T, K, V, P>, T::Error> {) -> Result<Db_<T, K, V, P>, T::Error> { - replacement in sanakirja-core/src/btree/mod.rs at line 267
Ok(Db {Ok(Db_ { - replacement in sanakirja-core/src/btree/mod.rs at line 273
pub fn fork_db<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
db: &Db<T, K, V, P>,) -> Result<Db<T, K, V, P>, T::Error> {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
Ok(Db {Ok(Db_ { - edit in sanakirja-core/src/btree/mod.rs at line 297
}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
db: &Db<T, K, V, P>,db: &Db_<T, K, V, P>, - replacement in sanakirja-core/src/btree/del.rs at line 26
db: &mut Db<T, K, V, P>,db: &mut Db_<T, K, V, P>, - replacement in sanakirja-core/src/btree/del.rs at line 45
db: &mut Db<T, K, V, P>,db: &mut Db_<T, K, V, P>, - replacement in sanakirja-core/src/btree/cursor.rs at line 50
pub fn new(db: &Db<T, K, V, P>) -> Self {pub fn new(db: &Db_<T, K, V, P>) -> Self { - edit in sanakirja/src/tests.rs at line 10
use crate::*;type B<T> = btree::page::Page<u64, A<T>>; - replacement in sanakirja/src/tests.rs at line 37
type T<'a> = MutTxn<&'a Env<Exclusive>, ()>;type T<'a> = MutTxn<&'a Env, ()>; - replacement in sanakirja/src/tests.rs at line 42
let env = Env::new_anon(409600000).unwrap();let env = Env::new_anon(409600000, 1).unwrap(); - replacement in sanakirja/src/tests.rs at line 44
let mut db = create_db::<MutTxn<&Env<Exclusive>, ()>, u64, A<T>, B<T>>(&mut txn).unwrap();let mut db = create_db::<MutTxn<&Env, ()>, u64, A<T>>(&mut txn).unwrap(); - replacement in sanakirja/src/tests.rs at line 69
let db2 = fork_db(&mut txn, &db).unwrap();let _db2 = fork_db(&mut txn, &db).unwrap(); - edit in sanakirja/src/tests.rs at line 97
type B = btree::page::Page<u64, ()>; - replacement in sanakirja/src/tests.rs at line 98
let env = Env::new_anon(409600000).unwrap();let env = Env::new_anon(409600000, 1).unwrap(); - replacement in sanakirja/src/tests.rs at line 100
let mut db: Db<_, u64, (), B> = create_db(&mut txn).unwrap();let mut db: Db<_, u64, ()> = create_db(&mut txn).unwrap(); - edit in sanakirja/src/tests.rs at line 102
let now = std::time::SystemTime::now(); - edit in sanakirja/src/tests.rs at line 114
type B = btree::page::Page<u64, ()>; - replacement in sanakirja/src/tests.rs at line 115
let env = Env::new_anon(409600000).unwrap();let env = Env::new_anon(409600000, 1).unwrap(); - replacement in sanakirja/src/tests.rs at line 117
let mut db: Db<_, u64, (), B> = create_db(&mut txn).unwrap();let mut db: Db<_, u64, ()> = create_db(&mut txn).unwrap(); - edit in sanakirja/src/tests.rs at line 120
let now = std::time::SystemTime::now(); - edit in sanakirja/src/tests.rs at line 135
type B = btree::page::Page<u64, ()>; - replacement in sanakirja/src/tests.rs at line 136
let env = Env::new_anon(409600000).unwrap();let env = Env::new_anon(409600000, 1).unwrap(); - replacement in sanakirja/src/tests.rs at line 138
let mut db: Db<_, u64, (), B> = create_db(&mut txn).unwrap();let mut db: Db<_, u64, ()> = create_db(&mut txn).unwrap(); - edit in sanakirja/src/tests.rs at line 140
let now = std::time::SystemTime::now(); - replacement in sanakirja/src/tests.rs at line 155
let env = Env::new_anon(409600000).unwrap();let env = Env::new_anon(409600000, 1).unwrap(); - replacement in sanakirja/src/tests.rs at line 157
let mut db: Db<_, u64, (), B> = create_db(&mut txn).unwrap();let mut db: Db<_, u64, ()> = create_db(&mut txn).unwrap(); - edit in sanakirja/src/tests.rs at line 159
let now = std::time::SystemTime::now(); - replacement in sanakirja/src/tests.rs at line 224
db: &Db<T, K, V, P>,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
impl<E:Borrow<Env>, T> std::fmt::Debug for MutTxn<E, T> {impl<E: Borrow<Env>, T> std::fmt::Debug for MutTxn<E, T> { - replacement in sanakirja/src/environment/muttxn.rs at line 14
env: E,pub(crate) env: E, - replacement in sanakirja/src/environment/muttxn.rs at line 18
rc: Option<btree::Db<Self, u64, (), btree::page::Page<u64, ()>>>,rc: Option<btree::Db<Self, u64, ()>>, - replacement in sanakirja/src/environment/muttxn.rs at line 30
roots: [u64; 508],roots: Vec<u64>, - edit in sanakirja/src/environment/muttxn.rs at line 68
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
debug!("{:?} {:?}", v, env_.roots.len()); - replacement in sanakirja/src/environment/muttxn.rs at line 95
let v0 = *v + n - 1;let v0 = (*v + n - 1) % env_.roots.len();debug!("v = {:?} v0 = {:?}", v, v0); - replacement in sanakirja/src/environment/muttxn.rs at line 100
std::ptr::copy_nonoverlapping(page_ptr, next_page_ptr, PAGE_SIZE);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
roots: [0; 508],roots: Vec::new(), - replacement in sanakirja/src/environment/muttxn.rs at line 142
let mut free_db: btree::Db<Self, u64, (), btree::page::Page<u64, ()>> = btree::Db {let mut free_db: btree::Db<Self, u64, ()> = btree::Db { - replacement in sanakirja/src/environment/muttxn.rs at line 166
let globptr = maps[0].ptr.offset((PAGE_SIZE * *root) as isize) as *mut GlobalHeader;let globptr = maps[0].ptr.add(*root * PAGE_SIZE) as *mut GlobalHeader; - edit in sanakirja/src/environment/muttxn.rs at line 170
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
if self.roots.get(num).is_none() {self.roots.resize(num + 1, 0u64);} - replacement in sanakirja/src/environment/muttxn.rs at line 219
let mut db: btree::Db<Self, u64, (), btree::page::Page<u64, ()>> = btree::Db {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 }));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
return Ok(())return Ok(()); - replacement in sanakirja/src/environment/muttxn.rs at line 316
return Ok(())return Ok(()); - replacement in sanakirja/src/environment/muttxn.rs at line 346
debug!("put in RC: {:?} {:?}", rc, off|2);debug!("put in RC: {:?} {:?}", rc, off | 2); - edit in sanakirja/src/environment/muttxn.rs at line 376
}}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
use parking_lot::lock_api::RawRwLock;use parking_lot::Mutex; - edit in sanakirja/src/environment/mod.rs at line 4
use parking_lot::lock_api::RawRwLock;use parking_lot::Mutex; - replacement in sanakirja/src/environment/mod.rs at line 7
use sanakirja_core::CowPage;use sanakirja_core::{CowPage, Representable}; - edit in sanakirja/src/environment/mod.rs at line 10
#[cfg(feature = "mmap")]use std::fs::OpenOptions; - edit in sanakirja/src/environment/mod.rs at line 16
#[cfg(feature = "mmap")]use std::fs::OpenOptions; - edit in sanakirja/src/environment/mod.rs at line 49
// 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
root: Mutex<usize>,pub(crate) root: Mutex<usize>, - replacement in sanakirja/src/environment/mod.rs at line 121
pub unsafe fn new_nolock<P: AsRef<Path>>(path: P, length: u64, n_roots: usize) -> Result<Self, Error> {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
let length = (length + 4095) & !4096;let length = (length + 4095) & !4095; - edit in sanakirja/src/environment/mod.rs at line 238
- replacement in sanakirja/src/environment/mod.rs at line 257
.open(path.join("db").with_extension(&format!("lock{}", n)))?.open(path.join("db").with_extension(&format!("lock{}", n)))?, - replacement in sanakirja/src/environment/mod.rs at line 267
let length = (std::cmp::max(length, 4096) + 4095) & !4096;let length = (std::cmp::max(length, 4096) + 4095) & !4095; - replacement in sanakirja/src/environment/mod.rs at line 276
let length = std::cmp::max(length, 4096).next_power_of_two();let length = (std::cmp::max(length, 4096) + 4095) & !4095; - edit in sanakirja/src/environment/mod.rs at line 422
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
pub const GLOBAL_HEADER_SIZE: usize = 32;pub const N_ROOTS: usize = 508; - edit in sanakirja/src/environment/global_header.rs at line 34
}}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(),