Skip to content

Commit

Permalink
MDEV-27234 fixup with MDEV-27557
Browse files Browse the repository at this point in the history
Whenever we retrieve an older version for READ COMMITTED,
it is better to release the undo page latches
so that we can freely move to the next clustered index record
without potentially violating any latching order.
  • Loading branch information
dr-m committed Mar 29, 2022
1 parent b242c31 commit 792972a
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions storage/innobase/dict/dict0load.cc
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,7 @@ dict_sys_tables_rec_read(
ut_ad(len == 6 || len == UNIV_SQL_NULL);
trx_id_t id = len == 6 ? trx_read_trx_id(field) : 0;
if (id && trx_sys.find(nullptr, id, false)) {
const auto savepoint = mtr->get_savepoint();
heap = mem_heap_create(1024);
dict_index_t* index = UT_LIST_GET_FIRST(
dict_sys.sys_tables->indexes);
Expand All @@ -677,6 +678,7 @@ dict_sys_tables_rec_read(
row_vers_build_for_semi_consistent_read(
nullptr, rec, mtr, index, &offsets, &heap,
heap, &old_vers, nullptr);
mtr->rollback_to_savepoint(savepoint);
rec = old_vers;
if (!rec) {
mem_heap_free(heap);
Expand Down Expand Up @@ -1074,6 +1076,7 @@ dict_load_column_low(
const trx_id_t trx_id = trx_read_trx_id(field);

if (trx_id && mtr && trx_sys.find(nullptr, trx_id, false)) {
const auto savepoint = mtr->get_savepoint();
dict_index_t* index = UT_LIST_GET_FIRST(
dict_sys.sys_columns->indexes);
rec_offs* offsets = rec_get_offsets(
Expand All @@ -1082,6 +1085,7 @@ dict_load_column_low(
row_vers_build_for_semi_consistent_read(
nullptr, rec, mtr, index, &offsets, &heap,
heap, &old_vers, nullptr);
mtr->rollback_to_savepoint(savepoint);
rec = old_vers;
if (!old_vers) {
return dict_load_column_none;
Expand Down Expand Up @@ -1618,6 +1622,7 @@ dict_load_field_low(
if (!trx_id) {
ut_ad(!rec_get_deleted_flag(rec, 0));
} else if (mtr && trx_sys.find(nullptr, trx_id, false)) {
const auto savepoint = mtr->get_savepoint();
dict_index_t* sys_field = UT_LIST_GET_FIRST(
dict_sys.sys_fields->indexes);
rec_offs* offsets = rec_get_offsets(
Expand All @@ -1626,6 +1631,7 @@ dict_load_field_low(
row_vers_build_for_semi_consistent_read(
nullptr, rec, mtr, sys_field, &offsets, &heap,
heap, &old_vers, nullptr);
mtr->rollback_to_savepoint(savepoint);
rec = old_vers;
if (!old_vers || rec_get_deleted_flag(rec, 0)) {
return dict_load_field_none;
Expand Down Expand Up @@ -1828,6 +1834,7 @@ dict_load_index_low(
ut_ad(!rec_get_deleted_flag(rec, 0));
} else if (!mtr) {
} else if (trx_sys.find(nullptr, trx_id, false)) {
const auto savepoint = mtr->get_savepoint();
dict_index_t* sys_index = UT_LIST_GET_FIRST(
dict_sys.sys_indexes->indexes);
rec_offs* offsets = rec_get_offsets(
Expand All @@ -1836,6 +1843,7 @@ dict_load_index_low(
row_vers_build_for_semi_consistent_read(
nullptr, rec, mtr, sys_index, &offsets, &heap,
heap, &old_vers, nullptr);
mtr->rollback_to_savepoint(savepoint);
rec = old_vers;
if (!old_vers || rec_get_deleted_flag(rec, 0)) {
return dict_load_index_none;
Expand Down Expand Up @@ -2700,13 +2708,15 @@ static void dict_load_foreign_cols(dict_foreign_t *foreign, trx_id_t trx_id)
const trx_id_t id = trx_read_trx_id(field);
if (!id) {
} else if (id != trx_id && trx_sys.find(nullptr, id, false)) {
const auto savepoint = mtr.get_savepoint();
rec_offs* offsets = rec_get_offsets(
rec, sys_index, nullptr, true, ULINT_UNDEFINED,
&heap);
const rec_t* old_vers;
row_vers_build_for_semi_consistent_read(
nullptr, rec, &mtr, sys_index, &offsets, &heap,
heap, &old_vers, nullptr);
mtr.rollback_to_savepoint(savepoint);
rec = old_vers;
if (!rec || rec_get_deleted_flag(rec, 0)) {
goto next;
Expand Down Expand Up @@ -2874,12 +2884,14 @@ dict_load_foreign(
const trx_id_t tid = trx_read_trx_id(field);

if (tid && tid != trx_id && trx_sys.find(nullptr, tid, false)) {
const auto savepoint = mtr.get_savepoint();
rec_offs* offsets = rec_get_offsets(
rec, sys_index, nullptr, true, ULINT_UNDEFINED, &heap);
const rec_t* old_vers;
row_vers_build_for_semi_consistent_read(
nullptr, rec, &mtr, sys_index, &offsets, &heap,
heap, &old_vers, nullptr);
mtr.rollback_to_savepoint(savepoint);
rec = old_vers;
if (!rec) {
goto not_found;
Expand Down

0 comments on commit 792972a

Please sign in to comment.