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) 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 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 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) ...@@ -1262,13 +1262,16 @@ static void fetch_data_into_cache(trx_i_s_cache_t *cache)
/* Capture the state of transactions */ /* Capture the state of transactions */
mutex_enter(&trx_sys.mutex); 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 != NULL;
trx= UT_LIST_GET_NEXT(trx_list, trx)) 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); fetch_data_into_cache_low(cache, trx);
mutex_exit(&trx->mutex);
if (cache->is_truncated) if (cache->is_truncated)
break; 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