pijul nest
guest [sign in]

Single file databases + CRC for the root pages (checking the other pages makes everything very slow)

[?]
Feb 18, 2021, 9:53 PM
W2MIZD5BNL7A5HVFWTESF57QU7T6QMEF4RBSLFQXMEEU3XD2NU2QC

Dependencies

Change contents

  • edit in sanakirja-core/src/lib.rs at line 225
    [3.1627]
    [3.116]
    }
    }
    #[cfg(feature = "crc32")]
    pub fn crc(&self, hasher: &crc32fast::Hasher) -> u32 {
    let mut hasher = hasher.clone();
    hasher.reset();
    // Hash the beginning and the end of the page (i.e. remove
    // the CRC).
    unsafe {
    hasher.update(core::slice::from_raw_parts(self.data, 4));
    hasher.update(core::slice::from_raw_parts(
    self.data.offset(8),
    PAGE_SIZE - 8,
    ));
  • edit in sanakirja-core/src/lib.rs at line 241
    [3.126]
    [15.495]
    hasher.finalize()
    }
    #[cfg(feature = "crc32")]
    pub fn crc_check(&self, hasher: &crc32fast::Hasher) -> bool {
    let crc = unsafe { u32::from_le(*(self.data as *const u32)) };
    self.crc(hasher) == crc
  • edit in sanakirja-core/src/lib.rs at line 257
    [3.2570]
    [3.2570]
    #[cfg(not(feature = "crc32"))]
  • edit in sanakirja-core/src/lib.rs at line 260
    [3.403]
    [3.1638]
    }
    #[cfg(feature = "crc32")]
    pub fn clear_dirty(&mut self, hasher: &crc32fast::Hasher) {
    unsafe {
    *self.0.data &= 0xfe;
    let crc = (self.0.data as *mut u32).offset(1);
    *crc = self.0.crc(hasher)
    }
  • replacement in sanakirja-core/Cargo.toml at line 3
    [3.70812][3.70812:70847]()
    version = "0.1.0"
    authors = ["pe"]
    [3.70812]
    [3.70847]
    version = "1.0.0"
  • edit in sanakirja-core/Cargo.toml at line 5
    [3.70864]
    [3.70864]
    description = "Copy-on-write datastructures, storable on disk (or elsewhere) with a stable format."
    authors = ["Pierre-Étienne Meunier", "Florent Becker"]
    license = "MIT/Apache-2.0"
    documentation = "https://docs.rs/sanakirja"
    repository = "https://nest.pijul.com/pijul/sanakirja"
    include = [
    "Cargo.toml",
    "src/lib.rs",
    "src",
    "src/btree",
    "src/btree/page_cursor.rs",
    "src/btree/page_unsized",
    "src/btree/page_unsized/alloc.rs",
    "src/btree/page_unsized/rebalance.rs",
    "src/btree/page_unsized/header.rs",
    "src/btree/page_unsized/put.rs",
    "src/btree/page_unsized/cursor.rs",
    "src/btree/put.rs",
    "src/btree/page",
    "src/btree/page/alloc.rs",
    "src/btree/page/rebalance.rs",
    "src/btree/page/put.rs",
    "src/btree/del.rs",
    "src/btree/mod.rs",
    "src/btree/page_unsized.rs",
    "src/btree/cursor.rs",
    "src/btree/page.rs"
    ]
  • replacement in sanakirja-core/Cargo.toml at line 34
    [3.70865][3.70865:70962]()
    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    [3.70865]
    [3.70962]
    [features]
    crc32 = [ "crc32fast" ]
  • replacement in sanakirja-core/Cargo.toml at line 38
    [3.70978][3.70978:70988]()
    log = "*"
    [3.70978]
    log = "0.4"
    crc32fast = { version = "1.2", optional = true, default-features = false }
  • edit in sanakirja/src/tests.rs at line 22
    [17.25573]
    [16.978]
    #[test]
    pub fn put_growth() {
    env_logger::try_init().unwrap_or(());
    let path = tempfile::tempdir().unwrap();
    let path = path.path().join("db");
    let l0 = 1 << 13; // 2 pages
    let env = Env::new(&path, l0, 1).unwrap();
    let mut txn = Env::mut_txn_begin(&env).unwrap();
    let mut db = create_db::<MutTxn<&Env, ()>, u64, u64>(&mut txn).unwrap();
    let n = 100_000u64;
    for i in 0..n {
    put(&mut txn, &mut db, &i, &i).unwrap();
    }
    println!("{:?}", env.mmaps);
    let len = std::fs::metadata(&path).unwrap().len();
    assert_eq!(len, (l0 << 9) - l0);
    }
  • replacement in sanakirja/src/tests.rs at line 412
    [3.15725][3.15725:15757]()
    txn.set_root(0, db.db);
    [3.15725]
    [3.1997]
    txn.set_root(1, db.db);
  • replacement in sanakirja/src/tests.rs at line 421
    [3.2220][3.2220:2290]()
    let env = Env::new("/tmp/sanakirja0", 4096 * 20, 2).unwrap();
    [3.2220]
    [3.2290]
    let env = Env::new("/tmp/sanakirja0/db", 4096 * 20, 2).unwrap();
  • replacement in sanakirja/src/tests.rs at line 535
    [3.1328][3.1328:1400]()
    let env = Env::new("/tmp/sanakirja0", 409_600_000, 2).unwrap();
    [3.1328]
    [3.1400]
    let env = Env::new("/tmp/sanakirja0/db", 409_600_000, 2).unwrap();
  • edit in sanakirja/src/lib.rs at line 1
    [3.79574]
    [3.79575]
    //! Transactional, on-disk datastructures with concurrent readers and
    //! writers (writers exclude each other).
    //!
    //! This crate is based on the no-std crate `sanakirja-core`, whose
    //! goal is to implement different datastructures.
  • replacement in sanakirja/src/lib.rs at line 8
    [3.79594][3.79594:79615]()
    pub mod environment;
    [3.79594]
    [3.176]
    mod environment;
  • edit in sanakirja/src/lib.rs at line 15
    [3.4433]
    [18.1749]
    #[doc(hidden)]
  • edit in sanakirja/src/environment/muttxn.rs at line 104
    [3.82918]
    [3.15983]
    env_.check_crc(v0)?;
  • edit in sanakirja/src/environment/muttxn.rs at line 137
    [3.84057]
    [3.84057]
    }
    #[cfg(feature = "crc32")]
    fn clear_dirty(p: &mut MutPage) {
    p.clear_dirty(&HASHER)
  • edit in sanakirja/src/environment/muttxn.rs at line 144
    [3.84060]
    [3.809]
    #[cfg(not(feature = "crc32"))]
    fn clear_dirty(p: &mut MutPage) {
    p.clear_dirty()
    }
  • replacement in sanakirja/src/environment/muttxn.rs at line 162
    [3.85113][3.85113:85146]()
    p.clear_dirty();
    [3.85113]
    [3.85146]
    clear_dirty(p);
  • edit in sanakirja/src/environment/muttxn.rs at line 184
    [3.3933]
    [3.85507]
    set_crc(maps[0].ptr.add(*root * PAGE_SIZE));
  • replacement in sanakirja/src/environment/muttxn.rs at line 187
    [3.85584][3.85584:85644](),[3.85828][3.858:906]()
    let globptr = maps[0].ptr as *mut GlobalHeader;
    (&mut *globptr).root = *root as u8;
    [3.85584]
    [3.85828]
    (&mut *(maps[0].ptr as *mut GlobalHeader)).root = *root as u8;
  • replacement in sanakirja/src/environment/mod.rs at line 15
    [3.1402][3.1402:1434]()
    use std::path::{Path, PathBuf};
    [3.1402]
    [3.1485]
    use std::path::Path;
  • edit in sanakirja/src/environment/mod.rs at line 31
    [3.92008][3.92008:92041](),[3.92041][3.92041:92070]()
    file: Option<std::fs::File>,
    #[cfg(feature = "mmap")]
  • replacement in sanakirja/src/environment/mod.rs at line 53
    [3.93428][3.93428:93455]()
    path: Option<PathBuf>,
    [3.93428]
    [3.93659]
    file: Option<std::fs::File>,
  • edit in sanakirja/src/environment/mod.rs at line 80
    [3.94033][3.94033:94061]()
    drop(map.file);
  • edit in sanakirja/src/environment/mod.rs at line 100
    [3.94464]
    [3.2017]
    #[cfg(feature = "mmap")]
    #[test]
    #[should_panic]
    fn nroots_test() {
    let path = tempfile::tempdir().unwrap();
    let path = path.path().join("db");
    let l0 = 1 << 15; // 8 pages
    Env::new(&path, l0, 19).unwrap();
    }
    #[cfg(feature = "mmap")]
    #[test]
    fn mmap_growth_test() {
    let path = tempfile::tempdir().unwrap();
    let path = path.path().join("db");
    let l0 = 1 << 15; // 8 pages
    {
    let env = Env::new(&path, l0, 2).unwrap();
    let map1 = env.open_mmap(0, l0).unwrap();
    println!("{:?}", map1);
    let map2 = env.open_mmap(1, l0).unwrap();
    println!("{:?}", map2);
    map1.flush().unwrap();
    map2.flush().unwrap();
    }
    let len = std::fs::metadata(&path).unwrap().len();
    assert_eq!(len, (l0 << 2) - l0);
    }
    #[cfg(not(feature = "crc32"))]
    fn set_crc(_ptr: *mut u8) {}
    #[cfg(feature = "crc32")]
    fn set_crc(ptr: *mut u8) {
    unsafe {
    let root_page = std::slice::from_raw_parts(ptr.add(8), PAGE_SIZE - 8);
    let mut h = HASHER.clone();
    h.update(root_page);
    let globptr = ptr as *mut GlobalHeader;
    (&mut *globptr).crc = h.finalize().to_le();
    }
    }
  • replacement in sanakirja/src/environment/mod.rs at line 146
    [3.94614][3.94614:94709]()
    let db_path = path.as_ref().join("db");
    Ok(std::fs::metadata(&db_path)?.len())
    [3.94614]
    [3.94709]
    Ok(std::fs::metadata(&path)?.len())
  • replacement in sanakirja/src/environment/mod.rs at line 166
    [3.2137][3.95328:95563](),[3.5849][3.95328:95563](),[3.95328][3.95328:95563]()
    // let length = (1 as u64).shl(log_length);
    let mut db_path = path.as_ref().join("db0");
    let db_exists = std::fs::metadata(&db_path).is_ok();
    let length = if let Ok(meta) = std::fs::metadata(&db_path) {
    [3.5849]
    [3.95563]
    let db_exists = std::fs::metadata(&path).is_ok();
    let length = if let Ok(meta) = std::fs::metadata(&path) {
  • replacement in sanakirja/src/environment/mod.rs at line 178
    [3.95868][3.95868:95898]()
    .open(&db_path)?;
    [3.95868]
    [3.95898]
    .open(&path)?;
  • replacement in sanakirja/src/environment/mod.rs at line 181
    [3.95982][3.2185:2278](),[3.2278][3.96066:96139](),[3.96066][3.96066:96139]()
    let mut env = Self::new_nolock_mmap(Some(file), length, mmap, !db_exists, n_roots)?;
    db_path.pop();
    env.path = Some(db_path);
    Ok(env)
    [3.95982]
    [3.96139]
    Self::new_nolock_mmap(Some(file), length, mmap, !db_exists, n_roots)
  • edit in sanakirja/src/environment/mod.rs at line 192
    [3.96356]
    [3.96356]
    assert!(n_roots < ((length >> 12) as usize));
  • replacement in sanakirja/src/environment/mod.rs at line 194
    [3.96418][3.96418:96453]()
    let glob = if initialise {
    [3.96393]
    [3.96453]
    if initialise {
  • replacement in sanakirja/src/environment/mod.rs at line 196
    [3.96487][3.2304:2384]()
    *(map.add(i * PAGE_SIZE) as *mut GlobalHeader) = GlobalHeader {
    [3.96487]
    [3.96570]
    *(map.add(i * PAGE_SIZE) as *mut GlobalHeader) = (GlobalHeader {
  • replacement in sanakirja/src/environment/mod.rs at line 204
    [3.96813][3.96813:96832]()
    };
    [3.96813]
    [3.96832]
    })
    .to_le();
    set_crc(map.add(i * PAGE_SIZE));
  • replacement in sanakirja/src/environment/mod.rs at line 209
    [3.96846][3.2459:2525](),[3.2525][3.96911:96928](),[3.96911][3.96911:96928](),[3.96928][3.2526:2592](),[3.2592][3.96993:97004](),[3.96993][3.96993:97004]()
    GlobalHeader::from_le(&*(map as *const GlobalHeader))
    } else {
    GlobalHeader::from_le(&*(map as *const GlobalHeader))
    };
    [3.96846]
    [3.2593]
    }
    let glob = GlobalHeader::from_le(&*(map as *const GlobalHeader));
  • replacement in sanakirja/src/environment/mod.rs at line 220
    [3.97191][3.97191:97215]()
    path: None,
    [3.97191]
    [3.97215]
    file,
  • edit in sanakirja/src/environment/mod.rs at line 224
    [3.97304][3.97304:97326]()
    file,
  • edit in sanakirja/src/environment/mod.rs at line 271
    [3.98907][3.98907:98909]()
    }
  • edit in sanakirja/src/environment/mod.rs at line 272
    [3.98910][3.3248:3259]()
    impl Env {
  • replacement in sanakirja/src/environment/mod.rs at line 291
    [3.4049][3.5897:5980]()
    .open(path.join("db").with_extension(&format!("lock{}", n)))?,
    [3.4049]
    [3.4131]
    .open(path.with_extension(&format!("lock{}", n)))?,
  • replacement in sanakirja/src/environment/mod.rs at line 331
    [3.103141][3.103141:103577]()
    if let Some(ref path) = self.path {
    let mut db_path = path.join(&format!("db{}", i));
    let file = OpenOptions::new()
    .read(true)
    .write(true)
    .truncate(false)
    .create(true)
    .open(&db_path)?;
    file.set_len(length)?;
    db_path.pop();
    let mut mmap = unsafe { memmap::MmapMut::map_mut(&file)? };
    [3.103141]
    [3.103577]
    let offset = (length0 << i) - length0;
    if let Some(ref file) = self.file {
    file.set_len(offset + length)?;
    let mut mmap = unsafe {
    memmap::MmapOptions::new()
    .offset(offset)
    .len(length as usize)
    .map_mut(&file)?
    };
  • edit in sanakirja/src/environment/mod.rs at line 343
    [3.103660][3.103660:103694]()
    file: Some(file),
  • edit in sanakirja/src/environment/mod.rs at line 350
    [3.103905][3.103905:103933]()
    file: None,
  • edit in sanakirja/src/environment/mod.rs at line 402
    [3.105581]
    [3.105581]
    }
    #[cfg(feature = "crc32")]
    use lazy_static::*;
    #[cfg(feature = "crc32")]
    lazy_static! {
    static ref HASHER: crc32fast::Hasher = crc32fast::Hasher::new();
  • edit in sanakirja/src/environment/mod.rs at line 416
    [3.3441]
    [3.105716]
    let env_ = env.borrow();
  • edit in sanakirja/src/environment/mod.rs at line 418
    [3.105737][3.105737:105774]()
    let env_ = env.borrow();
  • edit in sanakirja/src/environment/mod.rs at line 433
    [3.105961]
    [3.5014]
    env_.check_crc(root)?;
  • edit in sanakirja/src/environment/mod.rs at line 435
    [3.5044]
    [3.106068]
    }
    #[cfg(not(feature = "crc32"))]
    fn check_crc(&self, _root: usize) -> Result<(), crate::CRCError> {
    Ok(())
    }
    #[cfg(feature = "crc32")]
    fn check_crc(&self, root: usize) -> Result<(), crate::CRCError> {
    unsafe {
    let maps = self.mmaps.lock();
    let page_ptr = maps[0].ptr.add(root * PAGE_SIZE);
    let crc = (&*(page_ptr as *const GlobalHeader)).crc;
    let root_page = std::slice::from_raw_parts(page_ptr.add(8), PAGE_SIZE - 8);
    let mut h = HASHER.clone();
    h.update(root_page);
    if h.finalize() != crc {
    return Err(crate::CRCError {});
    }
    }
    Ok(())
  • replacement in sanakirja/src/environment/mod.rs at line 533
    [3.107053][3.107053:107078]()
    Err(CRCError {})
    [3.107053]
    [3.107078]
    Err(crate::CRCError {})
  • edit in sanakirja/src/environment/global_header.rs at line 5
    [3.107236]
    [3.107236]
    #[repr(C)]
  • edit in sanakirja/src/environment/global_header.rs at line 35
    [3.108041]
    [3.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(),
  • edit in sanakirja/Cargo.toml at line 9
    [3.5484]
    [3.5484]
    crc32 = [ "crc32fast", "lazy_static", "sanakirja-core/crc32" ]
  • edit in sanakirja/Cargo.toml at line 19
    [2.150]
    [3.5680]
    crc32fast = { version = "1.2", optional = true, default-features = false }
    lazy_static = { version = "1.4", optional = true }
  • edit in sanakirja/Cargo.toml at line 29
    [2.274]
    tempfile = "3.2"