Skip to content

Commit

Permalink
MDEV-25125 Assertion failure in fetch_data_into_cache_low()
Browse files Browse the repository at this point in the history
Before MDEV-14638, there was no race condition between the
execution of fetch_data_into_cache() and transaction commit.

fetch_data_into_cache(): Acquire trx_t::mutex before checking
trx_t::state, to prevent a concurrent transition from
TRX_STATE_COMMITTED_IN_MEMORY to TRX_STATE_NOT_STARTED
in trx_commit_in_memory().
  • Loading branch information
dr-m committed Mar 18, 2021
1 parent 19052b6 commit 867724f
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions storage/innobase/trx/trx0i_s.cc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 2007, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, 2019, MariaDB Corporation.
Copyright (c) 2017, 2021, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Expand Down Expand Up @@ -1262,13 +1262,16 @@ static void fetch_data_into_cache(trx_i_s_cache_t *cache)

/* Capture the state of transactions */
mutex_enter(&trx_sys.mutex);
for (const trx_t *trx= UT_LIST_GET_FIRST(trx_sys.trx_list);
for (trx_t *trx= UT_LIST_GET_FIRST(trx_sys.trx_list);
trx != NULL;
trx= UT_LIST_GET_NEXT(trx_list, trx))
{
if (trx_is_started(trx) && trx != purge_sys.query->trx)
if (trx->state != TRX_STATE_NOT_STARTED && trx != purge_sys.query->trx)
{
fetch_data_into_cache_low(cache, trx);
mutex_enter(&trx->mutex);
if (trx->state != TRX_STATE_NOT_STARTED)
fetch_data_into_cache_low(cache, trx);
mutex_exit(&trx->mutex);
if (cache->is_truncated)
break;
}
Expand Down

0 comments on commit 867724f

Please sign in to comment.