diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2022-04-26 18:09:14 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2022-04-26 18:09:14 +0300 |
commit | 2c005261cb7ee12e4da63d7769ba1ebe8f8cdc9f (patch) | |
tree | a2a87fd3d2fca96a9f4e13cc3cb30c189d3d4666 | |
parent | 2ca112346438611ab7800b70bea6af1fd1169308 (diff) | |
download | mariadb-git-2c005261cb7ee12e4da63d7769ba1ebe8f8cdc9f.tar.gz |
MDEV-26753 Assertion state == TRX_STATE_PREPARED ||... failed
dict_stats_save(): Do not attempt to commit an already committed
transaction.
-rw-r--r-- | mysql-test/suite/innodb/r/stat_tables.result | 14 | ||||
-rw-r--r-- | mysql-test/suite/innodb/t/stat_tables.test | 14 | ||||
-rw-r--r-- | storage/innobase/dict/dict0stats.cc | 6 |
3 files changed, 32 insertions, 2 deletions
diff --git a/mysql-test/suite/innodb/r/stat_tables.result b/mysql-test/suite/innodb/r/stat_tables.result index bb449570479..c1ce6fc8fce 100644 --- a/mysql-test/suite/innodb/r/stat_tables.result +++ b/mysql-test/suite/innodb/r/stat_tables.result @@ -13,3 +13,17 @@ a drop table t1; rename table mysql.table_stats_save to mysql.table_stats; flush tables; +# +# MDEV-26753 Assertion state == TRX_STATE_PREPARED ||... failed +# +CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB; +XA START 'test'; +SELECT COUNT(*)>0 FROM mysql.innodb_index_stats LOCK IN SHARE MODE; +COUNT(*)>0 +1 +INSERT INTO t1 VALUES (1),(2); +UPDATE mysql.innodb_table_stats SET last_update=NULL WHERE table_name='t1'; +XA END 'test'; +XA ROLLBACK 'test'; +DROP TABLE t1; +# End of 10.6 tests diff --git a/mysql-test/suite/innodb/t/stat_tables.test b/mysql-test/suite/innodb/t/stat_tables.test index 68344b3f425..dd18c265e99 100644 --- a/mysql-test/suite/innodb/t/stat_tables.test +++ b/mysql-test/suite/innodb/t/stat_tables.test @@ -15,3 +15,17 @@ select * from t1; drop table t1; rename table mysql.table_stats_save to mysql.table_stats; flush tables; + +--echo # +--echo # MDEV-26753 Assertion state == TRX_STATE_PREPARED ||... failed +--echo # +CREATE TABLE t1(a INT PRIMARY KEY) ENGINE=InnoDB; +XA START 'test'; +SELECT COUNT(*)>0 FROM mysql.innodb_index_stats LOCK IN SHARE MODE; +INSERT INTO t1 VALUES (1),(2); +UPDATE mysql.innodb_table_stats SET last_update=NULL WHERE table_name='t1'; +XA END 'test'; +XA ROLLBACK 'test'; +DROP TABLE t1; + +--echo # End of 10.6 tests diff --git a/storage/innobase/dict/dict0stats.cc b/storage/innobase/dict/dict0stats.cc index 570903d4327..00a83ded00c 100644 --- a/storage/innobase/dict/dict0stats.cc +++ b/storage/innobase/dict/dict0stats.cc @@ -1,7 +1,7 @@ /***************************************************************************** Copyright (c) 2009, 2019, Oracle and/or its affiliates. All Rights Reserved. -Copyright (c) 2015, 2021, MariaDB Corporation. +Copyright (c) 2015, 2022, 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 @@ -3115,7 +3115,9 @@ release_and_exit: ret = lock_table_for_trx(index_stats, trx, LOCK_X); } if (ret != DB_SUCCESS) { - trx->commit(); + if (trx->state != TRX_STATE_NOT_STARTED) { + trx->commit(); + } goto unlocked_free_and_exit; } |