Merge mysql-5.1 to mysql-5.5.
This commit is contained in:
commit
bd6dbf21bb
@ -1844,6 +1844,7 @@ btr_root_raise_and_insert(
|
|||||||
root = btr_cur_get_page(cursor);
|
root = btr_cur_get_page(cursor);
|
||||||
root_block = btr_cur_get_block(cursor);
|
root_block = btr_cur_get_block(cursor);
|
||||||
root_page_zip = buf_block_get_page_zip(root_block);
|
root_page_zip = buf_block_get_page_zip(root_block);
|
||||||
|
ut_ad(page_get_n_recs(root) > 0);
|
||||||
#ifdef UNIV_ZIP_DEBUG
|
#ifdef UNIV_ZIP_DEBUG
|
||||||
ut_a(!root_page_zip || page_zip_validate(root_page_zip, root));
|
ut_a(!root_page_zip || page_zip_validate(root_page_zip, root));
|
||||||
#endif /* UNIV_ZIP_DEBUG */
|
#endif /* UNIV_ZIP_DEBUG */
|
||||||
@ -2324,13 +2325,21 @@ btr_insert_on_non_leaf_level_func(
|
|||||||
BTR_CONT_MODIFY_TREE,
|
BTR_CONT_MODIFY_TREE,
|
||||||
&cursor, 0, file, line, mtr);
|
&cursor, 0, file, line, mtr);
|
||||||
|
|
||||||
err = btr_cur_pessimistic_insert(BTR_NO_LOCKING_FLAG
|
ut_ad(cursor.flag == BTR_CUR_BINARY);
|
||||||
| BTR_KEEP_SYS_FLAG
|
|
||||||
| BTR_NO_UNDO_LOG_FLAG,
|
err = btr_cur_optimistic_insert(
|
||||||
&cursor, tuple, &rec,
|
BTR_NO_LOCKING_FLAG | BTR_KEEP_SYS_FLAG
|
||||||
|
| BTR_NO_UNDO_LOG_FLAG, &cursor, tuple, &rec,
|
||||||
&dummy_big_rec, 0, NULL, mtr);
|
&dummy_big_rec, 0, NULL, mtr);
|
||||||
|
|
||||||
|
if (err == DB_FAIL) {
|
||||||
|
err = btr_cur_pessimistic_insert(
|
||||||
|
BTR_NO_LOCKING_FLAG | BTR_KEEP_SYS_FLAG
|
||||||
|
| BTR_NO_UNDO_LOG_FLAG,
|
||||||
|
&cursor, tuple, &rec, &dummy_big_rec, 0, NULL, mtr);
|
||||||
ut_a(err == DB_SUCCESS);
|
ut_a(err == DB_SUCCESS);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************//**
|
/**************************************************************//**
|
||||||
Attaches the halves of an index page on the appropriate level in an
|
Attaches the halves of an index page on the appropriate level in an
|
||||||
|
@ -1323,7 +1323,12 @@ fail_err:
|
|||||||
|
|
||||||
if (UNIV_UNLIKELY(reorg)) {
|
if (UNIV_UNLIKELY(reorg)) {
|
||||||
ut_a(zip_size);
|
ut_a(zip_size);
|
||||||
ut_a(*rec);
|
/* It's possible for rec to be NULL if the
|
||||||
|
page is compressed. This is because a
|
||||||
|
reorganized page may become incompressible. */
|
||||||
|
if (!*rec) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1459,20 +1464,9 @@ btr_cur_pessimistic_insert(
|
|||||||
ut_ad(mtr_memo_contains(mtr, btr_cur_get_block(cursor),
|
ut_ad(mtr_memo_contains(mtr, btr_cur_get_block(cursor),
|
||||||
MTR_MEMO_PAGE_X_FIX));
|
MTR_MEMO_PAGE_X_FIX));
|
||||||
|
|
||||||
/* Try first an optimistic insert; reset the cursor flag: we do not
|
|
||||||
assume anything of how it was positioned */
|
|
||||||
|
|
||||||
cursor->flag = BTR_CUR_BINARY;
|
cursor->flag = BTR_CUR_BINARY;
|
||||||
|
|
||||||
err = btr_cur_optimistic_insert(flags, cursor, entry, rec,
|
/* Check locks and write to undo log, if specified */
|
||||||
big_rec, n_ext, thr, mtr);
|
|
||||||
if (err != DB_FAIL) {
|
|
||||||
|
|
||||||
return(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Retry with a pessimistic insert. Check locks and write to undo log,
|
|
||||||
if specified */
|
|
||||||
|
|
||||||
err = btr_cur_ins_lock_and_undo(flags, cursor, entry,
|
err = btr_cur_ins_lock_and_undo(flags, cursor, entry,
|
||||||
thr, mtr, &dummy_inh);
|
thr, mtr, &dummy_inh);
|
||||||
@ -2076,8 +2070,12 @@ any_extern:
|
|||||||
goto err_exit;
|
goto err_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
max_size = old_rec_size
|
/* We do not attempt to reorganize if the page is compressed.
|
||||||
+ page_get_max_insert_size_after_reorganize(page, 1);
|
This is because the page may fail to compress after reorganization. */
|
||||||
|
max_size = page_zip
|
||||||
|
? page_get_max_insert_size(page, 1)
|
||||||
|
: (old_rec_size
|
||||||
|
+ page_get_max_insert_size_after_reorganize(page, 1));
|
||||||
|
|
||||||
if (!(((max_size >= BTR_CUR_PAGE_REORGANIZE_LIMIT)
|
if (!(((max_size >= BTR_CUR_PAGE_REORGANIZE_LIMIT)
|
||||||
&& (max_size >= new_rec_size))
|
&& (max_size >= new_rec_size))
|
||||||
@ -2433,7 +2431,12 @@ make_external:
|
|||||||
err = DB_SUCCESS;
|
err = DB_SUCCESS;
|
||||||
goto return_after_reservations;
|
goto return_after_reservations;
|
||||||
} else {
|
} else {
|
||||||
ut_a(optim_err != DB_UNDERFLOW);
|
/* If the page is compressed and it initially
|
||||||
|
compresses very well, and there is a subsequent insert
|
||||||
|
of a badly-compressing record, it is possible for
|
||||||
|
btr_cur_optimistic_update() to return DB_UNDERFLOW and
|
||||||
|
btr_cur_insert_if_possible() to return FALSE. */
|
||||||
|
ut_a(page_zip || optim_err != DB_UNDERFLOW);
|
||||||
|
|
||||||
/* Out of space: reset the free bits. */
|
/* Out of space: reset the free bits. */
|
||||||
if (!dict_index_is_clust(index)
|
if (!dict_index_is_clust(index)
|
||||||
@ -2462,7 +2465,9 @@ make_external:
|
|||||||
was_first = page_cur_is_before_first(page_cursor);
|
was_first = page_cur_is_before_first(page_cursor);
|
||||||
|
|
||||||
/* Lock checks and undo logging were already performed by
|
/* Lock checks and undo logging were already performed by
|
||||||
btr_cur_upd_lock_and_undo(). */
|
btr_cur_upd_lock_and_undo(). We do not try
|
||||||
|
btr_cur_optimistic_insert() because
|
||||||
|
btr_cur_insert_if_possible() already failed above. */
|
||||||
|
|
||||||
err = btr_cur_pessimistic_insert(BTR_NO_UNDO_LOG_FLAG
|
err = btr_cur_pessimistic_insert(BTR_NO_UNDO_LOG_FLAG
|
||||||
| BTR_NO_LOCKING_FLAG
|
| BTR_NO_LOCKING_FLAG
|
||||||
|
@ -781,12 +781,18 @@ page_copy_rec_list_start(
|
|||||||
if (UNIV_LIKELY_NULL(new_page_zip)) {
|
if (UNIV_LIKELY_NULL(new_page_zip)) {
|
||||||
mtr_set_log_mode(mtr, log_mode);
|
mtr_set_log_mode(mtr, log_mode);
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("page_copy_rec_list_start_compress_fail",
|
||||||
|
goto zip_reorganize;);
|
||||||
|
|
||||||
if (UNIV_UNLIKELY
|
if (UNIV_UNLIKELY
|
||||||
(!page_zip_compress(new_page_zip, new_page, index, mtr))) {
|
(!page_zip_compress(new_page_zip, new_page, index, mtr))) {
|
||||||
|
ulint ret_pos;
|
||||||
|
#ifndef DBUG_OFF
|
||||||
|
zip_reorganize:
|
||||||
|
#endif /* DBUG_OFF */
|
||||||
/* Before trying to reorganize the page,
|
/* Before trying to reorganize the page,
|
||||||
store the number of preceding records on the page. */
|
store the number of preceding records on the page. */
|
||||||
ulint ret_pos
|
ret_pos = page_rec_get_n_recs_before(ret);
|
||||||
= page_rec_get_n_recs_before(ret);
|
|
||||||
/* Before copying, "ret" was the predecessor
|
/* Before copying, "ret" was the predecessor
|
||||||
of the predefined supremum record. If it was
|
of the predefined supremum record. If it was
|
||||||
the predefined infimum record, then it would
|
the predefined infimum record, then it would
|
||||||
@ -807,15 +813,10 @@ page_copy_rec_list_start(
|
|||||||
btr_blob_dbg_add(new_page, index,
|
btr_blob_dbg_add(new_page, index,
|
||||||
"copy_start_reorg_fail");
|
"copy_start_reorg_fail");
|
||||||
return(NULL);
|
return(NULL);
|
||||||
} else {
|
|
||||||
/* The page was reorganized:
|
|
||||||
Seek to ret_pos. */
|
|
||||||
ret = new_page + PAGE_NEW_INFIMUM;
|
|
||||||
|
|
||||||
do {
|
|
||||||
ret = rec_get_next_ptr(ret, TRUE);
|
|
||||||
} while (--ret_pos);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The page was reorganized: Seek to ret_pos. */
|
||||||
|
ret = page_rec_get_nth(new_page, ret_pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user