1
0
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:
Monty
2019-03-25 15:57:00 +02:00
parent e3bffd579f
commit adb7016214
6 changed files with 1220 additions and 58 deletions

View 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;