Improving safety of cursors
[?]
Feb 4, 2021, 10:00 AM
W26CFMAQOXMUK4ZOJMAN4SMBXMWFQHO7HCTEVW73FQSRMJZFGJIQCDependencies
- [2]
APPY2E7MUnsized deletions + custom sizes back - [3]
AOX2XQISActually, with the correct functions, Unsized pages are always slower than Sized pages (especially for writing) - [4]
KMT3MF5NDrop a database - [5]
OP6SVMODResetting history - [6]
WS4ZQM4RDebugging, tests, etc. - [7]
6UVFCERMFormatting, debugging, etc. - [8]
QEUTVAZ4Splitting btree::page - [9]
6DMPXOATMore debugging - [10]
EAAYH6BQDebugging put - [11]
DV4A2LR7Double-inserts (rebalancing near an internal deletion) - [12]
FMN7X4J2Micro-improvements, now noticeably faster than std::collections::BTreeMap - [13]
ONES3V46reference counting works for put - [14]
X3QVVQISMore debugging (del seems to work now) - [15]
OTWDDJE7Trait/type cleanup - [16]
H3FVSQIQUnsized pages - [17]
S4V4QZ5CDebugging reference-counting for put
Change contents
- replacement in sanakirja-core/src/btree/put.rs at line 37
cursor.pointer < cursor.first_rc_level,cursor.pointer() < cursor.first_rc_level, - replacement in sanakirja-core/src/btree/put.rs at line 80
cursor.pointer -= 1;if cursor.pointer > 0 {cursor.pop();if cursor.pointer() > 0 { - replacement in sanakirja-core/src/btree/put.rs at line 86
cursor.pointer < cursor.first_rc_level,cursor.pointer() < cursor.first_rc_level, - replacement in sanakirja-core/src/btree/put.rs at line 117
cursor.pointer -= 1;if cursor.pointer > 0 {cursor.pop();if cursor.pointer() > 0 { - replacement in sanakirja-core/src/btree/put.rs at line 123
cursor.pointer < cursor.first_rc_level,cursor.pointer() < cursor.first_rc_level, - replacement in sanakirja-core/src/btree/put.rs at line 151
cursor.pointer,cursor.pointer(), - replacement in sanakirja-core/src/btree/put.rs at line 154[5.651]→[5.7700:7748](∅→∅),[5.1017]→[5.7700:7748](∅→∅),[5.1107]→[5.7700:7748](∅→∅),[5.7700]→[5.7700:7748](∅→∅)
if cursor.pointer < cursor.first_rc_level {if cursor.pointer() < cursor.first_rc_level { - replacement in sanakirja-core/src/btree/put.rs at line 156
free[cursor.pointer] = freed;free[cursor.pointer()] = freed; - replacement in sanakirja-core/src/btree/put.rs at line 161
if cursor.pointer == cursor.first_rc_level {if cursor.pointer() == cursor.first_rc_level { - replacement in sanakirja-core/src/btree/put.rs at line 163
free[cursor.pointer] = freed;free[cursor.pointer()] = freed; - replacement in sanakirja-core/src/btree/page_unsized/put.rs at line 107[5.30069]→[5.30069:30106](∅→∅),[5.30106]→[3.192:253](∅→∅),[3.253]→[5.30168:30203](∅→∅),[5.30168]→[5.30168:30203](∅→∅)
core::slice::from_raw_parts(page.data.as_ptr().add(HDR) as *const L::Offset,n0 as usize,)core::slice::from_raw_parts(page.data.as_ptr().add(HDR) as *const L::Offset, n0 as usize) - edit in sanakirja-core/src/btree/page_unsized/put.rs at line 112
- replacement in sanakirja-core/src/btree/mod.rs at line 392
pub fn drop<T: AllocPage, K: Representable+?Sized, V: Representable+?Sized, P: BTreePage<K, V>>(txn: &mut T, db: Db_<K, V, P>) -> Result<(), T::Error> {pub fn drop<T: AllocPage,K: Representable + ?Sized,V: Representable + ?Sized,P: BTreePage<K, V>,>(txn: &mut T,db: Db_<K, V, P>,) -> Result<(), T::Error> { - replacement in sanakirja-core/src/btree/mod.rs at line 404
fn drop_<T: AllocPage, K: Representable+?Sized, V: Representable+?Sized, P: BTreePage<K, V>>(txn: &mut T, p: Page) -> Result<(), T::Error> {fn drop_<T: AllocPage, K: Representable + ?Sized, V: Representable + ?Sized, P: BTreePage<K, V>>(txn: &mut T,p: Page,) -> Result<(), T::Error> { - replacement in sanakirja-core/src/btree/mod.rs at line 417
return Ok(())return Ok(()); - edit in sanakirja-core/src/btree/del.rs at line 13
use core::mem::MaybeUninit; - replacement in sanakirja-core/src/btree/del.rs at line 47
let p0 = cursor.pointer;let p0 = cursor.pointer(); - replacement in sanakirja-core/src/btree/del.rs at line 54
unsafe {let (delk, delv, _) = unsafe { - replacement in sanakirja-core/src/btree/del.rs at line 56
let (delk, delv, _) =P::unchecked_current(txn, cur.page.as_page(), cur.cursor.as_ref().unwrap());for o in delk.page_offsets().chain(delv.page_offsets()) {txn.incr_rc(o)?;}P::unchecked_current(txn, cur.page.as_page(), cur.cursor.as_ref().unwrap())};for o in delk.page_offsets().chain(delv.page_offsets()) {txn.incr_rc(o)?; - replacement in sanakirja-core/src/btree/del.rs at line 74[5.17134]→[5.55653:55678](∅→∅),[5.55653]→[5.55653:55678](∅→∅),[5.31882]→[5.55678:55709](∅→∅),[5.55678]→[5.55678:55709](∅→∅)
cursor.pointer -= 1;while cursor.pointer > 0 {cursor.pop();while cursor.pointer() > 0 { - replacement in sanakirja-core/src/btree/del.rs at line 96[5.31108]→[5.59562:59591](∅→∅),[2.2591]→[5.59562:59591](∅→∅),[5.17869]→[5.59562:59591](∅→∅),[5.59562]→[5.59562:59591](∅→∅)
cursor.pointer -= 1;cursor.pop() - replacement in sanakirja-core/src/btree/del.rs at line 140
cur.page, cursor.pointer, left_pagecur.page,cursor.pointer(),left_page - edit in sanakirja-core/src/btree/del.rs at line 145
cursor.pointer += 1; - replacement in sanakirja-core/src/btree/del.rs at line 148
cursor.stack[cursor.pointer] = MaybeUninit::new(PageCursor {cursor.push(PageCursor { - replacement in sanakirja-core/src/btree/del.rs at line 153
debug!("find_min: cursor.pointer = {:?}", cursor.pointer);debug!("find_min: cursor.pointer = {:?}", cursor.pointer()); - replacement in sanakirja-core/src/btree/del.rs at line 168
let curs0 = unsafe { &mut *cursor.stack[cursor.pointer].as_mut_ptr() };let is_rc = cursor.pointer() >= cursor.first_rc_level;let del_at_internal = p0 < cursor.pointer();let ref mut curs0 = cursor.last(); - replacement in sanakirja-core/src/btree/del.rs at line 172
if cursor.pointer >= cursor.first_rc_level {if is_rc { - replacement in sanakirja-core/src/btree/del.rs at line 185
if p0 < cursor.pointer {if del_at_internal { - replacement in sanakirja-core/src/btree/del.rs at line 187[5.32866]→[5.32866:32883](∅→∅),[5.32883]→[5.18854:18936](∅→∅),[5.18936]→[5.32960:33148](∅→∅),[5.32960]→[5.32960:33148](∅→∅)
unsafe {let (k, v, _) = P::unchecked_current(txn, curs0.page.as_page(), &c0);if cursor.pointer >= cursor.first_rc_level {for o in (&*k).page_offsets().chain((&*v).page_offsets()) {txn.incr_rc(o)?;}let (k, v, _) = unsafe { P::unchecked_current(txn, curs0.page.as_page(), &c0) };if is_rc {for o in (&*k).page_offsets().chain((&*v).page_offsets()) {txn.incr_rc(o)?; - edit in sanakirja-core/src/btree/del.rs at line 192
deleted = Some(P::save_deleted_leaf_entry(k, v)) - edit in sanakirja-core/src/btree/del.rs at line 193
deleted = Some(P::save_deleted_leaf_entry(k, v)) - replacement in sanakirja-core/src/btree/del.rs at line 198
mutable: cursor.pointer < cursor.first_rc_level,mutable: cursor.pointer() < cursor.first_rc_level, - replacement in sanakirja-core/src/btree/del.rs at line 224
let p = cursor.pointer;let p = cursor.pointer(); - replacement in sanakirja-core/src/btree/del.rs at line 278
let mutable = cursor.pointer < cursor.first_rc_level;let mutable = cursor.pointer() < cursor.first_rc_level; - replacement in sanakirja-core/src/btree/del.rs at line 319
if cursor.pointer == p0 {if cursor.pointer() == p0 { - replacement in sanakirja-core/src/btree/del.rs at line 345
if cursor.pointer == p0 {if cursor.pointer() == p0 { - replacement in sanakirja-core/src/btree/del.rs at line 374
if cursor.pointer + 1 >= cursor.first_rc_level && !split_key_is_k0 {if cursor.pointer() + 1 >= cursor.first_rc_level && !split_key_is_k0 { - replacement in sanakirja-core/src/btree/del.rs at line 382
if cursor.pointer < cursor.first_rc_level {free[cursor.pointer] = freed;if cursor.pointer() < cursor.first_rc_level {free[cursor.pointer()] = freed; - replacement in sanakirja-core/src/btree/del.rs at line 385
modify_rc(txn, &last_op, cursor.pointer, cursor.first_rc_level)?;modify_rc(txn, &last_op, cursor.pointer(), cursor.first_rc_level)?; - replacement in sanakirja-core/src/btree/cursor.rs at line 41
pub stack: [core::mem::MaybeUninit<PageCursor<K, V, P>>; N_CURSORS],// Invariant: all items up to (and including) stack[pointer],// except possibly 0, are initialised.stack: [core::mem::MaybeUninit<PageCursor<K, V, P>>; N_CURSORS], - replacement in sanakirja-core/src/btree/cursor.rs at line 45
pub pointer: usize,pointer: usize,}impl<K: Representable + ?Sized, V: Representable + ?Sized, P: BTreePage<K, V>>core::ops::Index<usize> for Cursor<K, V, P>{type Output = PageCursor<K, V, P>;fn index(&self, i: usize) -> &PageCursor<K, V, P> {assert!(i <= self.pointer);unsafe { &*self.stack.index(i).as_ptr() }}}impl<K: Representable + ?Sized, V: Representable + ?Sized, P: BTreePage<K, V>>core::ops::IndexMut<usize> for Cursor<K, V, P>{fn index_mut(&mut self, i: usize) -> &mut PageCursor<K, V, P> {assert!(i <= self.pointer);unsafe { &mut *self.stack.index_mut(i).as_mut_ptr() }} - edit in sanakirja-core/src/btree/cursor.rs at line 72
cursor: None,});stack[0] = MaybeUninit::new(PageCursor {page: CowPage::null(), - edit in sanakirja-core/src/btree/cursor.rs at line 83
}pub fn push(&mut self, p: PageCursor<K, V, P>) {self.pointer += 1;self.stack[self.pointer] = MaybeUninit::new(p) - edit in sanakirja-core/src/btree/cursor.rs at line 89
pub fn last(&mut self) -> &mut PageCursor<K, V, P> {unsafe { &mut *self.stack[self.pointer].as_mut_ptr() }} - edit in sanakirja-core/src/btree/cursor.rs at line 100
pub fn pointer(&self) -> usize {self.pointer}pub fn pop(&mut self) {self.pointer -= 1}