mirror of
https://github.com/MariaDB/server.git
synced 2025-02-01 03:21:53 +01:00
branches/innodb+: btr_cur_search_to_nth_level(): Treat BTR_DELETE in
the same way as BTR_INSERT and BTR_DELETE_MARK: only perform (buffer) the operation when the page is not in the buffer pool. BTR_INSERT, BTR_DELETE_MARK, BTR_DELETE: Make the documentation say that these flags are ignored when the page is in the buffer pool. enum row_search_result: Remove ROW_NOT_DELETED, which BTR_CUR_DELETE_FAILED was mapped to. enum btr_cur_method: Remove BTR_CUR_DELETE_FAILED. The btr_cur_search_to_nth_level() will no longer attempt to execute the BTR_DELETE when the page is in the buffer pool. row_search_index_entry(): Remove the mapping from BTR_CUR_DELETE_FAILED to ROW_NOT_DELETED. The caller will have to attempt purge when the record is in the buffer pool. row_purge_remove_sec_if_poss_leaf(): Attempt to purge the record if it was found in the buffer pool. This addresses Issue #466. rb://268
This commit is contained in:
parent
01568064e8
commit
08993371d5
9 changed files with 38 additions and 61 deletions
|
@ -338,7 +338,8 @@ btr_cur_search_to_nth_level(
|
|||
Inserts should always be made using
|
||||
PAGE_CUR_LE to search the position! */
|
||||
ulint latch_mode, /*!< in: BTR_SEARCH_LEAF, ..., ORed with
|
||||
BTR_INSERT and BTR_ESTIMATE;
|
||||
at most one of BTR_INSERT, BTR_DELETE_MARK,
|
||||
BTR_DELETE, or BTR_ESTIMATE;
|
||||
cursor->left_block is used to store a pointer
|
||||
to the left neighbor page, in the cases
|
||||
BTR_SEARCH_PREV and BTR_MODIFY_PREV;
|
||||
|
@ -773,35 +774,6 @@ retry_page_get:
|
|||
|| mode != PAGE_CUR_LE);
|
||||
ut_ad(cursor->low_match != ULINT_UNDEFINED
|
||||
|| mode != PAGE_CUR_LE);
|
||||
|
||||
/* If this was a delete operation, the leaf page was
|
||||
in the buffer pool, and a matching record was found in
|
||||
the leaf page, attempt to delete it. If the deletion
|
||||
fails, set the cursor flag accordingly. */
|
||||
if (UNIV_UNLIKELY(btr_op == BTR_DELETE_OP)
|
||||
&& low_match == dtuple_get_n_fields(tuple)
|
||||
&& !page_cur_is_before_first(page_cursor)) {
|
||||
|
||||
/* Before attempting to purge a record, check
|
||||
if it is safe to do so. */
|
||||
if (!row_purge_poss_sec(cursor->purge_node,
|
||||
index, tuple)) {
|
||||
|
||||
cursor->flag = BTR_CUR_DELETE_REF;
|
||||
} else {
|
||||
/* Only delete-marked records should
|
||||
be purged. */
|
||||
ut_ad(REC_INFO_DELETED_FLAG
|
||||
& rec_get_info_bits(
|
||||
btr_cur_get_rec(cursor),
|
||||
page_is_comp(page)));
|
||||
|
||||
if (!btr_cur_optimistic_delete(cursor, mtr)) {
|
||||
|
||||
cursor->flag = BTR_CUR_DELETE_FAILED;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func_exit:
|
||||
|
|
|
@ -71,7 +71,8 @@ enum btr_latch_mode {
|
|||
/* BTR_INSERT, BTR_DELETE and BTR_DELETE_MARK are mutually exclusive. */
|
||||
|
||||
/** If this is ORed to btr_latch_mode, it means that the search tuple
|
||||
will be inserted to the index, at the searched position */
|
||||
will be inserted to the index, at the searched position.
|
||||
When the record is not in the buffer pool, try to use the insert buffer. */
|
||||
#define BTR_INSERT 512
|
||||
|
||||
/** This flag ORed to btr_latch_mode says that we do the search in query
|
||||
|
@ -84,11 +85,11 @@ the insert buffer to speed up inserts */
|
|||
#define BTR_IGNORE_SEC_UNIQUE 2048
|
||||
|
||||
/** Try to delete mark the record at the searched position using the
|
||||
insert/delete buffer. */
|
||||
insert/delete buffer when the record is not in the buffer pool. */
|
||||
#define BTR_DELETE_MARK 4096
|
||||
|
||||
/** Try to delete the record at the searched position using the insert/delete
|
||||
buffer. */
|
||||
/** Try to purge the record at the searched position using the insert/delete
|
||||
buffer when the record is not in the buffer pool. */
|
||||
#define BTR_DELETE 8192
|
||||
|
||||
/**************************************************************//**
|
||||
|
|
|
@ -138,7 +138,8 @@ btr_cur_search_to_nth_level(
|
|||
should always be made using PAGE_CUR_LE to
|
||||
search the position! */
|
||||
ulint latch_mode, /*!< in: BTR_SEARCH_LEAF, ..., ORed with
|
||||
BTR_INSERT and BTR_ESTIMATE;
|
||||
at most one of BTR_INSERT, BTR_DELETE_MARK,
|
||||
BTR_DELETE, or BTR_ESTIMATE;
|
||||
cursor->left_block is used to store a pointer
|
||||
to the left neighbor page, in the cases
|
||||
BTR_SEARCH_PREV and BTR_MODIFY_PREV;
|
||||
|
@ -634,9 +635,7 @@ enum btr_cur_method {
|
|||
mark in the insert/delete buffer */
|
||||
BTR_CUR_DELETE_IBUF, /*!< performed the intended delete in
|
||||
the insert/delete buffer */
|
||||
BTR_CUR_DELETE_REF, /*!< row_purge_poss_sec() failed */
|
||||
BTR_CUR_DELETE_FAILED /*!< an optimistic delete could not be
|
||||
performed */
|
||||
BTR_CUR_DELETE_REF /*!< row_purge_poss_sec() failed */
|
||||
};
|
||||
|
||||
/** The tree cursor: the definition appears here only for the compiler
|
||||
|
|
|
@ -269,8 +269,6 @@ enum row_search_result {
|
|||
enqueued in the insert/delete buffer */
|
||||
ROW_NOT_DELETED_REF, /*!< BTR_DELETE was specified, and
|
||||
row_purge_poss_sec() failed */
|
||||
ROW_NOT_DELETED, /*!< BTR_DELETE was specified, and the
|
||||
optimistic delete failed */
|
||||
};
|
||||
|
||||
/***************************************************************//**
|
||||
|
|
|
@ -297,7 +297,6 @@ row_purge_remove_sec_if_poss_tree(
|
|||
break;
|
||||
case ROW_BUFFERED:
|
||||
case ROW_NOT_DELETED_REF:
|
||||
case ROW_NOT_DELETED:
|
||||
/* These are invalid outcomes, because the mode passed
|
||||
to row_search_index_entry() did not include any of the
|
||||
flags BTR_INSERT, BTR_DELETE, or BTR_DELETE_MARK. */
|
||||
|
@ -366,24 +365,40 @@ row_purge_remove_sec_if_poss_leaf(
|
|||
search_result = row_search_index_entry(
|
||||
index, entry, BTR_MODIFY_LEAF | BTR_DELETE, &pcur, &mtr);
|
||||
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
|
||||
switch (search_result) {
|
||||
case ROW_NOT_DELETED:
|
||||
/* The index entry could not be deleted. */
|
||||
return(FALSE);
|
||||
ibool success;
|
||||
case ROW_FOUND:
|
||||
/* Before attempting to purge a record, check
|
||||
if it is safe to do so. */
|
||||
if (row_purge_poss_sec(node, index, entry)) {
|
||||
btr_cur_t* btr_cur = btr_pcur_get_btr_cur(&pcur);
|
||||
|
||||
/* Only delete-marked records should be purged. */
|
||||
ut_ad(REC_INFO_DELETED_FLAG
|
||||
& rec_get_info_bits(
|
||||
btr_cur_get_rec(btr_cur),
|
||||
dict_table_is_comp(index->table)));
|
||||
|
||||
if (!btr_cur_optimistic_delete(btr_cur, &mtr)) {
|
||||
|
||||
/* The index entry could not be deleted. */
|
||||
success = FALSE;
|
||||
goto func_exit;
|
||||
}
|
||||
}
|
||||
/* fall through (the index entry is still needed,
|
||||
or the deletion succeeded) */
|
||||
case ROW_NOT_DELETED_REF:
|
||||
/* The index entry is still needed. */
|
||||
case ROW_NOT_FOUND:
|
||||
/* The index entry does not exist, nothing to do. */
|
||||
case ROW_FOUND:
|
||||
/* The index entry existed in the buffer pool
|
||||
and was deleted because of the BTR_DELETE. */
|
||||
case ROW_BUFFERED:
|
||||
/* The deletion was buffered. */
|
||||
return(TRUE);
|
||||
case ROW_NOT_FOUND:
|
||||
/* The index entry does not exist, nothing to do. */
|
||||
success = TRUE;
|
||||
func_exit:
|
||||
btr_pcur_close(&pcur);
|
||||
mtr_commit(&mtr);
|
||||
return(success);
|
||||
}
|
||||
|
||||
ut_error;
|
||||
|
|
|
@ -755,10 +755,6 @@ row_search_index_entry(
|
|||
ut_a(mode & BTR_DELETE);
|
||||
return(ROW_NOT_DELETED_REF);
|
||||
|
||||
case BTR_CUR_DELETE_FAILED:
|
||||
ut_a(mode & BTR_DELETE);
|
||||
return(ROW_NOT_DELETED);
|
||||
|
||||
case BTR_CUR_DEL_MARK_IBUF:
|
||||
case BTR_CUR_DELETE_IBUF:
|
||||
case BTR_CUR_INSERT_TO_IBUF:
|
||||
|
|
|
@ -168,7 +168,6 @@ row_undo_ins_remove_sec_low(
|
|||
case ROW_FOUND:
|
||||
break;
|
||||
case ROW_BUFFERED:
|
||||
case ROW_NOT_DELETED:
|
||||
case ROW_NOT_DELETED_REF:
|
||||
/* These are invalid outcomes, because the mode passed
|
||||
to row_search_index_entry() did not include any of the
|
||||
|
|
|
@ -350,7 +350,6 @@ row_undo_mod_del_mark_or_remove_sec_low(
|
|||
case ROW_FOUND:
|
||||
break;
|
||||
case ROW_BUFFERED:
|
||||
case ROW_NOT_DELETED:
|
||||
case ROW_NOT_DELETED_REF:
|
||||
/* These are invalid outcomes, because the mode passed
|
||||
to row_search_index_entry() did not include any of the
|
||||
|
@ -487,7 +486,6 @@ row_undo_mod_del_unmark_sec_and_undo_update(
|
|||
|
||||
switch (search_result) {
|
||||
case ROW_BUFFERED:
|
||||
case ROW_NOT_DELETED:
|
||||
case ROW_NOT_DELETED_REF:
|
||||
/* These are invalid outcomes, because the mode passed
|
||||
to row_search_index_entry() did not include any of the
|
||||
|
|
|
@ -1476,7 +1476,6 @@ row_upd_sec_index_entry(
|
|||
rec = btr_cur_get_rec(btr_cur);
|
||||
|
||||
switch (search_result) {
|
||||
case ROW_NOT_DELETED: /* should only occur for BTR_DELETE */
|
||||
case ROW_NOT_DELETED_REF: /* should only occur for BTR_DELETE */
|
||||
ut_error;
|
||||
break;
|
||||
|
|
Loading…
Add table
Reference in a new issue