List:Commits« Previous MessageNext Message »
From:Konstantin Osipov Date:September 15 2009 7:49pm
Subject:Re: bzr commit into mysql-5.4 branch (jon.hauglid:2804) Bug#42074
View as plain text  
* Jon Olav Hauglid <Jon.Hauglid@stripped> [09/09/10 01:34]:
>  2804 Jon Olav Hauglid	2009-08-31
>       Bug #42074 concurrent optimize table and 
>                  alter table = Assertion failed: thd->is_error()
>       
>       This bug could occur if OPTIMIZE TABLE was started on a InnoDB table
>       and the table was altered to different storage engine after OPTIMIZE
>       had started. This allowed OPTIMIZE to pass the initial checks for 
>       storage engine support, but fail once it reached "recreate+analyze"
>       if this operation was not supported by the new storage engine.
>       
>       If the call to ha_analyze() returned HA_ADMIN_NOT_IMPLEMENTED,
>       this would trigger a code path which included an assert checking
>       for diagnostics area contents. Since this area had not been filled,
>       the assert was triggered.
>       
>       This patch removes the assertion. The diagnostics area is in this case
>       only used to provide more detailed information about why optimize failed.
>       The triggered code path sends this information to the client and clears 
>       the diagnostic area.
>       
>       Test case added to innodb_mysql.test.
> 
>     modified:
>       mysql-test/r/innodb_mysql.result
>       mysql-test/t/innodb_mysql.test
>       sql/sql_table.cc
> === modified file 'mysql-test/r/innodb_mysql.result'
> --- a/mysql-test/r/innodb_mysql.result	2009-07-31 19:46:24 +0000
> +++ b/mysql-test/r/innodb_mysql.result	2009-08-31 12:48:42 +0000
> @@ -2253,4 +2253,28 @@ b
>  1
>  set join_cache_level=default;
>  DROP TABLE t1,t2;
> +#
> +# Bug #42074: concurrent optimize table and 
> +#             alter table = Assertion failed: thd->is_error()
> +#
> +DROP TABLE IF EXISTS t1;
> +# Create InnoDB table
> +CREATE TABLE t1 (id INT) engine=innodb;
>
> +connect(localhost,root,,test,13000,/export/home/z/mysql-next-bugfixing-bug42074/mysql-test/var/tmp/mysqld.1.sock);
> +# Connection 1
> +# Start optimizing table
> +SET DEBUG_SYNC='ha_admin_try_alter SIGNAL optimize_started WAIT_FOR table_altered';
> +OPTIMIZE TABLE t1;
> +# Connection 2
> +# Change table to engine=memory
> +SET DEBUG_SYNC='now WAIT_FOR optimize_started';
> +ALTER TABLE t1 engine=memory;
> +SET DEBUG_SYNC='now SIGNAL table_altered';
> +# Connection 1
> +# Complete optimization
> +Table	Op	Msg_type	Msg_text
> +test.t1	optimize	note	Table does not support optimize, doing recreate + analyze
> instead
> +test.t1	optimize	status	Operation failed
> +DROP TABLE t1;
> +SET DEBUG_SYNC='RESET';
>  End of 6.0 tests
> 
> === modified file 'mysql-test/t/innodb_mysql.test'
> --- a/mysql-test/t/innodb_mysql.test	2009-07-28 12:56:22 +0000
> +++ b/mysql-test/t/innodb_mysql.test	2009-08-31 12:48:42 +0000
> @@ -13,6 +13,7 @@ let $test_foreign_keys= 1;
>  set global innodb_support_xa=default;
>  set session innodb_support_xa=default;
>  --source include/mix1.inc
> +--source include/have_debug_sync.inc

Please move the test case out to innodb_sync.test (new test) or
add to mdl_sync.test.

> === modified file 'sql/sql_table.cc'
> --- a/sql/sql_table.cc	2009-08-25 07:22:47 +0000
> +++ b/sql/sql_table.cc	2009-08-31 12:48:42 +0000
> @@ -4807,6 +4807,7 @@ send_result_message:
>        close_thread_tables(thd);
>        if (!thd->locked_tables_mode)
>          thd->mdl_context.release_all_locks();
> +      DEBUG_SYNC(thd, "ha_admin_try_alter");
>        protocol->store(STRING_WITH_LEN("note"), system_charset_info);
>        protocol->store(STRING_WITH_LEN(
>            "Table does not support optimize, doing recreate + analyze instead"),
> @@ -4847,7 +4848,6 @@ send_result_message:
>        protocol->store(operator_name, system_charset_info);
>        if (result_code) // either mysql_recreate_table or analyze failed
>        {
> -        DBUG_ASSERT(thd->is_error());

Please keep this assert. If ha_analyze() failed, call
handler::print_error().

The patch is OK to push after fixing the above.

>          if (thd->is_error())
>          {
>            const char *err_msg= thd->stmt_da->message();
> 

-- 
Thread
bzr commit into mysql-5.4 branch (jon.hauglid:2804) Bug#42074Jon Olav Hauglid31 Aug
  • Re: bzr commit into mysql-5.4 branch (jon.hauglid:2804) Bug#42074Konstantin Osipov15 Sep