[MDEV-20750] Assertion `thd->transaction.stmt.is_empty() || thd->in_sub_stmt || (thd->state_flags & Open_tables_state::BACKUPS_AVAIL)' fails in open_normal_and_derived_tables upon killing connection running SETVAL Created: 2019-10-04  Updated: 2023-04-27

Status: Open
Project: MariaDB Server
Component/s: Locking, Prepared Statements, Sequences
Affects Version/s: 10.3, 10.4
Fix Version/s: 10.4

Type: Bug Priority: Major
Reporter: Elena Stepanova Assignee: Michael Widenius
Resolution: Unresolved Votes: 0
Labels: affects-tests

Issue Links:
Duplicate
is duplicated by MDEV-16745 [Draft] Assertion `thd->transaction.s... Closed
Relates
relates to MDEV-16929 Assertion `thd->transaction.stmt.is_e... Stalled

 Description   

Note: It is possibly related to MDEV-16929, which is also about the assertion upon killing a sequence operation, but this time the failure happens in a different place with a different stack trace, so I'm filing it separately just in case.

Note: the test case is non-deterministic, run with --repeat=N. It currently always fails for me within ~5 attempts, but it can vary on different machines and builds.

--source include/have_innodb.inc
 
CREATE SEQUENCE s ENGINE=InnoDB;
FLUSH TABLES WITH READ LOCK;
 
--connect (con1,localhost,root,,)
--let $conid= `SELECT CONNECTION_ID()`
--send
  PREPARE stmt FROM 'SELECT SETVAL(s, 0)';
 
--connection default
--eval KILL $conid
UNLOCK TABLES;
DROP SEQUENCE s;

10.3 5b2fa078

mysqld: /data/src/10.3/sql/sql_base.cc:5124: bool open_normal_and_derived_tables(THD*, TABLE_LIST*, uint, uint): Assertion `thd->transaction.stmt.is_empty() || (thd->state_flags & Open_tables_state::BACKUPS_AVAIL)' failed.
191004 15:48:12 [ERROR] mysqld got signal 6 ;
 
#7  0x00007f09e5efbf12 in __GI___assert_fail (assertion=0x55dff4817360 "thd->transaction.stmt.is_empty() || (thd->state_flags & Open_tables_state::BACKUPS_AVAIL)", file=0x55dff4816478 "/data/src/10.3/sql/sql_base.cc", line=5124, function=0x55dff4818dc0 <open_normal_and_derived_tables(THD*, TABLE_LIST*, unsigned int, unsigned int)::__PRETTY_FUNCTION__> "bool open_normal_and_derived_tables(THD*, TABLE_LIST*, uint, uint)") at assert.c:101
#8  0x000055dff3b459b0 in open_normal_and_derived_tables (thd=0x7f098c000b00, tables=0x7f098c01b760, flags=512, dt_phases=35) at /data/src/10.3/sql/sql_base.cc:5123
#9  0x000055dff3bf9cac in mysql_test_select (stmt=0x7f098c013070, tables=0x7f098c01b760) at /data/src/10.3/sql/sql_prepare.cc:1534
#10 0x000055dff3bfb932 in check_prepared_statement (stmt=0x7f098c013070) at /data/src/10.3/sql/sql_prepare.cc:2346
#11 0x000055dff3bffb55 in Prepared_statement::prepare (this=0x7f098c013070, packet=0x7f098c0136e0 "SELECT SETVAL(s, 0)", packet_len=19) at /data/src/10.3/sql/sql_prepare.cc:4028
#12 0x000055dff3bfc80d in mysql_sql_stmt_prepare (thd=0x7f098c000b00) at /data/src/10.3/sql/sql_prepare.cc:2843
#13 0x000055dff3bd541f in mysql_execute_command (thd=0x7f098c000b00) at /data/src/10.3/sql/sql_parse.cc:3827
#14 0x000055dff3be2cc3 in mysql_parse (thd=0x7f098c000b00, rawbuf=0x7f098c013618 "PREPARE stmt FROM 'SELECT SETVAL(s, 0)'", length=39, parser_state=0x7f09e00af5e0, is_com_multi=false, is_next_command=false) at /data/src/10.3/sql/sql_parse.cc:7829
#15 0x000055dff3bcf8fd in dispatch_command (command=COM_QUERY, thd=0x7f098c000b00, packet=0x7f098c008c71 "PREPARE stmt FROM 'SELECT SETVAL(s, 0)'", packet_length=39, is_com_multi=false, is_next_command=false) at /data/src/10.3/sql/sql_parse.cc:1855
#16 0x000055dff3bce245 in do_command (thd=0x7f098c000b00) at /data/src/10.3/sql/sql_parse.cc:1400
#17 0x000055dff3d44c18 in do_handle_one_connection (connect=0x55dff6ecfbd0) at /data/src/10.3/sql/sql_connect.cc:1403
#18 0x000055dff3d4497a in handle_one_connection (arg=0x55dff6ecfbd0) at /data/src/10.3/sql/sql_connect.cc:1308
#19 0x000055dff46ef86e in pfs_spawn_thread (arg=0x55dff6b65e60) at /data/src/10.3/storage/perfschema/pfs.cc:1862
#20 0x00007f09e7a714a4 in start_thread (arg=0x7f09e00b0700) at pthread_create.c:456
#21 0x00007f09e5fb8d0f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:97
 
