Skip to content

Commit 46305b0

Browse files
committed
Merge 10.0 into 10.1
2 parents b93a87f + b1977a3 commit 46305b0

File tree

10 files changed

+345
-158
lines changed

10 files changed

+345
-158
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#
2+
# MDEV-13797 InnoDB may hang if shutdown is initiated soon after startup
3+
# while rolling back recovered incomplete transactions
4+
#
5+
CREATE TABLE t (a INT) ENGINE=InnoDB;
6+
BEGIN;
7+
COMMIT;
8+
CREATE TABLE t8 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
9+
BEGIN;
10+
INSERT INTO t8 (a) SELECT NULL FROM t;
11+
UPDATE t8 SET a=a+100, b=a;
12+
DELETE FROM t8;
13+
CREATE TABLE t7 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
14+
BEGIN;
15+
INSERT INTO t7 (a) SELECT NULL FROM t;
16+
UPDATE t7 SET a=a+100, b=a;
17+
DELETE FROM t7;
18+
CREATE TABLE t6 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
19+
BEGIN;
20+
INSERT INTO t6 (a) SELECT NULL FROM t;
21+
UPDATE t6 SET a=a+100, b=a;
22+
DELETE FROM t6;
23+
CREATE TABLE t5 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
24+
BEGIN;
25+
INSERT INTO t5 (a) SELECT NULL FROM t;
26+
UPDATE t5 SET a=a+100, b=a;
27+
DELETE FROM t5;
28+
CREATE TABLE t4 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
29+
BEGIN;
30+
INSERT INTO t4 (a) SELECT NULL FROM t;
31+
UPDATE t4 SET a=a+100, b=a;
32+
DELETE FROM t4;
33+
CREATE TABLE t3 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
34+
BEGIN;
35+
INSERT INTO t3 (a) SELECT NULL FROM t;
36+
UPDATE t3 SET a=a+100, b=a;
37+
DELETE FROM t3;
38+
CREATE TABLE t2 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
39+
BEGIN;
40+
INSERT INTO t2 (a) SELECT NULL FROM t;
41+
UPDATE t2 SET a=a+100, b=a;
42+
DELETE FROM t2;
43+
CREATE TABLE t1 (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
44+
BEGIN;
45+
INSERT INTO t1 (a) SELECT NULL FROM t;
46+
UPDATE t1 SET a=a+100, b=a;
47+
DELETE FROM t1;
48+
INSERT INTO t1(a) SELECT NULL FROM t;
49+
INSERT INTO t1(a) SELECT NULL FROM t1;
50+
INSERT INTO t1(a) SELECT NULL FROM t1;
51+
INSERT INTO t1(a) SELECT NULL FROM t1;
52+
INSERT INTO t1(a) SELECT NULL FROM t1;
53+
SET GLOBAL innodb_flush_log_at_trx_commit=1;
54+
CREATE TABLE u(a SERIAL) ENGINE=INNODB;
55+
# Kill and restart
56+
DROP TABLE t,u;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
--source include/have_innodb.inc
2+
--source include/not_embedded.inc
3+
4+
--echo #
5+
--echo # MDEV-13797 InnoDB may hang if shutdown is initiated soon after startup
6+
--echo # while rolling back recovered incomplete transactions
7+
--echo #
8+
9+
CREATE TABLE t (a INT) ENGINE=InnoDB;
10+
let $size = 100;
11+
let $trx = 8;
12+
let $c = $size;
13+
BEGIN;
14+
--disable_query_log
15+
while ($c) {
16+
INSERT INTO t VALUES();
17+
dec $c;
18+
}
19+
--enable_query_log
20+
COMMIT;
21+
22+
let $c = $trx;
23+
while ($c)
24+
{
25+
connect (con$c,localhost,root,,);
26+
eval CREATE TABLE t$c (a SERIAL, b INT UNIQUE, c INT UNIQUE) ENGINE=InnoDB;
27+
BEGIN;
28+
eval INSERT INTO t$c (a) SELECT NULL FROM t;
29+
eval UPDATE t$c SET a=a+$size, b=a;
30+
eval DELETE FROM t$c;
31+
dec $c;
32+
}
33+
34+
INSERT INTO t1(a) SELECT NULL FROM t;
35+
INSERT INTO t1(a) SELECT NULL FROM t1;
36+
INSERT INTO t1(a) SELECT NULL FROM t1;
37+
INSERT INTO t1(a) SELECT NULL FROM t1;
38+
INSERT INTO t1(a) SELECT NULL FROM t1;
39+
40+
--connection default
41+
SET GLOBAL innodb_flush_log_at_trx_commit=1;
42+
CREATE TABLE u(a SERIAL) ENGINE=INNODB;
43+
44+
--source include/kill_and_restart_mysqld.inc
45+
--source include/restart_mysqld.inc
46+
47+
--disable_query_log
48+
let $c = $trx;
49+
while ($c)
50+
{
51+
disconnect con$c;
52+
eval DROP TABLE t$c;
53+
dec $c;
54+
}
55+
--enable_query_log
56+
57+
DROP TABLE t,u;

storage/innobase/include/trx0roll.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*****************************************************************************
22
33
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
4+
Copyright (c) 2017, MariaDB Corporation.
45
56
This program is free software; you can redistribute it and/or modify it under
67
the terms of the GNU General Public License as published by the Free Software
@@ -32,7 +33,8 @@ Created 3/26/1996 Heikki Tuuri
3233
#include "mtr0mtr.h"
3334
#include "trx0sys.h"
3435

35-
extern booltrx_rollback_or_clean_is_active;
36+
extern booltrx_rollback_or_clean_is_active;
37+
extern const trx_t*trx_roll_crash_recv_trx;
3638

3739
/*******************************************************************//**
3840
Determines if this transaction is rolling back an incomplete transaction
@@ -103,6 +105,11 @@ trx_undo_rec_release(
103105
/*=================*/
104106
trx_t*trx,/*!< in/out: transaction */
105107
undo_no_tundo_no);/*!< in: undo number */
108+
/** Report progress when rolling back a row of a recovered transaction.
109+
@return whether the rollback should be aborted due to pending shutdown */
110+
UNIV_INTERN
111+
bool
112+
trx_roll_must_shutdown();
106113
/*******************************************************************//**
107114
Rollback or clean up any incomplete transactions which were
108115
encountered in crash recovery. If the transaction already was

storage/innobase/row/row0undo.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*****************************************************************************
22
33
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
4+
Copyright (c) 2017, MariaDB Corporation.
45
56
This program is free software; you can redistribute it and/or modify it under
67
the terms of the GNU General Public License as published by the Free Software
@@ -348,6 +349,13 @@ row_undo_step(
348349

349350
ut_ad(que_node_get_type(node) == QUE_NODE_UNDO);
350351

352+
if (UNIV_UNLIKELY(trx == trx_roll_crash_recv_trx)
353+
&& trx_roll_must_shutdown()) {
354+
/* Shutdown has been initiated. */
355+
trx->error_state = DB_INTERRUPTED;
356+
return(NULL);
357+
}
358+
351359
err = row_undo(node, thr);
352360

353361
trx->error_state = err;

0 commit comments

Comments
 (0)