mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-19117 Don't keep binary log index file locked during show binary logs
On some systems with 10,000+ binlogs, show binary logs could block log rotation for more than 10 seconds. This patch fixes this by first caching all binary log names and releases all mutexes while calculating the sizes of the binary logs. Other things: - Ensure that reinit_io_cache() sets end_of_file when moving to read_cache. This ensures that external changes of the underlying file is known to the cache. - get_binlog_list() is made more efficent and show_binlogs() is changed to call get_binlog_list() Reviewed by Andrei Elkin
This commit is contained in:
102
mysql-test/suite/binlog/t/binlog_rotate_perf.test
Normal file
102
mysql-test/suite/binlog/t/binlog_rotate_perf.test
Normal file
@@ -0,0 +1,102 @@
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# functional test for open_binlog call using when
|
||||
#
|
||||
# flush log reset master/slave called
|
||||
#
|
||||
# ==== Related ====
|
||||
#
|
||||
# TXSQL feature 67 binlog rotate perf optimization
|
||||
|
||||
let $engine= myisam;
|
||||
|
||||
--source include/have_binlog_format_row.inc
|
||||
--connect(conn1,localhost,root,,test)
|
||||
|
||||
reset master;
|
||||
create database test_rotate_db;
|
||||
use test_rotate_db;
|
||||
--echo #currrent engine=$engine
|
||||
# Create a new table
|
||||
--replace_column 2 #
|
||||
show binary logs;
|
||||
--eval CREATE TABLE t1_$engine (c1 INT) ENGINE=$engine
|
||||
--eval insert into t1_$engine values(0),(1)
|
||||
|
||||
# do batch flush and show
|
||||
let $loop_times= 100;
|
||||
--source include/show_master_status.inc
|
||||
while ($loop_times) {
|
||||
flush logs;
|
||||
flush logs;
|
||||
if ($loop_times < 5)
|
||||
{
|
||||
--source include/show_master_status.inc
|
||||
if ($loop_times == 4)
|
||||
{
|
||||
--source include/show_binary_logs.inc
|
||||
}
|
||||
reset master;
|
||||
}
|
||||
if ($loop_times >= 5)
|
||||
{
|
||||
flush logs;
|
||||
}
|
||||
|
||||
#
|
||||
dec $loop_times;
|
||||
--echo # left times= $loop_times
|
||||
}
|
||||
--echo # [engine=$engine] after first loop_times=$loop_times, show master logs results
|
||||
--source include/show_binary_logs.inc
|
||||
|
||||
# do batch flush and show with restart mysql
|
||||
--source include/show_master_status.inc
|
||||
let $loop_times= 10;
|
||||
while ($loop_times) {
|
||||
flush logs;
|
||||
flush logs;
|
||||
--echo #begin to restart mysqld current loop_times=$loop_times
|
||||
--source include/restart_mysqld.inc
|
||||
#
|
||||
dec $loop_times;
|
||||
--echo # left restart times= $loop_times
|
||||
}
|
||||
--echo # [engine=$engine] after second loop_times=$loop_times, show master logs results
|
||||
--source include/show_binary_logs.inc
|
||||
|
||||
|
||||
# try to change the log-bin configs and restart
|
||||
--echo # ======= now try to change the log-bin config for mysqld =======
|
||||
--let $restart_parameters="--log-bin=new_log_bin"
|
||||
--echo #begin to restart mysqld
|
||||
--source include/restart_mysqld.inc
|
||||
--let $restart_parameters= ""
|
||||
|
||||
--source include/show_binary_logs.inc
|
||||
let $loop_times= 10;
|
||||
while ($loop_times) {
|
||||
flush logs;
|
||||
flush logs;
|
||||
if ($loop_times < 5)
|
||||
{
|
||||
if ($loop_times == 4)
|
||||
{
|
||||
--source include/show_binary_logs.inc
|
||||
}
|
||||
reset master;
|
||||
}
|
||||
if ($loop_times >= 5)
|
||||
{
|
||||
flush logs;
|
||||
}
|
||||
|
||||
#
|
||||
dec $loop_times;
|
||||
--echo # left times= $loop_times
|
||||
}
|
||||
--echo # [engine=$engine] after third loop_times=$loop_times, show master logs results
|
||||
--source include/show_binary_logs.inc
|
||||
|
||||
##cleanup
|
||||
drop database test_rotate_db;
|
Reference in New Issue
Block a user