implementing prev() on cursors (+ some cleanup)
[?]
Feb 7, 2021, 10:55 AM
OFINGD26ZWCRDVVDI2ZIBLMHXKEMJA6MRNLANJYUHQPIJLPA7J2ACDependencies
- [2]
T7QB6QEPAdding debug.rs - [3]
EYNN7RLSTests++ (including UUID) - [4]
SO25TWFLA few features for integrating it into Pijul - [5]
6UVFCERMFormatting, debugging, etc. - [6]
W26CFMAQImproving safety of cursors - [7]
YXKP4AIWNew file locks, with multiple sets of free pages - [8]
WS4ZQM4RDebugging, tests, etc. - [9]
QEUTVAZ4Splitting btree::page - [10]
H3FVSQIQUnsized pages - [11]
X3QVVQISMore debugging (del seems to work now) - [12]
UAQX27N4Tests - [13]
KX3WVNZWTesting/debugging "rebalance causes split of the root" - [14]
6DCQHIFPMinor changes after benchmarking - [15]
AOX2XQISActually, with the correct functions, Unsized pages are always slower than Sized pages (especially for writing) - [16]
FMN7X4J2Micro-improvements, now noticeably faster than std::collections::BTreeMap - [17]
7WJNSPEWUsing the same definition of the "occupied" field uniform everywhere - [18]
APPY2E7MUnsized deletions + custom sizes back - [19]
6DMPXOATMore debugging - [20]
NQBEOCFOTests cleanup - [21]
KMT3MF5NDrop a database - [22]
OP6SVMODResetting history - [23]
G4JEQLLXDebugging synchronisation - [24]
EAAYH6BQDebugging put - [25]
OTWDDJE7Trait/type cleanup - [26]
PXF3R6SVImproving test coverage for btree::cursor - [27]
YWFYZNLZCleanup + inter-process concurrency - [28]
ONES3V46reference counting works for put - [29]
UUUVNC4DDebugging/cleanup around cursors - [30]
EHJFNMB2Debugging - [31]
DV4A2LR7Double-inserts (rebalancing near an internal deletion) - [32]
S4V4QZ5CDebugging reference-counting for put
Change contents
- replacement in sanakirja-core/src/btree/put.rs at line 29
let mut cursor = Cursor::new(db);let mut cursor = Cursor::new(txn, db)?; - replacement in sanakirja-core/src/btree/put.rs at line 38
cur.cursor.as_ref().unwrap(),&cur.cursor, - replacement in sanakirja-core/src/btree/put.rs at line 46
db.db = put_cascade(txn, &mut cursor, put, &mut free)?.0;db.db = put_cascade(txn, &mut cursor, put, &mut free)?.0.offset; - replacement in sanakirja-core/src/btree/put.rs at line 88
cur.cursor.as_ref().unwrap(),&cur.cursor, - replacement in sanakirja-core/src/btree/put.rs at line 105
&P::first_cursor(p.0.as_page()),&P::cursor_first(p.0.as_page()), - replacement in sanakirja-core/src/btree/put.rs at line 125
curs.cursor.as_ref().unwrap(),&curs.cursor, - replacement in sanakirja-core/src/btree/put.rs at line 171
let mut c = P::first_cursor(cur.page.as_page());let mut c = P::cursor_before(cur.page.as_page());P::move_next(cur.page.as_page(), &mut c); - edit in sanakirja-core/src/btree/page_unsized.rs at line 75
assert!(c.cur >= 0); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 77
put::put::<_, _, _, Leaf>(txn, page, mutable, c.cur, k0, v0, k1v1, 0, 0)put::put::<_, _, _, Leaf>(txn, page, mutable, c.cur as usize, k0, v0, k1v1, 0, 0) - replacement in sanakirja-core/src/btree/page_unsized.rs at line 79
put::put::<_, _, _, Internal>(txn, page, mutable, c.cur, k0, v0, k1v1, l, r)put::put::<_, _, _, Internal>(txn, page, mutable, c.cur as usize, k0, v0, k1v1, l, r) - replacement in sanakirja-core/src/btree/page_unsized.rs at line 124
assert!(c.cur < c.total + 1);assert!(c.cur < c.total as isize + 1); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 138
assert!(c.cur < c.total);assert!(c.cur >= 0 && c.cur < c.total as isize); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 146
let ptr = p.add(HDR + c.cur * 2) as *mut u16;let ptr = p.add(HDR + c.cur as usize * 2) as *mut u16; - replacement in sanakirja-core/src/btree/page_unsized.rs at line 149
core::ptr::copy(ptr.offset(1), ptr, n - c.cur);core::ptr::copy(ptr.offset(1), ptr, n - c.cur as usize); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 152
let ptr = p.add(HDR + c.cur * 8) as *mut u64;let ptr = p.add(HDR + c.cur as usize * 8) as *mut u64; - replacement in sanakirja-core/src/btree/page_unsized.rs at line 156
core::ptr::copy(ptr.offset(1), ptr, hdr.n() as usize - c.cur);core::ptr::copy(ptr.offset(1), ptr, hdr.n() as usize - c.cur as usize); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 176
let (s0, s1) = s.split_at(c.cur);let (s0, s1) = s.split_at(c.cur as usize); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 182
let (s0, s1) = s.split_at(c.cur);let (s0, s1) = s.split_at(c.cur as usize); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 241
let rc = <Page<K, V>>::first_cursor(m.other.as_page());let rc = Cursor::new(m.other.as_page(), 0); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 286
c.cur >= c.totalc.cur >= c.total as isize - edit in sanakirja-core/src/btree/page_unsized.rs at line 288
fn is_init(_: crate::Page, c: &Self::Cursor) -> bool {c.cur < 0} - replacement in sanakirja-core/src/btree/page_unsized.rs at line 293
fn first_cursor(p: crate::Page) -> Self::Cursor {let hdr = header(p);Cursor {cur: 0,total: hdr.n() as usize,is_leaf: hdr.is_leaf(),}fn cursor_before(p: crate::Page) -> Self::Cursor {Cursor::new(p, -1) - replacement in sanakirja-core/src/btree/page_unsized.rs at line 296
fn last_cursor(p: crate::Page) -> Self::Cursor {let hdr = header(p);let total = hdr.n() as usize;Cursor {cur: total - 1,total,is_leaf: hdr.is_leaf(),}fn cursor_after(p: crate::Page) -> Self::Cursor {Cursor::after(p) - replacement in sanakirja-core/src/btree/page_unsized.rs at line 299
unsafe fn unchecked_current<'a, T: LoadPage>(fn current<'a, T: LoadPage>( - replacement in sanakirja-core/src/btree/page_unsized.rs at line 303[4.12459]→[4.12459:12513](∅→∅),[4.12513]→[4.1441:1564](∅→∅),[4.1564]→[4.12648:12733](∅→∅),[4.12648]→[4.12648:12733](∅→∅),[4.12733]→[4.1565:1720](∅→∅)
) -> (&'a K, &'a V, u64) {if c.is_leaf {let off ={ u16::from_le(*(page.data.as_ptr().add(HDR + c.cur * 2) as *const u16)) as usize };let (k, v) = read::<T, K, V>(txn, page.data.as_ptr().add(off as usize));(K::from_raw_ptr(txn, k as *const u8),V::from_raw_ptr(txn, v as *const u8),0,)) -> Option<(&'a K, &'a V, u64)> {if c.cur < 0 || c.cur >= c.total as isize {None} else if c.is_leaf {unsafe {let off ={ u16::from_le(*(page.data.as_ptr().add(HDR + c.cur as usize * 2) as *const u16)) as usize };let (k, v) = read::<T, K, V>(txn, page.data.as_ptr().add(off));Some((K::from_raw_ptr(txn, k as *const u8),V::from_raw_ptr(txn, v as *const u8),0,))} - replacement in sanakirja-core/src/btree/page_unsized.rs at line 318
let off = u64::from_le(*(page.data.as_ptr().add(HDR) as *const u64).add(c.cur));let (k, v) = read::<T, K, V>(txn, page.data.as_ptr().add((off & 0xfff) as usize));(K::from_raw_ptr(txn, k as *const u8),V::from_raw_ptr(txn, v as *const u8),off & !0xfff,)unsafe {let off = u64::from_le(*(page.data.as_ptr().add(HDR) as *const u64).offset(c.cur));let (k, v) = read::<T, K, V>(txn, page.data.as_ptr().add((off & 0xfff) as usize));Some((K::from_raw_ptr(txn, k as *const u8),V::from_raw_ptr(txn, v as *const u8),off & !0xfff,))} - replacement in sanakirja-core/src/btree/page_unsized.rs at line 331
u16::from_le(*(page.data.as_ptr().add(HDR + c.cur * 2) as *const u16)) as usizeu16::from_le(*(page.data.as_ptr().add(HDR + c.cur as usize * 2) as *const u16)) as usize - replacement in sanakirja-core/src/btree/page_unsized.rs at line 333
(u64::from_le(*(page.data.as_ptr().add(HDR + c.cur * 8) as *const u64)) & 0xfff)(u64::from_le(*(page.data.as_ptr().add(HDR + c.cur as usize * 8) as *const u64)) & 0xfff) - replacement in sanakirja-core/src/btree/page_unsized.rs at line 341
*(page.data.as_ptr().add(HDR) as *const u16).add(c.cur),*(page.data.as_ptr().add(HDR) as *const u16).offset(c.cur), - replacement in sanakirja-core/src/btree/page_unsized.rs at line 345
(u64::from_le(*(page.data.as_ptr().add(HDR) as *const u64).add(c.cur)) & 0xfff)(u64::from_le(*(page.data.as_ptr().add(HDR) as *const u64).offset(c.cur)) & 0xfff) - replacement in sanakirja-core/src/btree/page_unsized.rs at line 352
if c.cur < c.total {if c.cur < c.total as isize { - edit in sanakirja-core/src/btree/page_unsized.rs at line 364
c.cur = -1; - edit in sanakirja-core/src/btree/page_unsized.rs at line 369
assert!(c.cur >= 0); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 373
let off = unsafe { *(page.data.as_ptr().add((HDR + c.cur * 8) - 8) as *const u64) };let off = unsafe { *(page.data.as_ptr().add((HDR + c.cur as usize * 8) - 8) as *const u64) }; - edit in sanakirja-core/src/btree/page_unsized.rs at line 378
assert!(c.cur < c.total as isize); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 382
let off = unsafe { *(page.data.as_ptr().add(HDR + c.cur * 8) as *const u64) };let off = unsafe { *(page.data.as_ptr().add(HDR + c.cur as usize * 8) as *const u64) }; - replacement in sanakirja-core/src/btree/page_unsized.rs at line 414
nn as isize - replacement in sanakirja-core/src/btree/page_unsized.rs at line 418
nn as isize - replacement in sanakirja-core/src/btree/page_unsized.rs at line 429
total: c.cur,total: c.cur.max(0) as usize, - replacement in sanakirja-core/src/btree/page_unsized.rs at line 504
cur: usize,total: usize,is_leaf: bool,pub(in super) cur: isize,pub(in super) total: usize,pub(in super) is_leaf: bool,}impl Cursor {pub(in super) fn new(p: crate::Page, cur: isize) -> Cursor {let hdr = header(p);assert!(cur < hdr.n() as isize);Cursor {cur,total: hdr.n() as usize,is_leaf: hdr.is_leaf(),}}pub(in super) fn after(p: crate::Page) -> Cursor {let hdr = header(p);let total = hdr.n();Cursor {cur: total as isize,total: total as usize,is_leaf: hdr.is_leaf(),}}pub(in super) fn last(p: crate::Page) -> Cursor {let hdr = header(p);let total = hdr.n();Cursor {cur: (total - 1) as isize,total: total as usize,is_leaf: hdr.is_leaf(),}} - replacement in sanakirja-core/src/btree/page_unsized.rs at line 590
let mut rc = <Page<K, V>>::first_cursor(m.other.as_page());let mut rc = Cursor::new(m.other.as_page(), 0); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 597
let mut rc = <Page<K, V>>::first_cursor(m.other.as_page());let mut rc = Cursor::new(m.other.as_page(), 0); - replacement in sanakirja-core/src/btree/page_unsized.rs at line 647
let new_ptr = new.0.data.add(off_new as usize);let new_ptr = new.0.data.add(off_new); - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 18
let rc = <Page<K, V>>::first_cursor(m.other.as_page());let rc = super::Cursor::new(m.other.as_page(), 0); - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 20
let (k, v, r) = unsafe { <Page<K, V>>::unchecked_current(txn, m.other.as_page(), &rc) };let (k, v, r) = <Page<K, V>>::current(txn, m.other.as_page(), &rc).unwrap(); - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 51
let mut lc = <Page<K, V>>::last_cursor(m.modified.page.as_page());<Page<K, V>>::move_next(m.modified.page.as_page(), &mut lc);let lc = Cursor::after(m.modified.page.as_page()); - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 101
let lc = <Page<K, V>>::last_cursor(m.other.as_page());let (k0, v0, r0) = unsafe { <Page<K, V>>::unchecked_current(txn, m.other.as_page(), &lc) };let lc = super::Cursor::last(m.other.as_page());let (k0, v0, r0) = <Page<K, V>>::current(txn, m.other.as_page(), &lc).unwrap(); - replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 105
let rc = <Page<K, V>>::first_cursor(m.modified.page.as_page());let rc = super::Cursor::new(m.modified.page.as_page(), 0); - edit in sanakirja-core/src/btree/page.rs at line 12
pub use super::page_unsized::Cursor; - edit in sanakirja-core/src/btree/page.rs at line 93
assert!(c.cur >= 0); - replacement in sanakirja-core/src/btree/page.rs at line 95
put::put::<_, _, _, Leaf>(txn, page, mutable, c.cur, k0, v0, k1v1, 0, 0)put::put::<_, _, _, Leaf>(txn, page, mutable, c.cur as usize, k0, v0, k1v1, 0, 0) - replacement in sanakirja-core/src/btree/page.rs at line 97
put::put::<_, _, _, Internal>(txn, page, mutable, c.cur, k0, v0, k1v1, l, r)put::put::<_, _, _, Internal>(txn, page, mutable, c.cur as usize, k0, v0, k1v1, l, r) - replacement in sanakirja-core/src/btree/page.rs at line 141
assert!(c.cur < c.total + 1);assert!(c.cur >= 0 && (c.cur as usize) < c.total + 1); - replacement in sanakirja-core/src/btree/page.rs at line 155
assert!(c.cur < c.total);assert!(c.cur >= 0 && (c.cur as usize) < c.total); - replacement in sanakirja-core/src/btree/page.rs at line 166
let off = c.cur * f;let off = c.cur as usize * f; - replacement in sanakirja-core/src/btree/page.rs at line 168
core::ptr::copy(kv_ptr.add(f), kv_ptr, f * (n - c.cur - 1));core::ptr::copy(kv_ptr.add(f), kv_ptr, f * (n - c.cur as usize - 1)); - replacement in sanakirja-core/src/btree/page.rs at line 171
let ptr = p.add(HDR + c.cur * 8) as *mut u64;core::ptr::copy(ptr.offset(1), ptr, hdr.n() as usize - c.cur);let ptr = p.add(HDR + c.cur as usize * 8) as *mut u64;core::ptr::copy(ptr.offset(1), ptr, hdr.n() as usize - c.cur as usize); - replacement in sanakirja-core/src/btree/page.rs at line 192
let (s0, s1) = s.split_at(c.cur);let (s0, s1) = s.split_at(c.cur as usize); - replacement in sanakirja-core/src/btree/page.rs at line 198
let (s0, s1) = s.split_at(c.cur);let (s0, s1) = s.split_at(c.cur as usize); - replacement in sanakirja-core/src/btree/page.rs at line 256
let rc = <Page<K, V>>::first_cursor(m.other.as_page());let rc = Cursor::new(m.other.as_page(), 0); - replacement in sanakirja-core/src/btree/page.rs at line 301
c.cur >= c.totalc.cur >= c.total as isize}fn is_init(_: crate::Page, c: &Self::Cursor) -> bool {c.cur < 0 - replacement in sanakirja-core/src/btree/page.rs at line 308
fn first_cursor(p: crate::Page) -> Self::Cursor {let hdr = header(p);Cursor {cur: 0,total: hdr.n() as usize,is_leaf: hdr.is_leaf(),}fn cursor_before(p: crate::Page) -> Self::Cursor {Cursor::new(p, -1) - replacement in sanakirja-core/src/btree/page.rs at line 311
fn last_cursor(p: crate::Page) -> Self::Cursor {let hdr = header(p);let total = hdr.n() as usize;Cursor {cur: total - 1,total,is_leaf: hdr.is_leaf(),}fn cursor_after(p: crate::Page) -> Self::Cursor {Cursor::after(p) - replacement in sanakirja-core/src/btree/page.rs at line 314
unsafe fn unchecked_current<'a, T: LoadPage>(fn current<'a, T: LoadPage>( - replacement in sanakirja-core/src/btree/page.rs at line 318[4.3872]→[4.3872:3903](∅→∅),[4.3903]→[4.19505:19528](∅→∅),[4.7257]→[4.19505:19528](∅→∅),[4.19505]→[4.19505:19528](∅→∅)
) -> (&'a K, &'a V, u64) {if c.is_leaf {) -> Option<(&'a K, &'a V, u64)> {if c.cur < 0 || c.cur >= c.total as isize {None} else if c.is_leaf { - replacement in sanakirja-core/src/btree/page.rs at line 326
hdr + c.cur * fhdr + c.cur as usize * f - replacement in sanakirja-core/src/btree/page.rs at line 328
let (k, v) = read::<T, K, V>(txn, page.data.as_ptr().add(off as usize));(K::from_raw_ptr(txn, k as *const u8),V::from_raw_ptr(txn, v as *const u8),0,)debug!("current {:?}", off);unsafe {let (k, v) = read::<T, K, V>(txn, page.data.as_ptr().add(off as usize));debug!("k {:?}", K::from_raw_ptr(txn, k as *const u8));Some((K::from_raw_ptr(txn, k as *const u8),V::from_raw_ptr(txn, v as *const u8),0,))} - replacement in sanakirja-core/src/btree/page.rs at line 339
let off = u64::from_le(*(page.data.as_ptr().add(HDR) as *const u64).add(c.cur));let (k, v) = read::<T, K, V>(txn, page.data.as_ptr().add((off & 0xfff) as usize));(K::from_raw_ptr(txn, k as *const u8),V::from_raw_ptr(txn, v as *const u8),off & !0xfff,)unsafe {let off = u64::from_le(*(page.data.as_ptr().add(HDR) as *const u64).add(c.cur as usize));let (k, v) = read::<T, K, V>(txn, page.data.as_ptr().add((off & 0xfff) as usize));Some((K::from_raw_ptr(txn, k as *const u8),V::from_raw_ptr(txn, v as *const u8),off & !0xfff,))} - edit in sanakirja-core/src/btree/page.rs at line 351
assert!(c.cur >= 0 && c.cur < c.total as isize); - replacement in sanakirja-core/src/btree/page.rs at line 356
hdr + c.cur * fhdr + c.cur as usize * f - replacement in sanakirja-core/src/btree/page.rs at line 358
(u64::from_le(*(page.data.as_ptr().add(HDR + c.cur * 8) as *const u64)) & 0xfff)(u64::from_le(*(page.data.as_ptr().add(HDR + c.cur as usize * 8) as *const u64)) & 0xfff) - edit in sanakirja-core/src/btree/page.rs at line 363
assert!(c.cur >= 0 && c.cur < c.total as isize); - replacement in sanakirja-core/src/btree/page.rs at line 369
(u64::from_le(*(page.data.as_ptr().add(HDR) as *const u64).add(c.cur)) & 0xfff)(u64::from_le(*(page.data.as_ptr().add(HDR) as *const u64).add(c.cur as usize)) & 0xfff) - replacement in sanakirja-core/src/btree/page.rs at line 376
if c.cur < c.total {if c.cur < c.total as isize { - edit in sanakirja-core/src/btree/page.rs at line 388
c.cur = -1; - edit in sanakirja-core/src/btree/page.rs at line 393
assert!(c.cur >= 0); - replacement in sanakirja-core/src/btree/page.rs at line 397
let off = unsafe { *(page.data.as_ptr().add((HDR + c.cur * 8) - 8) as *const u64) };let off = unsafe { *(page.data.as_ptr().add((HDR + c.cur as usize * 8) - 8) as *const u64) }; - edit in sanakirja-core/src/btree/page.rs at line 402
assert!(c.cur < c.total as isize); - replacement in sanakirja-core/src/btree/page.rs at line 406
let off = unsafe { *(page.data.as_ptr().add(HDR + c.cur * 8) as *const u64) };let off = unsafe { *(page.data.as_ptr().offset(HDR as isize + c.cur * 8) as *const u64) }; - replacement in sanakirja-core/src/btree/page.rs at line 439
nn as isize - replacement in sanakirja-core/src/btree/page.rs at line 443
nn as isize - replacement in sanakirja-core/src/btree/page.rs at line 454
total: c.cur,total: c.cur.max(0) as usize, - edit in sanakirja-core/src/btree/page.rs at line 533
#[derive(Debug, Clone, Copy)]pub struct Cursor {cur: usize,total: usize,is_leaf: bool,} - replacement in sanakirja-core/src/btree/page.rs at line 583
let mut rc = <Page<K, V>>::first_cursor(m.other.as_page());let mut rc = Cursor::new(m.other.as_page(), 0); - replacement in sanakirja-core/src/btree/page.rs at line 590
let mut rc = <Page<K, V>>::first_cursor(m.other.as_page());let mut rc = Cursor::new(m.other.as_page(), 0); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 17
let rc = <Page<K, V>>::first_cursor(m.other.as_page());let rc = super::Cursor::new(m.other.as_page(), 0); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 19
let (k, v, r) = unsafe { <Page<K, V>>::unchecked_current(txn, m.other.as_page(), &rc) };let (k, v, r) = <Page<K, V>>::current(txn, m.other.as_page(), &rc).unwrap(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 50
let mut lc = <Page<K, V>>::last_cursor(m.modified.page.as_page());<Page<K, V>>::move_next(m.modified.page.as_page(), &mut lc);let lc = Cursor::after(m.modified.page.as_page()); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 131
let lc = <Page<K, V>>::last_cursor(m.other.as_page());let (k0, v0, r0) = unsafe { <Page<K, V>>::unchecked_current(txn, m.other.as_page(), &lc) };let lc = Cursor::last(m.other.as_page());let (k0, v0, r0) = <Page<K, V>>::current(txn, m.other.as_page(), &lc).unwrap(); - replacement in sanakirja-core/src/btree/page/rebalance.rs at line 135
let rc = <Page<K, V>>::first_cursor(m.modified.page.as_page());let rc = super::Cursor::new(m.modified.page.as_page(), 0); - edit in sanakirja-core/src/btree/page/put.rs at line 35
debug!("{:?} {:?} {:?}", l, r, n); - edit in sanakirja-core/src/btree/mod.rs at line 9
use log::*; - replacement in sanakirja-core/src/btree/mod.rs at line 32
fn first_cursor(p: Page) -> Self::Cursor;fn last_cursor(p: Page) -> Self::Cursor;/// Returns a cursor set before the first element of the page/// (i.e. set to -1).fn cursor_before(p: Page) -> Self::Cursor;fn cursor_first(p: Page) -> Self::Cursor {let mut c = Self::cursor_before(p);debug!("cursor_first {:?}", c);Self::move_next(p, &mut c);debug!("cursor_first {:?}", c);c}/// Returns a cursor set after the last element of the page/// (i.e. to element n)fn cursor_after(p: Page) -> Self::Cursor;fn cursor_last(p: Page) -> Self::Cursor {let mut c = Self::cursor_after(p);Self::move_prev(p, &mut c);c} - edit in sanakirja-core/src/btree/mod.rs at line 76
unsafe fn unchecked_current<'a, T: LoadPage>(txn: &T,p: Page<'a>,c: &Self::Cursor,) -> (&'a K, &'a V, u64); - replacement in sanakirja-core/src/btree/mod.rs at line 80[4.8572]→[4.8572:8611](∅→∅),[4.29132]→[4.46909:46977](∅→∅),[4.8611]→[4.46909:46977](∅→∅),[4.13744]→[4.46909:46977](∅→∅),[4.46909]→[4.46909:46977](∅→∅),[4.46977]→[4.8612:8676](∅→∅),[4.29220]→[4.47025:47041](∅→∅),[4.8676]→[4.47025:47041](∅→∅),[4.47025]→[4.47025:47041](∅→∅)
) -> Option<(&'a K, &'a V, u64)> {if Self::is_empty(p, c) {None} else {unsafe { Some(Self::unchecked_current(txn, p, c)) }}}) -> Option<(&'a K, &'a V, u64)>; - edit in sanakirja-core/src/btree/mod.rs at line 94
fn is_init(p: Page, c: &Self::Cursor) -> bool; - replacement in sanakirja-core/src/btree/mod.rs at line 288[4.50887]→[4.31135:31156](∅→∅),[4.126]→[4.31135:31156](∅→∅),[4.9926]→[4.31135:31156](∅→∅),[4.15028]→[4.31135:31156](∅→∅),[4.52110]→[4.31135:31156](∅→∅)
pub db: CowPage,pub db: u64, - edit in sanakirja-core/src/btree/mod.rs at line 293
pub type Db<K, V> = Db_<K, V, page::Page<K, V>>; - replacement in sanakirja-core/src/btree/mod.rs at line 297
pub fn from_page(db: CowPage) -> Self {pub fn from_page(db: u64) -> Self { - edit in sanakirja-core/src/btree/mod.rs at line 307[4.440]→[4.15084:15133](∅→∅),[4.52188]→[4.15084:15133](∅→∅),[4.15133]→[4.182:183](∅→∅),[4.182]→[4.182:183](∅→∅)
pub type Db<K, V> = Db_<K, V, page::Page<K, V>>; - replacement in sanakirja-core/src/btree/mod.rs at line 318
db: page.0,db: page.0.offset, - replacement in sanakirja-core/src/btree/mod.rs at line 344
txn.incr_rc(db.db.offset)?;txn.incr_rc(db.db)?; - replacement in sanakirja-core/src/btree/mod.rs at line 379
let mut page = db.db;let mut page = txn.load_page(db.db)?; - replacement in sanakirja-core/src/btree/mod.rs at line 381
let mut cursor = P::first_cursor(page.as_page());let mut cursor = P::cursor_before(page.as_page()); - replacement in sanakirja-core/src/btree/mod.rs at line 409
drop_::<T, K, V, P>(txn, db.db.as_page())drop_::<T, K, V, P>(txn, txn.load_page(db.db)?.as_page()) - replacement in sanakirja-core/src/btree/mod.rs at line 422
let mut cursor = P::first_cursor(p);let left_page = P::left_child(p, &cursor);let mut cursor = P::cursor_before(p);let left_page = P::right_child(p, &cursor); - replacement in sanakirja-core/src/btree/del.rs at line 29
let mut cursor = Cursor::new(db);let mut cursor = Cursor::new(txn, db)?; - replacement in sanakirja-core/src/btree/del.rs at line 55
let (delk, delv, _) = unsafe {let (delk, delv, _) = { - replacement in sanakirja-core/src/btree/del.rs at line 57
P::unchecked_current(txn, cur.page.as_page(), cur.cursor.as_ref().unwrap())P::current(txn, cur.page.as_page(), &cur.cursor).unwrap() - replacement in sanakirja-core/src/btree/del.rs at line 137
let mut left_page = P::right_child(cur.page.as_page(), cur.cursor.as_ref().unwrap());let mut left_page = P::right_child(cur.page.as_page(), &cur.cursor); - replacement in sanakirja-core/src/btree/del.rs at line 146
let curs = P::first_cursor(page.as_page());let curs = P::cursor_first(page.as_page()); - replacement in sanakirja-core/src/btree/del.rs at line 150
cursor: Some(curs),cursor: curs, - replacement in sanakirja-core/src/btree/del.rs at line 171
let (c0, c1) = P::split_at(curs0.page.as_page(), curs0.cursor.as_ref().unwrap());debug!("curs0 = {:?}", curs0);let (c0, c1) = P::split_at(curs0.page.as_page(), &curs0.cursor); - replacement in sanakirja-core/src/btree/del.rs at line 188
let (k, v, _) = unsafe { P::unchecked_current(txn, curs0.page.as_page(), &c0) };debug!("{:?}", c0);let (k, v, _) = P::current(txn, curs0.page.as_page(), &c1).unwrap(); - replacement in sanakirja-core/src/btree/del.rs at line 228
let c = curs.cursor.as_mut().unwrap();// let c = curs.cursor.as_mut().unwrap(); - replacement in sanakirja-core/src/btree/del.rs at line 232
let other = txn.load_page(P::left_child(curs.page.as_page(), c))?;let other = txn.load_page(P::left_child(curs.page.as_page(), &curs.cursor))?; - replacement in sanakirja-core/src/btree/del.rs at line 244
let (k, v, r) = if let Some(x) = P::current(txn, curs.page.as_page(), c) {let (k, v, r) = if let Some(x) = P::current(txn, curs.page.as_page(), &curs.cursor) { - replacement in sanakirja-core/src/btree/del.rs at line 250
let (k, v, _) = P::prev(txn, curs.page.as_page(), c).unwrap();let l = P::left_child(curs.page.as_page(), c);let (k, v, _) = P::prev(txn, curs.page.as_page(), &mut curs.cursor).unwrap();let l = P::left_child(curs.page.as_page(), &curs.cursor); - replacement in sanakirja-core/src/btree/del.rs at line 283
let c = curs.cursor.as_ref().unwrap();let (c0, c1) = P::split_at(curs.page.as_page(), c);let (c0, c1) = P::split_at(curs.page.as_page(), &curs.cursor); - replacement in sanakirja-core/src/btree/del.rs at line 503
db.db = txn.load_page(d)?;db.db = d; - replacement in sanakirja-core/src/btree/del.rs at line 513
db.db = page.0db.db = page.0.offset - edit in sanakirja-core/src/btree/del.rs at line 526
let mut c = P::cursor_before(page.0.as_page());P::move_next(page.0.as_page(), &mut c); - replacement in sanakirja-core/src/btree/del.rs at line 532
&P::first_cursor(page.0.as_page()),&c, - replacement in sanakirja-core/src/btree/del.rs at line 550
db.db = page.0db.db = page.0.offset - replacement in sanakirja-core/src/btree/cursor.rs at line 10
pub cursor: Option<P::Cursor>,pub cursor: P::Cursor, - replacement in sanakirja-core/src/btree/cursor.rs at line 69
pub fn new(db: &Db_<K, V, P>) -> Self {pub fn new<T: LoadPage>(txn: &T, db: &Db_<K, V, P>) -> Result<Self, T::Error> { - edit in sanakirja-core/src/btree/cursor.rs at line 71
let page = txn.load_page(db.db)?; - replacement in sanakirja-core/src/btree/cursor.rs at line 73
page: db.db,cursor: None,page,cursor: P::cursor_before(page.as_page()), - replacement in sanakirja-core/src/btree/cursor.rs at line 76
Cursor {Ok(Cursor { - replacement in sanakirja-core/src/btree/cursor.rs at line 80
}}) - replacement in sanakirja-core/src/btree/cursor.rs at line 127
if current.cursor.is_none() {/*if current.cursor.is_none() { - replacement in sanakirja-core/src/btree/cursor.rs at line 129
}let cursor = current.cursor.as_mut().unwrap();}*/let ref mut cursor = current.cursor; - edit in sanakirja-core/src/btree/cursor.rs at line 145
let page = txn.load_page(next_page)?; - replacement in sanakirja-core/src/btree/cursor.rs at line 147
page: txn.load_page(next_page)?,cursor: None,page,cursor: P::cursor_before(page.as_page()), - edit in sanakirja-core/src/btree/cursor.rs at line 166[4.34944]→[4.67731:67858](∅→∅),[4.11340]→[4.67731:67858](∅→∅),[4.25213]→[4.67731:67858](∅→∅),[4.67731]→[4.67731:67858](∅→∅)
// Set the "cursor stack" by setting a skip list cursor in// each page from the root to the appropriate leaf. - edit in sanakirja-core/src/btree/cursor.rs at line 167
assert_eq!(self.pointer, 0);let current = unsafe { &mut *self.stack[self.pointer].as_mut_ptr() };current.cursor = P::cursor_last(current.page.as_page()); - edit in sanakirja-core/src/btree/cursor.rs at line 172
debug!("{:?}", current.page); - replacement in sanakirja-core/src/btree/cursor.rs at line 176[4.68135]→[4.68135:68177](∅→∅),[4.68177]→[4.34945:35024](∅→∅),[4.35024]→[4.68247:68320](∅→∅),[4.68247]→[4.68247:68320](∅→∅),[4.68320]→[4.25214:25312](∅→∅)
if current.cursor.is_none() {current.cursor = Some(P::last_cursor(current.page.as_page()));}let cursor = current.cursor.as_mut().unwrap();let (k, v, r) = unsafe { P::unchecked_current(txn, current.page.as_page(), cursor) };debug!("cursor = {:?}", current.cursor);let (k, v, r) = P::current(txn, current.page.as_page(), &mut current.cursor).unwrap(); - edit in sanakirja-core/src/btree/cursor.rs at line 179
debug!("k {:?} v {:?} r = {:?}", k, v, r); - replacement in sanakirja-core/src/btree/cursor.rs at line 181
self.pointer += 1;self.stack[self.pointer] = MaybeUninit::new(PageCursor {page: txn.load_page(r)?,cursor: None,let page = txn.load_page(r)?;self.push(PageCursor {page,cursor: P::cursor_last(page.as_page()), - edit in sanakirja-core/src/btree/cursor.rs at line 194
'a, - replacement in sanakirja-core/src/btree/cursor.rs at line 197
P: BTreePage<K, V>,P: BTreePage<K, V> + 'a, - replacement in sanakirja-core/src/btree/cursor.rs at line 200
pub fn next<'a, T: LoadPage>(&mut self, txn: &'a mut T) -> Result<Option<(&K, &V)>, T::Error> {pub fn next<T: LoadPage>(&mut self, txn: &T) -> Result<Option<(&'a K, &'a V)>, T::Error> { - replacement in sanakirja-core/src/btree/cursor.rs at line 205[4.82]→[4.82:286](∅→∅),[4.286]→[4.25419:25502](∅→∅),[4.25502]→[4.364:395](∅→∅),[4.364]→[4.364:395](∅→∅),[4.395]→[4.1234:1281](∅→∅),[4.1281]→[4.396:449](∅→∅),[4.70566]→[4.396:449](∅→∅),[4.449]→[4.70622:70713](∅→∅),[4.70622]→[4.70622:70713](∅→∅),[4.70713]→[4.11442:11491](∅→∅),[4.11491]→[4.1282:1359](∅→∅),[4.1359]→[4.584:646](∅→∅),[4.584]→[4.584:646](∅→∅)
if let Some(ref mut c) = current.cursor {// We're inside the page, and have already// processed the left child of the current page// cursor.if let Some((k, v, r)) = P::next(txn, current.page.as_page(), c) {if r > 0 {self.push(PageCursor {page: txn.load_page(r)?,cursor: None,})}return Ok(Some((&*k, &*v)));} else if self.pointer > 0 {self.pop();} else {return Ok(None);if P::is_init(current.page.as_page(), ¤t.cursor) {P::move_next(current.page.as_page(), &mut current.cursor);let left = P::left_child(current.page.as_page(), ¤t.cursor);// Then visit the right child (if any), i.e. push.if left != 0 {let page = txn.load_page(left)?;self.push(PageCursor {page,cursor: P::cursor_before(page.as_page()),})}} else if let Some((k, v, r)) = P::current(txn, current.page.as_page(), ¤t.cursor) {P::move_next(current.page.as_page(), &mut current.cursor);if r > 0 {let page = txn.load_page(r)?;self.push(PageCursor {page,cursor: P::cursor_before(page.as_page()),}) - edit in sanakirja-core/src/btree/cursor.rs at line 225
return Ok(Some((k, v)));} else if self.pointer > 0 {self.pop(); - replacement in sanakirja-core/src/btree/cursor.rs at line 229
current.cursor = Some(P::first_cursor(current.page.as_page()));// First element of a page (not a binding).let cursor = current.cursor.as_ref().unwrap();let left = P::left_child(current.page.as_page(), cursor);// Then visit the right child (if any), i.e. push.if left != 0 {return Ok(None);}}}pub fn prev<T: LoadPage>(&mut self, txn: &T) -> Result<Option<(&'a K, &'a V)>, T::Error> {loop {let current = unsafe { &mut *self.stack[self.pointer].as_mut_ptr() };if P::is_empty(current.page.as_page(), ¤t.cursor) {P::move_prev(current.page.as_page(), &mut current.cursor);let right = P::right_child(current.page.as_page(), ¤t.cursor);if right != 0 {let page = txn.load_page(right)?; - replacement in sanakirja-core/src/btree/cursor.rs at line 243
page: txn.load_page(left)?,cursor: None,page,cursor: P::cursor_after(page.as_page()),})}} else if let Some((k, v, _)) = P::current(txn, current.page.as_page(), ¤t.cursor) {P::move_prev(current.page.as_page(), &mut current.cursor);let l = P::right_child(current.page.as_page(), ¤t.cursor);if l > 0 {let page = txn.load_page(l)?;self.push(PageCursor {page,cursor: P::cursor_after(page.as_page()), - edit in sanakirja-core/src/btree/cursor.rs at line 257
return Ok(Some((k, v,)))} else if self.pointer > 0 {self.pop();} else {return Ok(None); - edit in sanakirja-core/src/btree/cursor.rs at line 265
- replacement in sanakirja/src/tests.rs at line 29
let n = 100_000u64;let n = 1_000u64; - replacement in sanakirja/src/tests.rs at line 45
let mut curs = btree::cursor::Cursor::new(&db);let mut curs = btree::cursor::Cursor::new(&txn, &db).unwrap(); - replacement in sanakirja/src/tests.rs at line 47
while let Some((k, _v)) = curs.next(&mut txn).unwrap() {while let Some((k, v)) = curs.next(&mut txn).unwrap() {debug!("{:?} {:?}", k, v.0[0]); - replacement in sanakirja/src/tests.rs at line 57
let mut curs = btree::cursor::Cursor::new(&db);let mut curs = btree::cursor::Cursor::new(&txn, &db).unwrap(); - replacement in sanakirja/src/tests.rs at line 65
let mut curs = btree::cursor::Cursor::new(&db);let mut curs = btree::cursor::Cursor::new(&txn, &db).unwrap(); - replacement in sanakirja/src/tests.rs at line 74
let mut curs = btree::cursor::Cursor::new(&db);crate::debug::debug(&txn, &[&db], "debug0", true);let mut curs = btree::cursor::Cursor::new(&txn, &db).unwrap(); - replacement in sanakirja/src/tests.rs at line 124
let mut curs = btree::cursor::Cursor::new(&db);let mut curs = btree::cursor::Cursor::new(&txn, &db).unwrap(); - replacement in sanakirja/src/tests.rs at line 186
let mut curs = btree::cursor::Cursor::new(&db);let mut curs = btree::cursor::Cursor::new(&txn, &db).unwrap(); - replacement in sanakirja/src/tests.rs at line 193
let mut curs = btree::cursor::Cursor::new(&db);let mut curs = btree::cursor::Cursor::new(&txn, &db).unwrap(); - replacement in sanakirja/src/tests.rs at line 197
let mut curs = btree::cursor::Cursor::new(&db2);let mut curs = btree::cursor::Cursor::new(&txn, &db2).unwrap(); - replacement in sanakirja/src/tests.rs at line 247
if txn.free.offset > 0 {if txn.free > 0 { - replacement in sanakirja/src/tests.rs at line 254
let mut curs: btree::cursor::Cursor<_, _, B> = btree::cursor::Cursor::new(&db_free);let mut curs: btree::cursor::Cursor<_, _, B> =btree::cursor::Cursor::new(txn, &db_free).unwrap(); - replacement in sanakirja/src/tests.rs at line 272
debug!("------ add_refs {:?}", db.db.offset);debug!("------ add_refs {:?}", db.db); - replacement in sanakirja/src/tests.rs at line 276
match pages.entry(p.offset) {match pages.entry(p) { - replacement in sanakirja/src/tests.rs at line 279
let mut c = P::first_cursor(p.as_page());let p = txn.load_page(p)?;let mut c = P::cursor_first(p.as_page()); - replacement in sanakirja/src/tests.rs at line 284
stack.push(txn.load_page(l)?);stack.push(l); - replacement in sanakirja/src/tests.rs at line 287
stack.push(txn.load_page(r)?)stack.push(r); - replacement in sanakirja/src/tests.rs at line 317
debug!("db = {:?}", db.db.offset);txn.set_root(0, db.db.offset);debug!("db = {:?}", db.db);txn.set_root(0, db.db); - replacement in sanakirja/src/tests.rs at line 330
debug!("db = {:?}", db.db.offset);txn.set_root(0, db.db.offset);debug!("db = {:?}", db.db);txn.set_root(0, db.db); - edit in sanakirja/src/tests.rs at line 438
#[ignore] - replacement in sanakirja/src/tests.rs at line 623
mut p: CowPage,mut p: u64, - replacement in sanakirja/src/tests.rs at line 627
let cursor = P::first_cursor(p.as_page());let l = P::left_child(p.as_page(), &cursor);let pp = txn.load_page(p)?;let cursor = P::cursor_first(pp.as_page());let l = P::left_child(pp.as_page(), &cursor); - replacement in sanakirja/src/tests.rs at line 633
p = txn.load_page(l)?;p = l; - edit in sanakirja/src/tests.rs at line 661
#[ignore] - replacement in sanakirja/src/environment/muttxn.rs at line 17
pub(crate) free: CowPage,pub(crate) free: u64, - replacement in sanakirja/src/environment/muttxn.rs at line 104
let free = CowPage {data: env_.find_offset(header.free_db),offset: header.free_db,};let free = header.free_db; - replacement in sanakirja/src/environment/muttxn.rs at line 109
db: CowPage {offset: header.rc_db,data: env_.find_offset(header.rc_db),},db: header.rc_db, - replacement in sanakirja/src/environment/muttxn.rs at line 139
let mut free_db: btree::Db<u64, ()> =btree::Db::from_page(std::mem::replace(&mut self.free, CowPage::null()));let mut free_db: btree::Db<u64, ()> = btree::Db::from_page(self.free); - replacement in sanakirja/src/environment/muttxn.rs at line 156
(&mut *globptr).free_db = free_db.db.offset.to_le();(&mut *globptr).free_db = free_db.db.to_le(); - replacement in sanakirja/src/environment/muttxn.rs at line 211
if self.free.offset == 0 {if self.free == 0 { - replacement in sanakirja/src/environment/muttxn.rs at line 220
let mut curs = btree::cursor::Cursor::new(&db);let mut curs = btree::cursor::Cursor::new(self, &db)?; - replacement in sanakirja/src/environment/muttxn.rs at line 267
let mut curs = btree::cursor::Cursor::new(&rc_);let mut curs = btree::cursor::Cursor::new(self, &rc_)?; - replacement in sanakirja/src/environment/muttxn.rs at line 300
let mut curs = btree::cursor::Cursor::new(&rc_);let mut curs = btree::cursor::Cursor::new(self, &rc_)?; - replacement in sanakirja/src/environment/muttxn.rs at line 335
let mut curs = btree::cursor::Cursor::new(&rc_);let mut curs = btree::cursor::Cursor::new(self, &rc_)?; - replacement in sanakirja/src/environment/muttxn.rs at line 388
fn root_db<K: Representable, V: Representable>(fn root_db<K: Representable + ?Sized,V: Representable + ?Sized,P: crate::btree::BTreePage<K, V>,>( - replacement in sanakirja/src/environment/muttxn.rs at line 395
) -> Result<Option<sanakirja_core::btree::Db<K, V>>, Error> {use sanakirja_core::LoadPage;) -> Option<sanakirja_core::btree::Db_<K, V, P>> { - replacement in sanakirja/src/environment/muttxn.rs at line 397
Ok(Some(sanakirja_core::btree::Db {db: self.load_page(*db)?,Some(sanakirja_core::btree::Db_ {db: *db, - replacement in sanakirja/src/environment/muttxn.rs at line 402
}))}) - replacement in sanakirja/src/environment/muttxn.rs at line 415
Ok(Some(sanakirja_core::btree::Db {db: self.load_page(db)?,Some(sanakirja_core::btree::Db_ {db, - replacement in sanakirja/src/environment/muttxn.rs at line 420
}))}) - replacement in sanakirja/src/environment/muttxn.rs at line 422
Ok(None)None - replacement in sanakirja/src/environment/mod.rs at line 426
pub trait RootDb: Sized + sanakirja_core::LoadPage {fn root_db<K: Representable, V: Representable>(pub trait RootDb {fn root_db<K: Representable + ?Sized,V: Representable + ?Sized,P: crate::btree::BTreePage<K, V>,>(&self,n: usize,) -> Option<sanakirja_core::btree::Db_<K, V, P>>;}impl<E: Borrow<Env>> RootDb for Txn<E> {fn root_db<K: Representable + ?Sized,V: Representable + ?Sized,P: crate::btree::BTreePage<K, V>,>( - replacement in sanakirja/src/environment/mod.rs at line 445
) -> Result<Option<sanakirja_core::btree::Db<K, V>>, Self::Error>;) -> Option<sanakirja_core::btree::Db_<K, V, P>> {unsafe {let env = self.env.borrow();let db = {let maps = env.mmaps.lock();*(maps[0].ptr.add(self.root * PAGE_SIZE + GLOBAL_HEADER_SIZE + 8 * n)as *mut u64)};if db != 0 {Some(sanakirja_core::btree::Db_ {db,k: std::marker::PhantomData,v: std::marker::PhantomData,p: std::marker::PhantomData,})} else {None}}} - replacement in sanakirja/src/debug.rs at line 28
print_page::<T, K, V, PP>(t, &mut h, &mut buf, &db.db.as_page(), recurse);print_page::<T, K, V, PP>(t,&mut h,&mut buf,&t.load_page(db.db).unwrap().as_page(),recurse,); - replacement in sanakirja/src/debug.rs at line 95
let mut cursor = P::first_cursor(*p);let mut cursor = P::cursor_first(*p);