Query (0x7f098c01b680): SELECT SETVAL(s, 0)
Connection ID (thread ID): 10
Status: KILL_CONNECTION

Alternative test case, with BACKUP stages instead of FTWRL:

--source include/have_innodb.inc
 
CREATE SEQUENCE s ENGINE=InnoDB;
BACKUP STAGE START;
BACKUP STAGE BLOCK_COMMIT;
 
--connect (con1,localhost,root,,)
--let $conid= `SELECT CONNECTION_ID()`
--send
  PREPARE stmt FROM 'SELECT SETVAL(s, 0)';
 
--connection default
--eval KILL $conid
BACKUP STAGE END;
DROP SEQUENCE s;

10.4 eb0a10b0

mysqld: /data/src/10.4/sql/sql_base.cc:5309: bool open_normal_and_derived_tables(THD*, TABLE_LIST*, uint, uint): Assertion `thd->transaction.stmt.is_empty() || (thd->state_flags & Open_tables_state::BACKUPS_AVAIL)' failed.
191004 15:50:13 [ERROR] mysqld got signal 6 ;
 
#7  0x00007f0721584f12 in __GI___assert_fail (assertion=0x5583b2621340 "thd->transaction.stmt.is_empty() || (thd->state_flags & Open_tables_state::BACKUPS_AVAIL)", file=0x5583b2620370 "/data/src/10.4/sql/sql_base.cc", line=5309, function=0x5583b2622ec0 <open_normal_and_derived_tables(THD*, TABLE_LIST*, unsigned int, unsigned int)::__PRETTY_FUNCTION__> "bool open_normal_and_derived_tables(THD*, TABLE_LIST*, uint, uint)") at assert.c:101
#8  0x00005583b18ac33e in open_normal_and_derived_tables (thd=0x7f06cc000b00, tables=0x7f06cc01c6c0, flags=512, dt_phases=35) at /data/src/10.4/sql/sql_base.cc:5308
#9  0x00005583b196fa9e in mysql_test_select (stmt=0x7f06cc01a200, tables=0x7f06cc01c6c0) at /data/src/10.4/sql/sql_prepare.cc:1535
#10 0x00005583b197172f in check_prepared_statement (stmt=0x7f06cc01a200) at /data/src/10.4/sql/sql_prepare.cc:2360
#11 0x00005583b19759f1 in Prepared_statement::prepare (this=0x7f06cc01a200, packet=0x7f06cc011e20 "SELECT SETVAL(s, 0)", packet_len=19) at /data/src/10.4/sql/sql_prepare.cc:4048
#12 0x00005583b1972669 in mysql_sql_stmt_prepare (thd=0x7f06cc000b00) at /data/src/10.4/sql/sql_prepare.cc:2859
#13 0x00005583b1949779 in mysql_execute_command (thd=0x7f06cc000b00) at /data/src/10.4/sql/sql_parse.cc:3905
#14 0x00005583b195817f in mysql_parse (thd=0x7f06cc000b00, rawbuf=0x7f06cc011d68 "PREPARE stmt FROM 'SELECT SETVAL(s, 0)'", length=39, parser_state=0x7f07168e5170, is_com_multi=false, is_next_command=false) at /data/src/10.4/sql/sql_parse.cc:7912
#15 0x00005583b1943412 in dispatch_command (command=COM_QUERY, thd=0x7f06cc000b00, packet=0x7f06cc008331 "PREPARE stmt FROM 'SELECT SETVAL(s, 0)'", packet_length=39, is_com_multi=false, is_next_command=false) at /data/src/10.4/sql/sql_parse.cc:1841
#16 0x00005583b1941a9f in do_command (thd=0x7f06cc000b00) at /data/src/10.4/sql/sql_parse.cc:1359
#17 0x00005583b1ac9153 in do_handle_one_connection (connect=0x5583b5f69250) at /data/src/10.4/sql/sql_connect.cc:1412
#18 0x00005583b1ac8ea2 in handle_one_connection (arg=0x5583b5f69250) at /data/src/10.4/sql/sql_connect.cc:1316
#19 0x00005583b24c816f in pfs_spawn_thread (arg=0x5583b5edbd40) at /data/src/10.4/storage/perfschema/pfs.cc:1862
#20 0x00007f07230fa4a4 in start_thread (arg=0x7f07168e6700) at pthread_create.c:456
#21 0x00007f0721641d0f in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:97

Also reproducible on 10.5.
Couldn't reproduce without PREPARE.
No obvious effect on a non-debug build.


Generated at Thu Feb 08 09:01:53 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.