bool split_branch (tree_s *tree, branch_s *parent, branch_s *child, s64 k) { branch_s *sibling; snint upper; snint midpoint; u32 upper_key; if (!branch_is_full(child)) return FALSE; FN; sibling = new_branch(tree); midpoint = child->br_num / 2; upper = midpoint + 1; sibling->br_first = child->br_key[midpoint].k_node; upper_key = child->br_key[midpoint].k_key; memmove(sibling->br_key, &child->br_key[upper], sizeof(key_s) * (child->br_num - upper)); sibling->br_num = child->br_num - upper; child->br_num = midpoint; insert_sibling(parent, sibling, k, upper_key); return TRUE; }
bool split_leaf (void *self, branch_s *parent, int k, unint len) { leaf_s *child = self; leaf_s *sibling; int upper; u64 upper_key; FN; if (!leaf_is_full(child, len)) { return FALSE; } sibling = new_leaf(bdev(parent)); upper = (child->l_num + 1) / 2; upper_key = child->l_rec[upper].r_key; copy_recs(sibling, child, upper); child->l_num = upper; child->l_total += (BLK_SIZE - sizeof(leaf_s)) - sibling->l_total; bdirty(child); bput(child); insert_sibling(parent, sibling, k, upper_key); bput(sibling); return TRUE; }
bool split_branch (void *self, branch_s *parent, int k) { branch_s *child = self; branch_s *sibling; int upper; int midpoint; u64 midpoint_key; FN; if (!branch_is_full(child)) return FALSE; sibling = new_branch(bdev(child)); midpoint = child->br_num / 2; upper = midpoint + 1; sibling->br_first = child->br_key[midpoint].k_block; midpoint_key = child->br_key[midpoint].k_key; memmove(sibling->br_key, &child->br_key[upper], sizeof(key_s) * (child->br_num - upper)); sibling->br_num = child->br_num - upper; child->br_num = midpoint; bdirty(child); bput(child); insert_sibling(parent, sibling, k, midpoint_key); bput(sibling); return TRUE; }
static bool split_leaf (tree_s *tree, leaf_s *child, branch_s *parent, s64 k, unint size) { leaf_s *sibling; snint upper; u64 upper_key; if (!leaf_is_full(child, size)) { return FALSE; } FN; sibling = new_leaf(tree); upper = (child->l_num + 1) / 2; upper_key = child->l_rec[upper].r_key; copy_recs(sibling, child, upper); child->l_num = upper; child->l_total += (BLK_SIZE - sizeof(leaf_s)) - sibling->l_total; tau_blog(child); tau_bput(child); insert_sibling(parent, sibling, k, upper_key); tau_bput(sibling); return TRUE; }