rc_t bt_cursor_t::_check_page_update(btree_page_h &p) { // was the page changed? if (_pid != p.pid() || p.get_page_lsn() != _lsn) { // check if the page still contains the key we are based on bool found = false; if (p.fence_contains(_key)) { // it still contains. just re-locate _slot p.search(_key, found, _slot); } else { // we have to re-locate the page W_DO( btree_impl::_ux_traverse(_store, _key, btree_impl::t_fence_contain, LATCH_SH, p)); p.search(_key, found, _slot); } w_assert1(found || !_needs_lock || (!_forward && !_upper_inclusive && !_dont_move_next)); // see _locate_first _set_current_page(p); } return RCOK; }
rc_t btree_impl::_sx_split_if_needed (btree_page_h &page, const w_keystr_t &new_key) { bool need_split = !page.check_space_for_insert_node(new_key) || (page.is_insertion_extremely_skewed_right() && page.check_chance_for_norecord_split(new_key)); if (!need_split) { return RCOK; // easy } PageID new_page_id; // we are running user transaction. simply call SSX split. W_DO(_sx_split_foster(page, new_page_id, new_key)); // After split, the new page might be the parent of the new_key now. if (!page.fence_contains(new_key)) { btree_page_h new_page; W_DO(new_page.fix_nonroot(page, new_page_id, LATCH_EX)); w_assert1(new_page.fence_contains(new_key)); page.unfix(); page = new_page; } return RCOK; }