Skip to content

Commit d11001d

Browse files
committed
Backport MDEV-13890 from 10.2 (InnoDB/XtraDB shutdown failure)
If InnoDB or XtraDB recovered committed transactions at server startup, but the processing of recovered transactions was prevented by innodb_read_only or by innodb_force_recovery, an assertion would fail at shutdown. This bug was originally reproduced when Mariabackup executed InnoDB shutdown after preparing (applying redo log into) a backup. trx_free_prepared(): Allow TRX_STATE_COMMITTED_IN_MEMORY. trx_undo_free_prepared(): Allow any undo log state. For transactions that were resurrected in TRX_STATE_COMMITTED_IN_MEMORY the undo log state would have been reset by trx_undo_set_state_at_finish().
1 parent 2b332ab commit d11001d

File tree

4 files changed

+32
-6
lines changed

4 files changed

+32
-6
lines changed

storage/innobase/trx/trx0trx.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,9 @@ trx_free_prepared(
309309
trx_t* trx) /*!< in, own: trx object */
310310
{
311311
ut_a(trx_state_eq(trx, TRX_STATE_PREPARED)
312-
|| (trx_state_eq(trx, TRX_STATE_ACTIVE)
313-
&& trx->is_recovered
312+
|| (trx->is_recovered
313+
&& (trx_state_eq(trx, TRX_STATE_ACTIVE)
314+
|| trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY))
314315
&& (srv_read_only_mode
315316
|| srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO)));
316317
ut_a(trx->magic_n == TRX_MAGIC_N);

storage/innobase/trx/trx0undo.cc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*****************************************************************************
22
33
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
4-
Copyright (c) 2014, 2017, MariaDB Corporation. All Rights Reserved.
4+
Copyright (c) 2014, 2017, MariaDB Corporation.
55
66
This program is free software; you can redistribute it and/or modify it under
77
the terms of the GNU General Public License as published by the Free Software
@@ -2015,6 +2015,12 @@ trx_undo_free_prepared(
20152015
switch (trx->update_undo->state) {
20162016
case TRX_UNDO_PREPARED:
20172017
break;
2018+
case TRX_UNDO_CACHED:
2019+
case TRX_UNDO_TO_FREE:
2020+
case TRX_UNDO_TO_PURGE:
2021+
ut_ad(trx_state_eq(trx,
2022+
TRX_STATE_COMMITTED_IN_MEMORY));
2023+
/* fall through */
20182024
case TRX_UNDO_ACTIVE:
20192025
/* lock_trx_release_locks() assigns
20202026
trx->is_recovered=false */
@@ -2033,6 +2039,12 @@ trx_undo_free_prepared(
20332039
switch (trx->insert_undo->state) {
20342040
case TRX_UNDO_PREPARED:
20352041
break;
2042+
case TRX_UNDO_CACHED:
2043+
case TRX_UNDO_TO_FREE:
2044+
case TRX_UNDO_TO_PURGE:
2045+
ut_ad(trx_state_eq(trx,
2046+
TRX_STATE_COMMITTED_IN_MEMORY));
2047+
/* fall through */
20362048
case TRX_UNDO_ACTIVE:
20372049
/* lock_trx_release_locks() assigns
20382050
trx->is_recovered=false */

storage/xtradb/trx/trx0trx.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -475,8 +475,9 @@ trx_free_prepared(
475475
trx_t* trx) /*!< in, own: trx object */
476476
{
477477
ut_a(trx_state_eq(trx, TRX_STATE_PREPARED)
478-
|| (trx_state_eq(trx, TRX_STATE_ACTIVE)
479-
&& trx->is_recovered
478+
|| (trx->is_recovered
479+
&& (trx_state_eq(trx, TRX_STATE_ACTIVE)
480+
|| trx_state_eq(trx, TRX_STATE_COMMITTED_IN_MEMORY))
480481
&& (srv_read_only_mode
481482
|| srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO)));
482483
ut_a(trx->magic_n == TRX_MAGIC_N);

storage/xtradb/trx/trx0undo.cc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*****************************************************************************
22
33
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
4-
Copyright (c) 2014, 2017, MariaDB Corporation. All Rights Reserved.
4+
Copyright (c) 2014, 2017, MariaDB Corporation.
55
66
This program is free software; you can redistribute it and/or modify it under
77
the terms of the GNU General Public License as published by the Free Software
@@ -2015,6 +2015,12 @@ trx_undo_free_prepared(
20152015
switch (trx->update_undo->state) {
20162016
case TRX_UNDO_PREPARED:
20172017
break;
2018+
case TRX_UNDO_CACHED:
2019+
case TRX_UNDO_TO_FREE:
2020+
case TRX_UNDO_TO_PURGE:
2021+
ut_ad(trx_state_eq(trx,
2022+
TRX_STATE_COMMITTED_IN_MEMORY));
2023+
/* fall through */
20182024
case TRX_UNDO_ACTIVE:
20192025
/* lock_trx_release_locks() assigns
20202026
trx->is_recovered=false */
@@ -2033,6 +2039,12 @@ trx_undo_free_prepared(
20332039
switch (trx->insert_undo->state) {
20342040
case TRX_UNDO_PREPARED:
20352041
break;
2042+
case TRX_UNDO_CACHED:
2043+
case TRX_UNDO_TO_FREE:
2044+
case TRX_UNDO_TO_PURGE:
2045+
ut_ad(trx_state_eq(trx,
2046+
TRX_STATE_COMMITTED_IN_MEMORY));
2047+
/* fall through */
20362048
case TRX_UNDO_ACTIVE:
20372049
/* lock_trx_release_locks() assigns
20382050
trx->is_recovered=false */

0 commit comments

Comments
 (0)