rc_t btree_impl::_ux_adopt_foster_core (btree_page_h &parent, btree_page_h &child, const w_keystr_t &new_child_key) { w_assert1 (g_xct()->is_single_log_sys_xct()); w_assert1 (parent.is_fixed()); w_assert1 (parent.latch_mode() == LATCH_EX); w_assert1 (parent.is_node()); w_assert1 (child.is_fixed()); w_assert1 (child.latch_mode() == LATCH_EX); w_assert0 (child.get_foster() != 0); PageID new_child_pid = child.get_foster(); if (smlevel_0::bf->is_swizzled_pointer(new_child_pid)) { smlevel_0::bf->unswizzle(parent.get_generic_page(), GeneralRecordIds::FOSTER_CHILD, true, &new_child_pid); } w_assert1(!smlevel_0::bf->is_swizzled_pointer(new_child_pid)); lsn_t child_emlsn = child.get_foster_emlsn(); W_DO(log_btree_foster_adopt (parent, child, new_child_pid, child_emlsn, new_child_key)); _ux_adopt_foster_apply_parent (parent, new_child_pid, child_emlsn, new_child_key); _ux_adopt_foster_apply_child (child); // Switch parent of newly adopted child // CS TODO: I'm not sure we can do this because we don't hold a latch on new_child_pid smlevel_0::bf->switch_parent(new_child_pid, parent.get_generic_page()); w_assert3(parent.is_consistent(true, true)); w_assert3(child.is_consistent(true, true)); return RCOK; }
rc_t btree_impl::_sx_adopt_foster_all_core ( btree_page_h &parent, bool is_root, bool recursive) { // TODO this should use the improved tree-walk-through // See jira ticket:60 "Tree walk-through without more than 2 pages latched" (originally trac ticket:62) w_assert1 (xct()->is_sys_xct()); w_assert1 (parent.is_fixed()); w_assert1 (parent.latch_mode() == LATCH_EX); if (parent.is_node()) { w_assert1(parent.pid0()); W_DO(_sx_adopt_foster_sweep(parent)); if (recursive) { // also adopt at all children recursively for (int i = -1; i < parent.nrecs(); ++i) { btree_page_h child; PageID shpid_opaqueptr = i == -1 ? parent.get_foster_opaqueptr() : parent.child_opaqueptr(i); W_DO(child.fix_nonroot(parent, shpid_opaqueptr, LATCH_EX)); W_DO(_sx_adopt_foster_all_core(child, false, true)); } } } // after all adopts, if this parent is the root and has foster, // let's grow the tree if (is_root && parent.get_foster()) { W_DO(_sx_grow_tree(parent)); W_DO(_sx_adopt_foster_sweep(parent)); } w_assert3(parent.is_consistent(true, true)); return RCOK; }