pijul nest
guest [sign in]

Rebalance: put can free pages without splitting (compaction)

[?]
Feb 23, 2021, 8:21 PM
PPI5ZTZP2GMKTCFQWF2SXIT6VNOY5U7PJSMX4ZR34DLMYG3GSSFQC

Dependencies

  • [2] L5CVF6UJ Debugging
  • [3] Q7DRIBBR Debugging replace (which cannot be del+put)
  • [4] QEUTVAZ4 Splitting btree::page
  • [5] H3FVSQIQ Unsized pages
  • [6] KX3WVNZW Testing/debugging "rebalance causes split of the root"

Change contents

  • replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 58
    [2.1031][2.1031:1065]()
    assert_eq!(freed, 0);
    [2.1031]
    [2.1065]
    if freed > 0 {
    let b = if is_dirty { 1 } else { 0 };
    freed_[0] = freed | b;
    }
  • replacement in sanakirja-core/src/btree/page_unsized/rebalance.rs at line 86
    [2.1565][2.1565:1599]()
    assert_eq!(freed, 0);
    [2.1565]
    [2.1599]
    if freed > 0 {
    let b = if is_dirty { 1 } else { 0 };
    freed_[0] = freed | b;
    }
  • replacement in sanakirja-core/src/btree/page/rebalance.rs at line 56
    [2.5281][2.5281:5315]()
    assert_eq!(freed, 0);
    [2.5281]
    [2.5315]
    if freed > 0 {
    let b = if is_dirty { 1 } else { 0 };
    // index 0 is ok here: if a page is freed, it means we
    // just compacted a page, which implies that the call
    // to `put` above didn't free.
    freed_[0] = freed | b
    }
  • replacement in sanakirja-core/src/btree/page/rebalance.rs at line 87
    [2.5815][2.5815:5849]()
    assert_eq!(freed, 0);
    [2.5815]
    [2.5849]
    if freed > 0 {
    let b = if is_dirty { 1 } else { 0 };
    // index 0 is ok here: if we freed a page in the call
    // to `del` above, it is mutable and we can allocate
    // on it. Else, we just compacted a page, but that
    // also means `del` above didn't free.
    freed_[0] = freed | b
    }
  • edit in sanakirja-core/src/btree/page/rebalance.rs at line 106
    [2.6227][2.6227:6286]()
    debug!("freed {:?} {:?}", line!(), freed);