Commit 867724fd authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-25125 Assertion failure in fetch_data_into_cache_low()

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().
parent 19052b6d
/*****************************************************************************
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
......@@ -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)
{
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;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment