Bug #71761 ANALYZE TABLE should remove its table from background stat processing queue
| Submitted: | 18 Feb 2014 15:03 | Modified: | 1 Feb 2018 10:51 |
|---|---|---|---|
| Reporter: | Laurynas Biveinis (OCA) | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: InnoDB storage engine | Severity: | S5 (Performance) |
| Version: | 5.6.16, 5.7, 8.0 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | analyze, background stats, Contribution, stats | ||
[18 Feb 2014 15:03]
Laurynas Biveinis
[27 Sep 2016 10:04]
Laurynas Biveinis
Bug 71761 fix for 5.6 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug71761-5.6.patch (application/octet-stream, text), 691 bytes.
[27 Sep 2016 10:04]
Laurynas Biveinis
Bug 71761 fix for 5.7 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug71761-5.7.patch (application/octet-stream, text), 691 bytes.
[27 Sep 2016 10:04]
Laurynas Biveinis
Bug 71761 fix for 8.0 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug71761-8.0.patch (application/octet-stream, text), 1.03 KiB.
[27 Sep 2016 10:06]
Laurynas Biveinis
Is there anything blocking the verification of this bug?
[10 Nov 2016 4:55]
MySQL Verification Team
Hello Laurynas, Thank you for the report and contribution. Thanks, Umesh
[14 Nov 2016 7:13]
Vasil Dimov
This came into my radar now. Yes, it is obvious that a manual ANALYZE TABLE should cancel any pending automatic ANALYZEs that were scheduled automatically. I should have done this in the initial implementation. The provided patch looks good. I will see that it gets pushed into the trees soon. Notice that, due to a concurrent DML, a table might get added to the background queue immediately or shortly after we have removed it at the start of a manual ANALYZE TABLE but before the ANALYZE TABLE has completed. This is fine - if the table gets changed beyond the threshold while ANALYZE is running, that warrants a new re-calc. So it is ok to just remove the table from the queue at the beginning of a manual ANALYZE TABLE.
[1 Dec 2016 7:43]
Laurynas Biveinis
The patch crashes on 8.0
main.dd_is_compatibility_ci w1 [ fail ]
...
2016-11-30T22:20:58.729262Z 4 [ERROR] InnoDB: Assertion failure:
dict0stats_bg.cc:186:!srv_read_only_mode
...
5 mysqld-debug 0x000000010a9a1acc ut_dbg_assertion_failed(char const*, char const*, unsigned long) + 220
6 mysqld-debug 0x000000010a61a08d dict_stats_recalc_pool_del(dict_table_t const*) + 77
7 mysqld-debug 0x000000010a6e11a8 ha_innobase::info_low(unsigned int, bool) + 376
8 mysqld-debug 0x000000010a6e2e7b ha_innobase::analyze(THD*, st_ha_check_opt*) + 59
9 mysqld-debug 0x00000001095bea0a handler::ha_analyze(THD*, st_ha_check_opt*) + 154
10 mysqld-debug 0x0000000109e10132 mysql_admin_table(THD*, TABLE_LIST*, st_ha_check_opt*, char const*, thr_lock_type, bool, bool, unsigned int, int (*)(THD*, TABLE_LIST*, st_ha_check_opt*), int (handler::*)(THD*, st_ha_check_opt*), int) + 7618
11 mysqld-debug 0x0000000109e125ea Sql_cmd_analyze_table::execute(THD*) + 410
12 mysqld-debug 0x0000000109ef1aea mysql_execute_command(THD*, bool) + 33674
13 mysqld-debug 0x0000000109ee7d0d mysql_parse(THD*, Parser_state*) + 1661
14 mysqld-debug 0x0000000109ee49e6 dispatch_command(THD*, COM_DATA const*, enum_server_command) + 4022
15 mysqld-debug 0x0000000109ee6d12 do_command(THD*) + 1234
16 mysqld-debug 0x000000010a35a4c3 handle_connection(void*) + 483
17 mysqld-debug 0x000000010aa56d0c pfs_spawn_thread(void*) + 396
18 libsystem_pthread.dylib 0x00007fff9bc73aab _pthread_body + 180
19 libsystem_pthread.dylib 0x00007fff9bc739f7 _pthread_body + 0
20 libsystem_pthread.dylib 0x00007fff9bc73221 thread_start + 13
The following, on the top of the submitted patch, fixes it. It looks like the bug is present in lower version patches too.
diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc
index 99300c5..c81b5a4 100644
--- a/storage/innobase/handler/ha_innodb.cc
+++ b/storage/innobase/handler/ha_innodb.cc
@@ -14768,9 +14768,13 @@ ha_innobase::info_low(
/* If this table is already queued for
background analyze, remove it from the
queue as we are about to do the same */
- dict_mutex_enter_for_mysql();
- dict_stats_recalc_pool_del(ib_table);
- dict_mutex_exit_for_mysql();
+ if (!srv_read_only_mode) {
+
+ dict_mutex_enter_for_mysql();
+ dict_stats_recalc_pool_del(
+ ib_table);
+ dict_mutex_exit_for_mysql();
+ }
opt = DICT_STATS_RECALC_PERSISTENT;
} else {
[1 Dec 2016 8:18]
Laurynas Biveinis
A testcase for 5.6/5.7 too --source include/have_innodb.inc CREATE TABLE t1 (a INT PRIMARY KEY) ENGINE=InnoDB; INSERT INTO t1 VALUES (1); --source include/restart_readonly_mysqld.inc ANALYZE TABLE t1; --source include/restart_mysqld.inc DROP TABLE t1;
[14 Apr 2017 9:08]
Laurynas Biveinis
Bug 71761 fix for 8.0.1 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug71761-8.0.1.patch (application/octet-stream, text), 2.63 KiB.
[4 Aug 2017 19:30]
Laurynas Biveinis
Bug 71761 fix for 8.0.2 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug71761-8.0.2.patch (application/octet-stream, text), 2.63 KiB.
[1 Feb 2018 10:51]
Laurynas Biveinis
The latest contributed fix applies cleanly and works on 8.0.4 too.
[13 Jun 2018 12:18]
Laurynas Biveinis
Bug 71761 fix for 8.0.11 (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: bug71761-8.0.11.patch (application/octet-stream, text), 2.70 KiB.
[14 Jun 2018 5:10]
MySQL Verification Team
Thank you for the contributions! Regards, Umesh
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.047 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.