summaryrefslogtreecommitdiff
path: root/storage/innobase/row/row0purge.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/row/row0purge.cc')
-rw-r--r--storage/innobase/row/row0purge.cc42
1 files changed, 26 insertions, 16 deletions
diff --git a/storage/innobase/row/row0purge.cc b/storage/innobase/row/row0purge.cc
index f4fd617f154..8f9756bdc53 100644
--- a/storage/innobase/row/row0purge.cc
+++ b/storage/innobase/row/row0purge.cc
@@ -284,6 +284,7 @@ row_purge_poss_sec(
purge_node_t* node,
dict_index_t* index,
const dtuple_t* entry,
+ dberr_t& err,
btr_pcur_t* sec_pcur,
mtr_t* sec_mtr,
bool is_tree)
@@ -318,7 +319,10 @@ retry_purge_sec:
btr_pcur_get_rec(&node->pcur),
&mtr, index, entry,
node->roll_ptr, node->trx_id,
- &node->vcol_info);
+ err, &node->vcol_info);
+ if (err) {
+ return false;
+ }
if (node->vcol_info.is_first_fetch()) {
ut_ad(store_cur);
@@ -375,11 +379,11 @@ row_purge_remove_sec_if_poss_tree(
/*==============================*/
purge_node_t* node, /*!< in: row purge node */
dict_index_t* index, /*!< in: index */
- const dtuple_t* entry) /*!< in: index entry */
+ const dtuple_t* entry, /*!< in: index entry */
+ dberr_t& err)
{
btr_pcur_t pcur;
ibool success = TRUE;
- dberr_t err;
mtr_t mtr;
enum row_search_result search_result;
@@ -442,7 +446,7 @@ row_purge_remove_sec_if_poss_tree(
which cannot be purged yet, requires its existence. If some requires,
we should do nothing. */
- if (row_purge_poss_sec(node, index, entry, &pcur, &mtr, true)) {
+ if (row_purge_poss_sec(node, index, entry, err, &pcur, &mtr, true)) {
/* Remove the index record, which should have been
marked for deletion. */
@@ -476,6 +480,8 @@ row_purge_remove_sec_if_poss_tree(
default:
ut_error;
}
+ } else {
+ success = false;
}
if (node->vcol_op_failed()) {
@@ -510,6 +516,7 @@ row_purge_remove_sec_if_poss_leaf(
btr_pcur_t pcur;
enum btr_latch_mode mode;
enum row_search_result search_result;
+ dberr_t err = DB_SUCCESS;
bool success = true;
log_free_check();
@@ -576,7 +583,7 @@ row_purge_remove_sec_if_poss_leaf(
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, &pcur, &mtr, false)) {
+ if (row_purge_poss_sec(node, index, entry, err, &pcur, &mtr, false)) {
btr_cur_t* btr_cur = btr_pcur_get_btr_cur(&pcur);
/* Only delete-marked records should be purged. */
@@ -643,7 +650,7 @@ row_purge_remove_sec_if_poss_leaf(
}
}
- if (node->vcol_op_failed()) {
+ if (err || node->vcol_op_failed()) {
btr_pcur_close(&pcur);
return false;
}
@@ -670,7 +677,7 @@ func_exit_no_pcur:
/***********************************************************//**
Removes a secondary index entry if possible. */
UNIV_INLINE MY_ATTRIBUTE((nonnull(1,2)))
-void
+dberr_t
row_purge_remove_sec_if_poss(
/*=========================*/
purge_node_t* node, /*!< in: row purge node */
@@ -678,6 +685,7 @@ row_purge_remove_sec_if_poss(
const dtuple_t* entry) /*!< in: index entry */
{
ibool success;
+ dberr_t err = DB_SUCCESS;
ulint n_tries = 0;
/* fputs("Purge: Removing secondary record\n", stderr); */
@@ -686,19 +694,19 @@ row_purge_remove_sec_if_poss(
/* The node->row must have lacked some fields of this
index. This is possible when the undo log record was
written before this index was created. */
- return;
+ return err;
}
if (row_purge_remove_sec_if_poss_leaf(node, index, entry)) {
- return;
+ return err;
}
retry:
if (node->vcol_op_failed()) {
- return;
+ return err;
}
- success = row_purge_remove_sec_if_poss_tree(node, index, entry);
+ success = row_purge_remove_sec_if_poss_tree(node, index, entry, err);
/* The delete operation may fail if we have little
file space left: TODO: easiest to crash the database
and restart with more file space */
@@ -712,7 +720,8 @@ retry:
goto retry;
}
- ut_a(success);
+ ut_a(success || err);
+ return err;
}
/** Skip uncommitted virtual indexes on newly added virtual column.
@@ -763,9 +772,10 @@ row_purge_del_mark(
dtuple_t* entry = row_build_index_entry_low(
node->row, NULL, node->index,
heap, ROW_BUILD_FOR_PURGE);
- row_purge_remove_sec_if_poss(node, node->index, entry);
- if (node->vcol_op_failed()) {
+
+ if (row_purge_remove_sec_if_poss(node, node->index, entry)
+ || node->vcol_op_failed()) {
mem_heap_free(heap);
return false;
}
@@ -823,9 +833,9 @@ row_purge_upd_exist_or_extern_func(
dtuple_t* entry = row_build_index_entry_low(
node->row, NULL, node->index,
heap, ROW_BUILD_FOR_PURGE);
- row_purge_remove_sec_if_poss(node, node->index, entry);
- if (node->vcol_op_failed()) {
+ if (row_purge_remove_sec_if_poss(node, node->index, entry)
+ || node->vcol_op_failed()) {
ut_ad(!node->table);
mem_heap_free(heap);
return;