Skip to content

Commit e9c10f9

Browse files
author
Jan Lindström
committed
MDEV-7908: assertion in innobase_release_savepoint
Problem was that in XA prepared state we should still be able to release a savepoint, but assertions were too strict.
1 parent b53bcd4 commit e9c10f9

File tree

6 files changed

+44
-4
lines changed

6 files changed

+44
-4
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
xa rollback 'xid2';
2+
ERROR XAE04: XAER_NOTA: Unknown XID
3+
drop table if exists t1;
4+
Warnings:
5+
Note 1051 Unknown table 'test.t1'
6+
create table t1(a int)engine=innodb;
7+
rollback;
8+
xa start 'xid2';
9+
insert into `t1` values (1);
10+
savepoint `sv1`;
11+
xa end 'xid2';
12+
start transaction;
13+
ERROR XAE07: XAER_RMFAIL: The command cannot be executed when global transaction is in the IDLE state
14+
xa prepare 'xid2';
15+
release savepoint `sv1`;
16+
xa commit 'xid2';
17+
drop table t1;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--source include/have_innodb.inc
2+
3+
--disable_abort_on_error
4+
xa rollback 'xid2';
5+
drop table if exists t1;
6+
create table t1(a int)engine=innodb;
7+
rollback;
8+
xa start 'xid2';
9+
insert into `t1` values (1);
10+
savepoint `sv1`;
11+
xa end 'xid2';
12+
start transaction;
13+
xa prepare 'xid2';
14+
release savepoint `sv1`;
15+
xa commit 'xid2';
16+
drop table t1;
17+

storage/innobase/handler/ha_innodb.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4116,7 +4116,10 @@ innobase_release_savepoint(
41164116
DBUG_ASSERT(hton == innodb_hton_ptr);
41174117

41184118
trx = check_trx_exists(thd);
4119-
trx_start_if_not_started(trx);
4119+
4120+
if (trx->state == TRX_STATE_NOT_STARTED) {
4121+
trx_start_if_not_started(trx);
4122+
}
41204123

41214124
/* TODO: use provided savepoint data area to store savepoint data */
41224125

storage/innobase/trx/trx0roll.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ trx_release_savepoint_for_mysql(
495495
{
496496
trx_named_savept_t* savep;
497497

498-
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE));
498+
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE) || trx_state_eq(trx, TRX_STATE_PREPARED));
499499
ut_ad(trx->in_mysql_trx_list);
500500

501501
savep = trx_savepoint_find(trx, savepoint_name);

storage/xtradb/handler/ha_innodb.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4679,7 +4679,10 @@ innobase_release_savepoint(
46794679
DBUG_ASSERT(hton == innodb_hton_ptr);
46804680

46814681
trx = check_trx_exists(thd);
4682-
trx_start_if_not_started(trx);
4682+
4683+
if (trx->state == TRX_STATE_NOT_STARTED) {
4684+
trx_start_if_not_started(trx);
4685+
}
46834686

46844687
/* TODO: use provided savepoint data area to store savepoint data */
46854688

storage/xtradb/trx/trx0roll.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ trx_release_savepoint_for_mysql(
492492
{
493493
trx_named_savept_t* savep;
494494

495-
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE));
495+
ut_ad(trx_state_eq(trx, TRX_STATE_ACTIVE) || trx_state_eq(trx, TRX_STATE_PREPARED));
496496
ut_ad(trx->in_mysql_trx_list);
497497

498498
savep = trx_savepoint_find(trx, savepoint_name);

0 commit comments

Comments
 (0)