Bug #46646 Assertion `! is_set()' in Diagnostics_area::set_ok_status() on Innodb + UPDATE
Submitted: 11 Aug 2009 10:16 Modified: 15 May 2010 9:05
Reporter: Philip Stoev Email Updates:
Status: Can't repeat Impact on me:
None 
Category:MySQL Server Severity:S2 (Serious)
Version:5.4 OS:Any
Assigned to: Philip Stoev CPU Architecture:Any
Tags: innodb, InnoDB plugin, innodb_plugin, regression

[11 Aug 2009 10:16] Philip Stoev
Description:
When executing a concurrent transactional Innodb workload that contains a subquery in an UPDATE, against mysql-trunk, which contains the innodb plugin as a built-in default Innodb, mysqld asserted as follows:

mysqld: sql_class.cc:437: void Diagnostics_area::set_ok_status(THD*, ha_rows, ulonglong, const char*): Assertion `! is_set()' failed.

# 13:11:34 #6  0x000000315a42bec9 in __assert_fail () from /lib64/libc.so.6
# 13:11:34 #7  0x000000000060de24 in Diagnostics_area::set_ok_status (this=0x5ca51f8, thd=0x5ca3bc8, affected_rows_arg=0, last_insert_id_arg=0, message_arg=0x0)
# 13:11:34     at sql_class.cc:437
# 13:11:34 #8  0x000000000053e4ca in my_ok (thd=0x5ca3bc8, affected_rows=0, id=0, message=0x0) at sql_class.h:2298
# 13:11:34 #9  0x00000000006ea254 in mysql_update (thd=0x5ca3bc8, table_list=0x5cb5a00, fields=@0x5ca5b58, values=@0x5ca5f38, conds=0x5cb6f90, order_num=0, order=0x0,
# 13:11:34     limit=5, handle_duplicates=DUP_ERROR, ignore=false, found_return=0x7f1419743108, updated_return=0x7f1419743100) at sql_update.cc:341
# 13:11:34 #10 0x000000000063a4c6 in mysql_execute_command (thd=0x5ca3bc8) at sql_parse.cc:3058
# 13:11:34 #11 0x0000000000640e4c in mysql_parse (thd=0x5ca3bc8,
# 13:11:34     inBuf=0x5cb5878 "UPDATE `C` AS X SET `time_key` = 6 WHERE X . `pk` = ( SELECT `pk` FROM `D` WHERE `pk` = 2 ) LIMIT 5", length=99,
# 13:11:34     found_semicolon=0x7f1419743ee0) at sql_parse.cc:6003
# 13:11:34 #12 0x0000000000641c79 in dispatch_command (command=COM_QUERY, thd=0x5ca3bc8,
# 13:11:34     packet=0x5cad7e9 "UPDATE `C` AS X SET `time_key` = 6 WHERE X . `pk` = ( SELECT `pk` FROM `D` WHERE `pk` = 2 ) LIMIT 5", packet_length=99)
# 13:11:34     at sql_parse.cc:1222
# 13:11:34 #13 0x000000000064305e in do_command (thd=0x5ca3bc8) at sql_parse.cc:855
# 13:11:34 #14 0x000000000062f8bd in handle_one_connection (arg=0x5ca3bc8) at sql_connect.cc:1131
# 13:11:34 #15 0x000000315b0073da in start_thread () from /lib64/libpthread.so.0
# 13:11:34 #16 0x000000315a4e627d in clone () from /lib64/libc.so.6

Previously this assertion was reported against Falcon and Maria, so it may be a storage engine API issue. Bug is not repeatable in 5.1-bugteam.

How to repeat:
RQG grammar:

query:
        transaction |
        UPDATE _table AS X SET _field_no_pk = _digit WHERE X . `pk` = ( SELECT `pk` FROM _table WHERE `pk` = _digit ) LIMIT 5;

transaction:
        START TRANSACTION |
        SELECT SLEEP( 1 );;

Command line:

$ perl runall.pl \
  --engine=Innodb \
  --reporters=Backtrace \
  --mysqld=--loose-innodb-lock-wait-timeout=1 \
  --mysqld=--log-output=none \
  --mysqld=--skip-safemalloc \
  --rows=10000 \
  --threads=16 \
  --duration=600 \
  --basedir=/path/to/mysql/trunk \
  --grammar=/path/to/grammar
[13 Aug 2009 13:33] Guilhem Bichot
Here are all other bug reports (of any status) which are about this group of Diagnostics_area assertions:

| 34417 | Assertion failure in Diagnostics_area::set_error_status()                        |

| 36135 |  void Diagnostics_area::set_eof_status(THD*): Assertion `! is_set()' failed.     |

| 36473 | Assertion "! is_set()" fails in Diagnostics_area::set_ok_status with Falcon      |

| 38994 | Diagnostics_area::set_error_status Assertion `! is_set() || can_overwrite_status |

| 46425 | crash in Diagnostics_area::set_ok_status , empty statement, DELETE IGNORE        |
[18 Aug 2009 10:10] Alexey Botchkov
i wasn't able to reproduce this one with the mysql-trunk
(it was reproducible though with the older mysql-5.1)
[14 Sep 2009 9:33] Guilhem Bichot
Unrelated bug report but could give an idea of possible cause types:
http://bugs.mysql.com/bug.php?id=46958
[15 May 2010 9:05] Philip Stoev
Not seen recently, setting to Can't repeat .