diff --git a/mysql-test/r/mysqld--help-notwin.result b/mysql-test/r/mysqld--help-notwin.result index a20cc7b..6b19e9d 100644 --- a/mysql-test/r/mysqld--help-notwin.result +++ b/mysql-test/r/mysqld--help-notwin.result @@ -1044,6 +1044,7 @@ The following options may be given as the first argument: When this option is enabled, connections attempted using insecure transport will be rejected. Secure transports are SSL/TLS, Unix socket or Shared Memory (on Windows). + --rpl-read-size=# The size for reads done from the binlog and relay log. --rpl-stop-slave-timeout=# Timeout in seconds to wait for slave to stop before returning a warning. @@ -1573,6 +1574,7 @@ report-password (No default value) report-port 0 report-user (No default value) require-secure-transport FALSE +rpl-read-size 8192 rpl-stop-slave-timeout 31536000 safe-user-create FALSE schema-definition-cache 256 diff --git a/mysql-test/suite/rpl/r/rpl_read_size.result b/mysql-test/suite/rpl/r/rpl_read_size.result new file mode 100644 index 0000000..800427a --- /dev/null +++ b/mysql-test/suite/rpl/r/rpl_read_size.result @@ -0,0 +1,30 @@ +include/master-slave.inc +Warnings: +Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. +Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. +[connection master] +create table t1(i int, t longtext); +increase buffer and then make slave reconnect to use larger buffer +SET @@global.rpl_read_size = 1048576; +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +1048576 +SET @@global.rpl_read_size = 1048576; +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +1048576 +include/stop_slave.inc +include/start_slave.inc +insert into t1 values (0, ""); +select i, length(t) from t1; +i length(t) +0 0 +1 70000 +select i, length(t) from t1; +i length(t) +0 0 +1 70000 +SET @@global.rpl_read_size= 8192; +SET @@global.rpl_read_size= 8192; +drop table t1; +include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_read_size.test b/mysql-test/suite/rpl/t/rpl_read_size.test new file mode 100644 index 0000000..0a82c39 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_read_size.test @@ -0,0 +1,47 @@ +# +# test rpl_read_size my.cnf variable. +# This test verifies data is consistent across master and slave +# even after dynamically changing rpl_read_size value on slave. +# + +--source include/master-slave.inc + +create table t1(i int, t longtext); + +let $master_rpl_read_size= `SELECT @@global.rpl_read_size`; + +--echo increase buffer and then make slave reconnect to use larger buffer +SET @@global.rpl_read_size = 1048576; +SELECT @@global.rpl_read_size; + +connection slave; +let $slave_rpl_read_size= `SELECT @@global.rpl_read_size`; +SET @@global.rpl_read_size = 1048576; +SELECT @@global.rpl_read_size; +--source include/stop_slave.inc +--source include/start_slave.inc + +connection master; + +insert into t1 values (0, ""); + +let $x=`select lpad("foo", 70000, "bar")`; + +--disable_query_log +eval insert into t1 values (1, "$x"); +--enable_query_log + +# Verify the contents of table t1 on master. +select i, length(t) from t1; + +sync_slave_with_master; + +# Verify the contents of table t1 on slave. +# Should be same as contents in master. +select i, length(t) from t1; +eval SET @@global.rpl_read_size= $slave_rpl_read_size; + +connection master; +eval SET @@global.rpl_read_size= $master_rpl_read_size; +drop table t1; +--source include/rpl_end.inc diff --git a/mysql-test/suite/sys_vars/r/rpl_read_size_basic.result b/mysql-test/suite/sys_vars/r/rpl_read_size_basic.result new file mode 100644 index 0000000..c24cb54 --- /dev/null +++ b/mysql-test/suite/sys_vars/r/rpl_read_size_basic.result @@ -0,0 +1,100 @@ +SET @start_rpl_read_size = @@global.rpl_read_size; +SELECT @start_rpl_read_size; +@start_rpl_read_size +8192 +'#--------------------TEST 01------------------------#' +SET @@global.rpl_read_size = 102400; +SET @@global.rpl_read_size = DEFAULT; +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +8192 +'#---------------------TEST_02-------------------------#' +SET @@global.rpl_read_size = @start_rpl_read_size; +SELECT @@global.rpl_read_size = 8192; +@@global.rpl_read_size = 8192 +1 +'#--------------------TEST_03------------------------#' +SET @@global.rpl_read_size = 81920; +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +81920 +SET @@global.rpl_read_size = 102400; +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +102400 +'#--------------------TEST_04-------------------------#' +SET @@global.rpl_read_size = -1; +Warnings: +Warning 1292 Truncated incorrect rpl_read_size value: '-1' +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +8192 +SET @@global.rpl_read_size = 4096; +Warnings: +Warning 1292 Truncated incorrect rpl_read_size value: '4096' +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +8192 +SET @@global.rpl_read_size = 18446744073709551616; +ERROR 42000: Incorrect argument type to variable 'rpl_read_size' +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +8192 +SET @@global.rpl_read_size = 10000.01; +ERROR 42000: Incorrect argument type to variable 'rpl_read_size' +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +8192 +SET @@global.rpl_read_size = ON; +ERROR 42000: Incorrect argument type to variable 'rpl_read_size' +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +8192 +SET @@global.rpl_read_size = 'test'; +ERROR 42000: Incorrect argument type to variable 'rpl_read_size' +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +8192 +'#-------------------TEST_05----------------------------#' +SET @@session.rpl_read_size = 8192; +ERROR HY000: Variable 'rpl_read_size' is a GLOBAL variable and should be set with SET GLOBAL +SELECT @@session.rpl_read_size; +ERROR HY000: Variable 'rpl_read_size' is a GLOBAL variable +'#----------------------TEST_06------------------------#' +SELECT @@global.rpl_read_size = VARIABLE_VALUE +FROM performance_schema.global_variables +WHERE VARIABLE_NAME='rpl_read_size'; +@@global.rpl_read_size = VARIABLE_VALUE +1 +SELECT @@rpl_read_size = VARIABLE_VALUE +FROM performance_schema.session_variables +WHERE VARIABLE_NAME='rpl_read_size'; +@@rpl_read_size = VARIABLE_VALUE +1 +'#---------------------TEST_07----------------------#' +SET @@global.rpl_read_size = 8192; +SELECT @@rpl_read_size = @@global.rpl_read_size; +@@rpl_read_size = @@global.rpl_read_size +1 +'#---------------------TEST_08----------------------#' +SET rpl_read_size = 8192; +ERROR HY000: Variable 'rpl_read_size' is a GLOBAL variable and should be set with SET GLOBAL +SELECT @@rpl_read_size; +@@rpl_read_size +8192 +SET local.rpl_read_size = 8192 +--Error ER_UNKNOWN_TABLE +SELECT local.rpl_read_size; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'local.rpl_read_size = 8192 +--Error ER_UNKNOWN_TABLE +SELECT local.rpl_read_size' at line 1 +SET global.rpl_read_size = 8192; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'global.rpl_read_size = 8192' at line 1 +SELECT global.rpl_read_size; +ERROR 42S02: Unknown table 'global' in field list +SELECT rpl_read_size = @@session.rpl_read_size; +ERROR 42S22: Unknown column 'rpl_read_size' in 'field list' +SET @@global.rpl_read_size = @start_rpl_read_size; +SELECT @@global.rpl_read_size; +@@global.rpl_read_size +8192 diff --git a/mysql-test/suite/sys_vars/t/rpl_read_size_basic.test b/mysql-test/suite/sys_vars/t/rpl_read_size_basic.test new file mode 100644 index 0000000..84b8f3b --- /dev/null +++ b/mysql-test/suite/sys_vars/t/rpl_read_size_basic.test @@ -0,0 +1,153 @@ +############## mysql-test\t\rpl_read_size.test ############################## +# # +# Variable Name: rpl_read_size # +# Scope: GLOBAL # +# Access Type: Dynamic # +# Data Type: numeric # +# Default Value:8192 # +# Range: 8192-4294967295 # +# # +# # +# # +# # +# # +# Creation Date: 2012-11-19 # +# Author: Santosh Banda # +# # +# Description: Test Cases of Dynamic System Variable rpl_read_size # +# that checks the behavior of this variable in the following ways# +# * Default Value # +# * Valid & Invalid values # +# * Scope & Access method # +# * Data Integrity # +# # +# # +############################################################################### + +--source include/load_sysvars.inc + +######################################################################## +# START OF rpl_read_size TESTS # +######################################################################## + + +SET @start_rpl_read_size = @@global.rpl_read_size; +SELECT @start_rpl_read_size; + +--echo '#--------------------TEST 01------------------------#' +######################################################################## +# Display the DEFAULT value of rpl_read_size # +######################################################################## + +SET @@global.rpl_read_size = 102400; +SET @@global.rpl_read_size = DEFAULT; +SELECT @@global.rpl_read_size; + + +--echo '#---------------------TEST_02-------------------------#' +############################################### +# Verify default value of variable # +############################################### + +SET @@global.rpl_read_size = @start_rpl_read_size; +SELECT @@global.rpl_read_size = 8192; + +--echo '#--------------------TEST_03------------------------#' +######################################################################## +# Change the value of rpl_read_size to a valid value # +######################################################################## + +SET @@global.rpl_read_size = 81920; +SELECT @@global.rpl_read_size; +SET @@global.rpl_read_size = 102400; +SELECT @@global.rpl_read_size; + + +--echo '#--------------------TEST_04-------------------------#' +######################################################################### +# Change the value of rpl_read_size to invalid value # +######################################################################### + +SET @@global.rpl_read_size = -1; +SELECT @@global.rpl_read_size; +SET @@global.rpl_read_size = 4096; +SELECT @@global.rpl_read_size; +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.rpl_read_size = 18446744073709551616; +SELECT @@global.rpl_read_size; +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.rpl_read_size = 10000.01; +SELECT @@global.rpl_read_size; + +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.rpl_read_size = ON; +SELECT @@global.rpl_read_size; +--Error ER_WRONG_TYPE_FOR_VAR +SET @@global.rpl_read_size = 'test'; +SELECT @@global.rpl_read_size; + + +--echo '#-------------------TEST_05----------------------------#' +########################################################################## +# Test if accessing session rpl_read_size gives error # +########################################################################## + +--Error ER_GLOBAL_VARIABLE +SET @@session.rpl_read_size = 8192; +--Error ER_INCORRECT_GLOBAL_LOCAL_VAR +SELECT @@session.rpl_read_size; + + +--echo '#----------------------TEST_06------------------------#' +############################################################################## +# Check if the value in GLOBAL & SESSION Tables matches values in variable # +############################################################################## + +SELECT @@global.rpl_read_size = VARIABLE_VALUE +FROM performance_schema.global_variables +WHERE VARIABLE_NAME='rpl_read_size'; + +SELECT @@rpl_read_size = VARIABLE_VALUE +FROM performance_schema.session_variables +WHERE VARIABLE_NAME='rpl_read_size'; + +--echo '#---------------------TEST_07----------------------#' +######################################################################################################## +# Check if accessing variable with SESSION,LOCAL and without SCOPE points to same session variable # +######################################################################################################## + +SET @@global.rpl_read_size = 8192; +SELECT @@rpl_read_size = @@global.rpl_read_size; + + +--echo '#---------------------TEST_08----------------------#' +################################################################################ +# Check if rpl_read_size can be accessed with and without @@ sign # +################################################################################ + +--Error ER_GLOBAL_VARIABLE +SET rpl_read_size = 8192; +SELECT @@rpl_read_size; +--Error ER_PARSE_ERROR +SET local.rpl_read_size = 8192 +--Error ER_UNKNOWN_TABLE +SELECT local.rpl_read_size; +--Error ER_PARSE_ERROR +SET global.rpl_read_size = 8192; +--Error ER_UNKNOWN_TABLE +SELECT global.rpl_read_size; +--Error ER_BAD_FIELD_ERROR +SELECT rpl_read_size = @@session.rpl_read_size; + + +############################## +# Restore initial value # +############################## + +SET @@global.rpl_read_size = @start_rpl_read_size; +SELECT @@global.rpl_read_size; + + +###################################################################### +# END OF rpl_read_size TESTS # +###################################################################### diff --git a/sql/binlog.cc b/sql/binlog.cc index 2510a5c..5b40827 100644 --- a/sql/binlog.cc +++ b/sql/binlog.cc @@ -117,6 +117,9 @@ using std::string; using std::list; using binary_log::checksum_crc32; +/* Size for IO_CACHE buffer for binlog & relay log */ +ulong rpl_read_size; + #define FLAGSTR(V,F) ((V)&(F)?#F" ":"") #define YESNO(X) ((X) ? "yes" : "no") @@ -3070,7 +3073,7 @@ File open_binlog_file(IO_CACHE *log, const char *log_file_name, const char **err *errmsg = "Could not open log file"; goto err; } - if (init_io_cache_ext(log, file, IO_SIZE*2, READ_CACHE, 0, 0, + if (init_io_cache_ext(log, file, rpl_read_size, READ_CACHE, 0, 0, MYF(MY_WME|MY_DONT_CHECK_FILESIZE), key_file_binlog_cache)) { LogErr(ERROR_LEVEL, ER_BINLOG_CANT_CREATE_CACHE_FOR_LOG, log_file_name); diff --git a/sql/binlog.h b/sql/binlog.h index b701732..813e0f5 100644 --- a/sql/binlog.h +++ b/sql/binlog.h @@ -46,6 +46,8 @@ #include "sql_string.h" #include "thr_mutex.h" +extern ulong rpl_read_size; + class Format_description_log_event; class Gtid_monitoring_info; class Gtid_set; diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index b3a9dac..7d82fc0 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -5682,6 +5682,13 @@ static Sys_var_bool Sys_relay_log_recovery( "processed", READ_ONLY GLOBAL_VAR(relay_log_recovery), CMD_LINE(OPT_ARG), DEFAULT(FALSE)); +static Sys_var_ulong Sys_rpl_read_size( + "rpl_read_size", + "The size for reads done from the binlog and relay log.", + GLOBAL_VAR(rpl_read_size), CMD_LINE(REQUIRED_ARG), + VALID_RANGE(IO_SIZE * 2, ULONG_MAX), DEFAULT(IO_SIZE * 2), + BLOCK_SIZE(IO_SIZE)); + static Sys_var_bool Sys_slave_allow_batching( "slave_allow_batching", "Allow slave to batch requests", GLOBAL_VAR(opt_slave_allow_batching),