Skip to content

Commit

Permalink
MDEV-25072: Livelock due to innodb_change_buffering_debug
Browse files Browse the repository at this point in the history
buf_page_get_low(): Do not try to re-evict the page if it is
multiply buffer-fixed.

In commit 7cffb5f (MDEV-23399)
a livelock was introduced. If multiple threads are concurrently
requesting the same secondary index leaf page in buf_page_get_low()
and innodb_change_buffering_debug is set, all threads would try
to evict the page in a busy loop, never succeeding because the
block is buffer-fixed by other threads.

Thanks to Roel Van de Paar for reporting the original failure and
Elena Stepanova for producing an "rr replay" trace.
  • Loading branch information
dr-m committed Mar 31, 2021
1 parent 5eae8c2 commit 147a317
Showing 1 changed file with 2 additions and 1 deletion.
3 changes: 2 additions & 1 deletion storage/innobase/buf/buf0buf.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3324,7 +3324,8 @@ buf_page_get_low(
buf_flush_lists(ULINT_UNDEFINED, LSN_MAX);
buf_flush_wait_batch_end_acquiring_mutex(false);

if (!fix_block->page.oldest_modification()) {
if (fix_block->page.buf_fix_count() == 1
&& !fix_block->page.oldest_modification()) {
goto re_evict;
}

Expand Down

1 comment on commit 147a317

@mariadb-RoelVandePaar
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you Marko for the fix!

Please sign in to comment.