pijul nest
guest [sign in]

More debugging (del seems to work now)

[?]
Feb 1, 2021, 5:33 PM
X3QVVQIS7B7L3XYZAWL3OOBUXOJ6RMOKQ45YMLLGAHYPEEKZ45ZAC

Dependencies

Change contents

  • edit in sanakirja-core/src/btree/page.rs at line 3
    [4.12]
    [4.8650]
    use core::mem::MaybeUninit;
  • replacement in sanakirja-core/src/btree/page.rs at line 12
    [4.8770][4.8770:8812]()
    #[derive(PartialEq, Eq, PartialOrd, Ord)]
    [4.8770]
    [4.8812]
    #[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
  • replacement in sanakirja-core/src/btree/page.rs at line 93
    [4.1740][4.10573:10614](),[4.10573][4.10573:10614]()
    if let Some((k, v, _)) = m.ins {
    [4.1740]
    [4.1741]
    if let Some((k, v)) = m.ins {
  • replacement in sanakirja-core/src/btree/page.rs at line 273
    [4.17574][4.5921:5993]()
    return Ok(Op::Put(if let Some((k, v, r)) = m.modified.ins {
    [4.17574]
    [4.5993]
    return Ok(Op::Put(if let Some((k, v)) = m.modified.ins {
  • replacement in sanakirja-core/src/btree/page.rs at line 282
    [4.6246][4.6246:6269]()
    r,
    [4.6246]
    [4.6269]
    m.modified.r,
  • replacement in sanakirja-core/src/btree/page.rs at line 291
    [4.18260][4.6495:6577]()
    if m.modified.c0.is_leaf {
    rebalance::<_, _, _, Leaf>(txn, m)
    [4.18260]
    [4.6577]
    if m.mod_is_left {
    if m.modified.c0.is_leaf {
    rebalance_left::<_, _, _, Leaf>(txn, m)
    } else {
    rebalance_left::<_, _, _, Internal>(txn, m)
    }
  • replacement in sanakirja-core/src/btree/page.rs at line 298
    [4.6594][4.6594:6645]()
    rebalance::<_, _, _, Internal>(txn, m)
    [4.6594]
    [4.18457]
    if m.modified.c0.is_leaf {
    rebalance_right::<_, _, _, Leaf>(txn, m)
    } else {
    rebalance_right::<_, _, _, Internal>(txn, m)
    }
  • edit in sanakirja-core/src/btree/page.rs at line 426
    [4.9111]
    [4.22435]
    debug!("set_cursor, {:?} lookup = {:?}", page.offset, lookup);
  • replacement in sanakirja-core/src/btree/page.rs at line 930
    [4.35045][4.35045:35082](),[4.35082][4.20316:20371]()
    if let Some((k, v, r)) = m.ins {
    alloc::<_, _, _, L>(new, &*k, &*v, m.l, r, n);
    [4.35045]
    [4.35142]
    if let Some((k, v)) = m.ins {
    alloc::<_, _, _, L>(new, &*k, &*v, m.l, m.r, n);
  • replacement in sanakirja-core/src/btree/page.rs at line 971
    [4.36508][2.1959:2100]()
    fn rebalance<'a, T: AllocPage + core::fmt::Debug, K: Representable<T> + core::fmt::Debug, V: Representable<T> + core::fmt::Debug, L: Alloc>(
    [4.36508]
    [4.36599]
    fn rebalance_left<'a, T: AllocPage + core::fmt::Debug, K: Representable<T> + core::fmt::Debug, V: Representable<T> + core::fmt::Debug, L: Alloc>(
  • edit in sanakirja-core/src/btree/page.rs at line 975
    [4.36698]
    [4.21481]
    assert!(m.mod_is_left);
    // First element of the right page. We'll rotate it to the left
    // page.
  • replacement in sanakirja-core/src/btree/page.rs at line 983
    [4.36942][4.21693:21835](),[4.21835][4.37068:37118](),[4.37068][4.37068:37118](),[4.37118][4.21836:21909](),[4.21909][4.37195:37208](),[4.37195][4.37195:37208]()
    let new_left = if header(m.modified.page.as_page()).is_dirty() {
    let mut page = unsafe { core::mem::transmute(m.modified.page) };
    let mut n = m.modified.c1.total as isize;
    alloc::<T, K, V, L>(&mut page, m.mid.0, m.mid.1, 0, rl, &mut n);
    page
    [4.36942]
    [4.37208]
    let b = if header(m.modified.page.as_page()).is_dirty() { 1 } else { 0 };
    freed[0] = m.modified.page.offset | b;
    let mut new_left = if let Some((k, v)) = m.modified.ins {
    if let Put::Ok(Ok { page, .. }) = <Page<K, V>>::replace(
    txn,
    m.modified.page,
    m.modified.mutable,
    &m.modified.c1,
    &*k,
    &*v,
    m.modified.l,
    m.modified.r,
    )? {
    page
    } else {
    unreachable!()
    }
  • replacement in sanakirja-core/src/btree/page.rs at line 1002
    [4.37221][4.21910:22085](),[4.22085][4.37418:37441](),[4.37418][4.37418:37441](),[4.37441][4.22086:22235]()
    let mut new = txn.alloc_page()?;
    <Page<K, V> as BTreeMutPage<T, K, V>>::init(&mut new);
    let s = L::offset_slice::<T, K, V>(m.modified.page.as_page());
    let mut n = 0;
    clone::<T, K, V, L>(m.modified.page.as_page(), &mut new, s, &mut n);
    alloc::<T, K, V, L>(&mut new, m.mid.0, m.mid.1, 0, rl, &mut n);
    [4.37221]
    [4.22235]
    <Page<K, V>>::del(txn, m.modified.page, &m.modified.c1, m.modified.l)?
    };
    let mut n = header(new_left.0.as_page()).n() as isize;
    alloc::<T, K, V, L>(&mut new_left, m.mid.0, m.mid.1, 0, rl, &mut n);
  • replacement in sanakirja-core/src/btree/page.rs at line 1009
    [4.22236][4.22236:22318](),[4.22318][4.37636:37695](),[4.37636][4.37636:37695]()
    let b = if header(m.modified.page.as_page()).is_dirty() { 1 } else { 0 };
    freed[0] = m.modified.page.offset | b;
    new
    [4.22236]
    [4.37695]
    let right_hdr = header(m.other.as_page());
    let (new_right, k, v) = match fixed_size::<T, K, V>() {
    Some(f) if r == 0 && right_hdr.is_dirty() => {
    // Rewrite the deleted element at the end of the page, so that
    // the pointer is still valid.
    let data = m.other.data;
    let mut other = MutPage(m.other);
    let right_hdr = header_mut(&mut other);
    let al = K::ALIGN.max(V::ALIGN);
    let hdr_size = (HDR + al - 1) & !(al - 1);
    let n = right_hdr.n() as usize;
    right_hdr.decr(f);
    right_hdr.set_n((n - 1) as u16);
    let mut t: MaybeUninit<Tuple<K, V>> = MaybeUninit::uninit();
    unsafe {
    core::ptr::copy_nonoverlapping(
    data.add(hdr_size) as *mut Tuple<K, V>,
    t.as_mut_ptr(),
    1
    );
    core::ptr::copy(
    data.add(hdr_size + f) as *const Tuple<K, V>,
    data.add(hdr_size) as *mut Tuple<K, V>,
    n-1
    );
    let last = data.add(hdr_size + f * (n-1)) as *mut Tuple<K, V>;
    core::ptr::copy_nonoverlapping(
    t.as_ptr(),
    last,
    1
    );
    debug!("tuple = {:?}", t.assume_init());
    (other, &(&*last).k, &(&*last).v)
    }
    }
    _ => unsafe {
    (<Page<K, V>>::del(txn, m.other, &rc, r)?,
    core::mem::transmute(k),
    core::mem::transmute(v))
    }
  • edit in sanakirja-core/src/btree/page.rs at line 1050
    [4.37702][4.37702:37764]()
    let new_right = <Page<K, V>>::del(txn, m.other, &rc, r)?;
  • edit in sanakirja-core/src/btree/page.rs at line 1063
    [4.38075]
    [4.38075]
    fn rebalance_right<'a, T: AllocPage + core::fmt::Debug, K: Representable<T> + core::fmt::Debug, V: Representable<T> + core::fmt::Debug, L: Alloc>(
    txn: &mut T,
    m: &mut Concat<'a, T, K, V, Page<K, V>>,
    ) -> Result<Op<'a, T, K, V>, T::Error> {
    assert!(!m.mod_is_left);
    // Take the last element of the left page.
    let lc = <Page<K, V>>::last_cursor(m.other.as_page());
    let (k0, v0, r0) = unsafe { <Page<K, V>>::unchecked_current(m.other.as_page(), &lc) };
  • edit in sanakirja-core/src/btree/page.rs at line 1076
    [4.38076]
    [4.38076]
    // First element of the right page.
    let rc = <Page<K, V>>::first_cursor(m.modified.page.as_page());
    let rl = <Page<K, V>>::left_child(m.modified.page.as_page(), &rc);
    let mut freed = [0, 0];
    let b = if header(m.modified.page.as_page()).is_dirty() { 1 } else { 0 };
    freed[0] = m.modified.page.offset | b;
    let mut new_right = if let Some((k, v)) = m.modified.ins {
    if let Put::Ok(Ok { page, .. }) = <Page<K, V>>::replace(
    txn,
    m.modified.page,
    m.modified.mutable,
    &m.modified.c1,
    &*k,
    &*v,
    m.modified.l,
    m.modified.r,
    )? {
    page
    } else {
    unreachable!()
    }
    } else {
    <Page<K, V>>::del(txn, m.modified.page, &m.modified.c1, m.modified.l)?
    };
    if let Put::Ok(Ok { page, .. }) = <Page<K, V>>::put(
    txn,
    new_right.0,
    true,
    &rc,
    m.mid.0,
    m.mid.1,
    r0,
    rl,
    )? {
    new_right = page
    } else {
    unreachable!()
    };
    let new_left = <Page<K, V>>::del(txn, m.other, &lc, 0)?;
    if new_left.0.offset != m.other.offset {
    let hdr = &*header(m.other.as_page());
    let b = if hdr.is_dirty() { 1 } else { 0 };
    freed[1] = m.other.offset | b
    }
    Ok(Op::Rebalanced {
    l: new_left.0.offset,
    r: new_right.0.offset,
    k: unsafe { core::mem::transmute(k0) },
    v: unsafe { core::mem::transmute(v0) },
    freed,
    })
    }
  • replacement in sanakirja-core/src/btree/mod.rs at line 150
    [4.49472][4.30088:30129]()
    if let Some((k, v, r)) = m.ins {
    [4.49472]
    [4.30129]
    if let Some((k, v)) = m.ins {
  • replacement in sanakirja-core/src/btree/mod.rs at line 152
    [4.30159][4.30159:30238]()
    Self::replace(txn, m.page, m.mutable, &m.c1, &*k, &*v, m.l, r)
    [4.30159]
    [4.49773]
    Self::replace(txn, m.page, m.mutable, &m.c1, &*k, &*v, m.l, m.r)
  • replacement in sanakirja-core/src/btree/mod.rs at line 154
    [4.49794][4.30239:30314]()
    Self::put(txn, m.page, m.mutable, &m.c1, &*k, &*v, m.l, r)
    [4.49794]
    [4.50115]
    Self::put(txn, m.page, m.mutable, &m.c1, &*k, &*v, m.l, m.r)
  • replacement in sanakirja-core/src/btree/mod.rs at line 167
    [2.3742][2.3742:3763]()
    } else {
    [2.3742]
    [2.3763]
    } else if m.l > 0 {
  • edit in sanakirja-core/src/btree/mod.rs at line 169
    [2.3853]
    [2.3853]
    } else {
    let mut c1 = m.c1.clone();
    Self::move_next(m.page.as_page(), &mut c1);
    Ok(Put::Ok(Self::update_left_child(txn, m.page, m.mutable, &c1, m.r)?))
  • edit in sanakirja-core/src/btree/mod.rs at line 212
    [4.50936]
    [4.50936]
    // Replace the left child of c1's last element with `r`.
    pub r: u64,
  • replacement in sanakirja-core/src/btree/mod.rs at line 215
    [4.50974][4.30692:30734]()
    pub ins: Option<(&'a K, &'a V, u64)>,
    [4.50974]
    [4.51022]
    pub ins: Option<(&'a K, &'a V)>,
  • edit in sanakirja-core/src/btree/del.rs at line 60
    [4.31593]
    [4.54484]
  • edit in sanakirja-core/src/btree/del.rs at line 66
    [4.54630]
    [4.54630]
    r: 0,
  • edit in sanakirja-core/src/btree/del.rs at line 72
    [4.54743]
    [4.54743]
    debug!("decr_rc");
  • edit in sanakirja-core/src/btree/del.rs at line 74
    [4.54784]
    [4.54784]
    debug!("/decr_rc");
  • replacement in sanakirja-core/src/btree/del.rs at line 88
    [4.55206][4.55206:55278]()
    if p0 < cursor.pointer && cursor.pointer >= cursor.first_rc_level {
    [4.55206]
    [4.55278]
    debug!("pointer = {:?}", cursor.pointer);
    let mut k0 = MaybeUninit::uninit();
    let mut v0 = MaybeUninit::uninit();
    if p0 < cursor.pointer {
  • replacement in sanakirja-core/src/btree/del.rs at line 96
    [4.31828][4.55410:55515](),[4.55410][4.55410:55515]()
    for o in (&*k).page_offsets().chain((&*v).page_offsets()) {
    txn.incr_rc(o)?;
    [4.31828]
    [4.55515]
    if cursor.pointer >= cursor.first_rc_level {
    for o in (&*k).page_offsets().chain((&*v).page_offsets()) {
    txn.incr_rc(o)?;
    }
  • edit in sanakirja-core/src/btree/del.rs at line 101
    [4.55529]
    [4.55529]
    core::ptr::copy_nonoverlapping(k, k0.as_mut_ptr(), 1);
    core::ptr::copy_nonoverlapping(v, v0.as_mut_ptr(), 1);
  • edit in sanakirja-core/src/btree/del.rs at line 110
    [4.55678][4.31829:31882]()
    debug!("cursor.pointer = {:?}", cursor.pointer);
  • replacement in sanakirja-core/src/btree/del.rs at line 115
    [4.31991][4.31991:32074]()
    concat(txn, curs, if p == p0 { Some(&curs0) } else { None }, last_op)?
    [4.31991]
    [4.32074]
    let kv = if p == p0 {
    unsafe { Some((
    &*k0.as_ptr(),
    &*v0.as_ptr()
    )) }
    } else {
    None
    };
    concat(txn, curs, kv, last_op)?
  • edit in sanakirja-core/src/btree/del.rs at line 126
    [4.32122][4.32122:32165]()
    debug!("candidate: {:?}", concat);
  • edit in sanakirja-core/src/btree/del.rs at line 128
    [4.32226]
    [2.4202]
    debug!("page = {:?}, c0 = {:?}, c1 = {:?}", curs.page.offset, c0, c1);
    debug!("concat = {:?}" ,concat);
  • replacement in sanakirja-core/src/btree/del.rs at line 131
    [2.4264][2.4264:4303]()
    debug!("merge = {:?}", merge);
    [2.4264]
    [2.4303]
    debug!("merge: {:?}", merge);
  • edit in sanakirja-core/src/btree/del.rs at line 143
    [4.56354]
    [4.56354]
    r: 0,
  • replacement in sanakirja-core/src/btree/del.rs at line 163
    [4.57199][4.57199:57241]()
    ins: Some((k, v, r)),
    [4.57199]
    [4.57241]
    r,
    ins: Some((k, v)),
  • edit in sanakirja-core/src/btree/del.rs at line 178
    [4.57733]
    [4.57733]
    let (l, r, ins, skip_first) = if cursor.pointer == p0 {
    let l = P::left_child(page.0.as_page(), &c1);
    let k = unsafe { &*k0.as_ptr() };
    let v = unsafe { &*v0.as_ptr() };
    (l, page.0.offset, Some((k, v)), true)
    } else if concat.mod_is_left {
    (page.0.offset, 0, None, false)
    } else {
    (0, page.0.offset, None, false)
    };
  • replacement in sanakirja-core/src/btree/del.rs at line 192
    [4.57904][4.57904:57973]()
    l: page.0.offset,
    ins: None,
    [4.57904]
    [4.57973]
    l,
    r,
    ins,
  • replacement in sanakirja-core/src/btree/del.rs at line 196
    [4.57997][4.57997:58036]()
    skip_first: false,
    [4.57997]
    [4.58036]
    skip_first,
  • edit in sanakirja-core/src/btree/del.rs at line 214
    [4.58592]
    [4.58592]
    // Here, if we are at cursor.pointer == p0, the
    // replacement has been either inserted into one of
    // {left, right}, or is the split key/value
    // itself. Therefore, we just have to delete the
    // key/value selected for deletion in page p0 (the
    // current page).
  • replacement in sanakirja-core/src/btree/del.rs at line 225
    [4.58801][4.58801:58874]()
    ins: Some((split_key, split_value, right.0.offset)),
    [4.58801]
    [4.58874]
    r: right.0.offset,
    ins: Some((split_key, split_value)),
  • replacement in sanakirja-core/src/btree/del.rs at line 228
    [4.58898][4.58898:58937]()
    skip_first: false,
    [4.58898]
    [4.58937]
    skip_first: cursor.pointer == p0,
  • replacement in sanakirja-core/src/btree/del.rs at line 238
    [4.59302][4.59302:59367]()
    if cursor.pointer + 1 >= cursor.first_rc_level {
    [4.59302]
    [4.59367]
    // If the split key is the replacement element, we
    // have already increased its counter when we deleted
    // it from its original position at the bottom of the
    // tree.
    if cursor.pointer + 1 >= cursor.first_rc_level && (split_key as *const K) != k0.as_ptr() {
  • edit in sanakirja-core/src/btree/del.rs at line 318
    [4.32463]
    [4.61446]
    debug!("find_min: {:?} {:?} {:?}", cur.page, cursor.pointer, left_page);
  • edit in sanakirja-core/src/btree/del.rs at line 329
    [4.61776]
    [4.61776]
    debug!("find_min: cursor.pointer = {:?}", cursor.pointer);
  • replacement in sanakirja-core/src/btree/del.rs at line 342
    [4.32614][4.32614:32658]()
    curs0: Option<&PageCursor<T, K, V, P>>,
    [4.32614]
    [4.32658]
    curs0: Option<(&'a K, &'a V)>,
  • replacement in sanakirja-core/src/btree/del.rs at line 346
    [4.32745][4.32745:32778]()
    if let Some(curs0) = curs0 {
    [4.32745]
    [4.32778]
    if let Some((k0, v0)) = curs0 {
  • edit in sanakirja-core/src/btree/del.rs at line 348
    [4.32853][4.62312:62336](),[4.62312][4.62312:62336](),[4.62336][4.32854:32953]()
    let (k, v, _) =
    unsafe { P::unchecked_current(curs0.page.as_page(), curs0.cursor.as_ref().unwrap()) };
  • replacement in sanakirja-core/src/btree/del.rs at line 350
    [4.62477][4.32954:33034]()
    mid: unsafe { (core::mem::transmute(k), core::mem::transmute(v)) },
    [4.62477]
    [4.62502]
    mid: (k0, v0),
  • edit in sanakirja-core/src/btree/del.rs at line 357
    [4.33149]
    [4.33149]
    // Not the last element of the page.
  • edit in sanakirja-core/src/btree/del.rs at line 360
    [4.33180]
    [4.33180]
    // Last element of the page.
  • edit in sanakirja-core/src/btree/cursor.rs at line 4
    [4.63754][4.63754:63766]()
    use log::*;
  • edit in sanakirja/src/tests.rs at line 101
    [3.3082][3.3082:3089]()
    /*
  • replacement in sanakirja/src/tests.rs at line 102
    [3.3131][3.3131:3442]()
    let d = 10;
    for i in 0..d {
    debug!("deleting {:?}", (i*i)%1_000_000);
    debug::debug(&txn, &db, &format!("debug{}", i), true);
    del(&mut txn, &mut db, &((i * i) % 1_000_000), None).unwrap();
    }
    debug::debug(&txn, &db, "debug_final", true);
    txn.commit().unwrap();
    */
    [3.3131]
    [3.3442]
  • edit in sanakirja/src/tests.rs at line 177
    [3.5676]
    [3.5676]
  • edit in sanakirja/src/tests.rs at line 181
    [3.5685]
    [3.5685]
    pub fn del_mid() {
    type B = btree::page::Page<u64, ()>;
    env_logger::try_init().unwrap_or(());
    let env = Env::new_anon(409600000).unwrap();
    let mut txn = Env::mut_txn_begin(&env).unwrap();
    let mut db: Db<_, u64, (), B> = create_db(&mut txn).unwrap();
    let n = 2_000 as u64;
    let now = std::time::SystemTime::now();
    let mut values = Vec::with_capacity(n as usize);
    for i in 0..n - 1 {
    if put(&mut txn, &mut db, &i, &()).unwrap() {
    values.push(i);
    }
    }
    debug!("==============================");
    debug::debug(&txn, &db, "debug_pre", true);
    del(&mut txn, &mut db, &1274, None).unwrap();
    debug::debug(&txn, &db, "debug_post", true);
    debug!("==============================");
    del(&mut txn, &mut db, &1529, None).unwrap();
    debug::debug(&txn, &db, "debug_post2", true);
    assert!(!del(&mut txn, &mut db, &(n + 1), None).unwrap());
    // for i in 0..400 {
    // debug!("============== {:?}", i);
    // del(&mut txn, &mut db, &i, None).unwrap();
    // }
    }
    #[test]
  • replacement in sanakirja/src/tests.rs at line 217
    [3.5952][3.5952:5977]()
    let n = 1000 as u64;
    [3.5952]
    [3.5977]
    let n = 2_000 as u64;
  • edit in sanakirja/src/tests.rs at line 259
    [3.7216]
    [3.7216]
    debug!("==============================");
    debug::debug(&txn, &db, "debug_pre", true);
    del(&mut txn, &mut db, &1019, None).unwrap();
    debug::debug(&txn, &db, "debug_post", true);
    for i in 0..512 {
    debug!("============== {:?}", i);
    del(&mut txn, &mut db, &i, None).unwrap();
    }
    debug!("================= done");
    let _db3 = fork_db(&mut txn, &db).unwrap();
    for i in 1530..1531 {
    debug!("============== {:?}", i);
    debug::debug(&txn, &db, "debug_pre", true);
    del(&mut txn, &mut db, &i, None).unwrap();
    debug::debug(&txn, &db, "debug_post", true);
    }
    debug!("================= done");
  • edit in sanakirja/src/tests.rs at line 279
    [3.7217]
    [3.7217]