polardbxengine/mysql-test/suite/special/t/innodb_dedicated_server.test

482 lines
22 KiB
Plaintext

#####################################################################################
# Test for autoscaling based on innodb_dedicated_server variable. #
# #
# #
# This test checks autoscaling of following variables based on value of #
# innodb_dedicated_server option #
# - innodb_buffer_pool_size #
# - innodb_log_file_size #
# - innodb_log_files_in_group #
# - innodb_flush_method #
# #
# This test also does basic testing for new variable innodb_dedicated_server #
# This test is diabled on Solaris and Wndows as they dont support O_DIRECT_NO_FSYNC #
#####################################################################################
# Make sure to run only on Linux
--source include/linux.inc
# Make sure this test is not run on PB2 machines
--source include/is_local_machine.inc
# This test takes long time, so only run it with the --big-test mtr-flag.
--source include/big_test.inc
# Make sure that there are no other tests running in parallel
--source include/not_parallel.inc
##############################################################################
# Autoscaling is done as per below formula: #
# innodb_buffer_pool_size #
# server_memory < 1G ? 128M (same as current default) #
# server_memory <= 4G ? server_memory * 0.5 #
# server_memory > 4G ? server_memory * 0.75 #
# #
# innodb_log_file_size #
# buf_pool_size < 1G ? 48M (same as current default) #
# buf_pool_size < 8G ? 512M #
# buf_pool_size <= 128G ? 1024M #
# buf_pool_size > 128G ? 2048M #
# #
# innodb_log_files_in_group #
# buf_pool_size < 1G ? 2 (same as current default) #
# buf_pool_size < 8G ? ROUND(buf_pool_size/GB) #
# buf_pool_size <= 128G ? ROUND(buf_pool_size/GB * 0.75) #
# buf_pool_size > 128G ? 64 #
# #
# Following Perl module calculates server memory and evaluates #
# innodb_buffer_pool_size and #
# innodb_log_file_size #
# innodb_log_files_in_group #
# based on above formula. #
# #
# NOTE : Memory considered here is in Kilo bytes #
##############################################################################
perl;
use Sys::MemInfo qw(totalmem freemem totalswap);
my $dir = $ENV{'MYSQLTEST_VARDIR'};
$total_mem=&totalmem/1024;
my $filename="$dir/tmpfile.txt";
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh "let \$total_mem = $total_mem\; \n";
close $fh;
EOF
# Perl module ends
--source $MYSQLTEST_VARDIR/tmpfile.txt
--let $mem_size1K = 1024
--let $mem_size1G = 1048576
--let $mem_size4G = 4194304
--let $mem_size8G = 8388608
--let $mem_size128G = 134217728
--let $zero_point_five = 0.5
--let $zero_point_seven_five = 0.75
# Set buffer pool size.
# Note: As MTR doesn't have 'else', following sequence of 'if' is important
if ($total_mem > $mem_size4G) {
--expr $calculated_buffer_pool_size = $total_mem * $zero_point_seven_five
}
if ($total_mem <= $mem_size4G) {
--expr $calculated_buffer_pool_size = $total_mem * $zero_point_five
}
if ($total_mem < $mem_size1G) {
--let $calculated_buffer_pool_size = 131072
}
--disable_query_log
call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* Resizing redo log");
call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* Starting to delete and rewrite log files.");
call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* New log files created");
call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored ");
call mtr.add_suppression("\\[Warning\\] .*MY-\\d+.* No argument was provided to --log-bin, and --log-bin-index was not used");
--enable_query_log
--echo
--echo ###########################################
--echo # INITIAL START #
--echo # innodb_dedicated_server = OFF #
--echo # innodb_buffer_pool_size = default #
--echo # innodb_log_file_size = default #
--echo # innodb_log_files_in_group = default #
--echo # innodb_flush_method = default #
--echo ###########################################
--disable_query_log
SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_dedicated_server';
SELECT VARIABLE_VALUE/(1024*1024) AS BUFFER_POOL_SIZE_IN_MB
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_buffer_pool_size';
SELECT VARIABLE_VALUE/(1024*1024) AS LOG_FILE_SIZE_IN_MB
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_log_file_size';
SELECT VARIABLE_VALUE AS LOG_FILES_IN_GROUP
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_log_files_in_group';
SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_flush_method';
--enable_query_log
--echo
--echo ###########################################
--echo # RESTART 1 #
--echo # innodb_dedicated_server = ON #
--echo # innodb_buffer_pool_size = autoscaled #
--echo # innodb_log_file_size = autoscaled #
--echo # innodb_log_files_in_group = autoscaled #
--echo # innodb_flush_method = autoscaled #
--echo ###########################################
let $restart_parameters = restart: --innodb_dedicated_server=ON;
let $explicit_default_counter=100000;
--source include/restart_mysqld.inc
###############################################################################
# Get expected values of Buffer pool size and Log file size #
###############################################################################
# Note: If calculated value of innodb_buffer_pool_size evaluates to a value #
# that is not equal to or a multiple of #
# innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances, #
# then innodb_buffer_pool_size is automatically adjusted to a value that is #
# equal to or a multiple of #
# innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances #
# that is not less than the specified buffer pool size. #
###############################################################################
--disable_query_log
set @innodb_chunk_instance_product = ROUND(@@global.innodb_buffer_pool_chunk_size/1024,2) * @@global.innodb_buffer_pool_instances;
let $expected_innodb_buffer_pool_size = `select ROUND(CEIL($calculated_buffer_pool_size/@innodb_chunk_instance_product) * @innodb_chunk_instance_product)`;
# Set log_file_size and log_files_in_group now after buffer_pool_size has been decided.
# Note: As MTR doesn't have 'else', following sequence of 'if' is important
if ($expected_innodb_buffer_pool_size > $mem_size128G) {
--let $calculated_log_file_size = 2097152
--let $calculated_log_files_in_group = 64
}
if ($expected_innodb_buffer_pool_size <= $mem_size128G) {
--let $calculated_log_file_size = 1048576
--let $calculated_log_files_in_group = `SELECT ROUND($expected_innodb_buffer_pool_size*$zero_point_seven_five/$mem_size1G,0)`
}
if ($expected_innodb_buffer_pool_size <= $mem_size8G) {
--let $calculated_log_file_size = 524288
--let $calculated_log_files_in_group = `SELECT ROUND($expected_innodb_buffer_pool_size/($mem_size1K * $mem_size1K),0)`
}
if ($expected_innodb_buffer_pool_size < $mem_size1G) {
--let $calculated_log_file_size = 49152;
--let $calculated_log_files_in_group = 2;
}
let $expected_innodb_log_file_size = `select $calculated_log_file_size`;
let $expected_innodb_log_files_in_group = `select $calculated_log_files_in_group`;
--enable_query_log
--disable_query_log
SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_dedicated_server';
let $actual_innodb_buffer_pool_size = `select ROUND(@@global.innodb_buffer_pool_size/1024,2)`;
--disable_result_log
eval select $expected_innodb_buffer_pool_size = $actual_innodb_buffer_pool_size into @final_pool_size_result;
--enable_result_log
--echo 1 expected
select @final_pool_size_result;
let $actual_innodb_log_file_size = `select ROUND(@@global.innodb_log_file_size/1024,2)`;
--disable_result_log
eval select ROUND($expected_innodb_log_file_size,2) = $actual_innodb_log_file_size into @final_log_file_size_result;
--enable_result_log
--echo 1 expected
select @final_log_file_size_result;
let $actual_innodb_log_files_in_group = `select @@global.innodb_log_files_in_group`;
--disable_result_log
eval select $expected_innodb_log_files_in_group = $actual_innodb_log_files_in_group into @final_log_files_in_group_result;
--enable_result_log
--echo 1 expected
select @final_log_files_in_group_result;
SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_flush_method';
--enable_query_log
--echo
--echo ###########################################
--echo # RESTART 2 #
--echo # innodb_dedicated_server = ON #
--echo # innodb_buffer_pool_size = explicit #
--echo # innodb_log_file_size = autoscaled #
--echo # innodb_log_files_in_group = autoscaled #
--echo # innodb_flush_method = autoscaled #
--echo ###########################################
let $restart_parameters = restart: --innodb_dedicated_server=ON --innodb_buffer_pool_size=256M;
let $explicit_default_counter=100000;
--source include/restart_mysqld.inc
--disable_query_log
SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_dedicated_server';
SELECT VARIABLE_VALUE/(1024*1024) AS BUFFER_POOL_SIZE_IN_MB
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_buffer_pool_size';
let $actual_innodb_log_file_size = `select ROUND(@@global.innodb_log_file_size/1024,2)`;
--disable_result_log
eval select $expected_innodb_log_file_size = $actual_innodb_log_file_size into @final_log_file_size_result;
--enable_result_log
--echo 1 expected
select @final_log_file_size_result;
let $actual_innodb_log_files_in_group = `select @@global.innodb_log_files_in_group`;
--disable_result_log
eval select $expected_innodb_log_files_in_group = $actual_innodb_log_files_in_group into @final_log_files_in_group_result;
--enable_result_log
--echo 1 expected
select @final_log_files_in_group_result;
SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_flush_method';
--enable_query_log
--echo # Make sure that the warnings are present in server log.
let server_log= $MYSQLTEST_VARDIR/log/mysqld.1.err;
let SEARCH_FILE= $server_log;
let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_buffer_pool_size;
--source include/search_pattern.inc
--echo
--echo ###########################################
--echo # RESTART 3 #
--echo # innodb_dedicated_server = ON #
--echo # innodb_buffer_pool_size = autoscaled #
--echo # innodb_log_file_size = explicit #
--echo # innodb_log_files_in_group = autoscaled #
--echo # innodb_flush_method = autoscaled #
--echo ###########################################
let $restart_parameters = restart: --innodb_dedicated_server=ON --innodb_log_file_size=50M;
let $explicit_default_counter=100000;
--source include/restart_mysqld.inc
--disable_query_log
SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_dedicated_server';
let $actual_innodb_buffer_pool_size = `select ROUND(@@global.innodb_buffer_pool_size/1024,2)`;
--disable_result_log
eval select $expected_innodb_buffer_pool_size = $actual_innodb_buffer_pool_size into @final_pool_size_result;
--enable_result_log
--echo 1 expected
select @final_pool_size_result;
SELECT VARIABLE_VALUE/(1024*1024) AS LOG_FILE_SIZE_IN_MB
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_log_file_size';
let $actual_innodb_log_files_in_group = `select @@global.innodb_log_files_in_group`;
--disable_result_log
eval select $expected_innodb_log_files_in_group = $actual_innodb_log_files_in_group into @final_log_files_in_group_result;
--enable_result_log
--echo 1 expected
select @final_log_files_in_group_result;
SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_flush_method';
--enable_query_log
--echo # Make sure that the warnings are present in server log.
let server_log= $MYSQLTEST_VARDIR/log/mysqld.1.err;
let SEARCH_FILE= $server_log;
let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_log_file_size;
--source include/search_pattern.inc
--echo
--echo ###########################################
--echo # RESTART 4 #
--echo # innodb_dedicated_server = ON #
--echo # innodb_buffer_pool_size = autoscaled #
--echo # innodb_log_file_size = autoscaled #
--echo # innodb_log_files_in_group = autoscaled #
--echo # innodb_flush_method = explicit #
--echo ###########################################
let $restart_parameters = restart: --innodb_dedicated_server=ON --innodb_flush_method=nosync;
let $explicit_default_counter=100000;
--source include/restart_mysqld.inc
--disable_query_log
SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_dedicated_server';
let $actual_innodb_buffer_pool_size = `select @@global.innodb_buffer_pool_size/1024`;
--disable_result_log
eval select $expected_innodb_buffer_pool_size = $actual_innodb_buffer_pool_size into @final_pool_size_result;
--enable_result_log
--echo 1 expected
select @final_pool_size_result;
let $actual_innodb_log_file_size = `select @@global.innodb_log_file_size/1024`;
--disable_result_log
eval select $expected_innodb_log_file_size = $actual_innodb_log_file_size into @final_log_file_size_result;
--enable_result_log
--echo 1 expected
select @final_log_file_size_result;
let $actual_innodb_log_files_in_group = `select @@global.innodb_log_files_in_group`;
--disable_result_log
eval select $expected_innodb_log_files_in_group = $actual_innodb_log_files_in_group into @final_log_files_in_group_result;
--enable_result_log
--echo 1 expected
select @final_log_files_in_group_result;
SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_flush_method';
--enable_query_log
--echo # Make sure that the warnings are present in server log.
let server_log= $MYSQLTEST_VARDIR/log/mysqld.1.err;
let SEARCH_FILE= $server_log;
let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_flush_method;
--source include/search_pattern.inc
--echo
--echo ###########################################
--echo # RESTART 5 #
--echo # innodb_dedicated_server = ON #
--echo # innodb_buffer_pool_size = explicit #
--echo # innodb_log_file_size = explicit #
--echo # innodb_log_files_in_group = explicit #
--echo # innodb_flush_method = explicit #
--echo ###########################################
let $restart_parameters = restart: --innodb_dedicated_server=ON --innodb_buffer_pool_size=256M --innodb_log_file_size=50M --innodb_log_files_in_group=3 --innodb_flush_method=nosync;
let $explicit_default_counter=100000;
--source include/restart_mysqld.inc
--disable_query_log
SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_dedicated_server';
SELECT VARIABLE_VALUE/(1024*1024) AS BUFFER_POOL_SIZE_IN_MB
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_buffer_pool_size';
SELECT VARIABLE_VALUE/(1024*1024) AS LOG_FILE_SIZE_IN_MB
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_log_file_size';
SELECT VARIABLE_VALUE AS LOG_FILES_IN_GROUP
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_log_files_in_group';
SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_flush_method';
--enable_query_log
--echo # Make sure that the warnings are present in server log.
let server_log= $MYSQLTEST_VARDIR/log/mysqld.1.err;
let SEARCH_FILE= $server_log;
let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_buffer_pool_size;
--source include/search_pattern.inc
let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_log_file_size;
--source include/search_pattern.inc
let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_flush_method;
--source include/search_pattern.inc
--echo
--echo ###########################################
--echo # RESTART 6 #
--echo # innodb_dedicated_server = ON #
--echo # innodb_buffer_pool_size = autoscaled #
--echo # innodb_log_file_size = explicit #
--echo # innodb_log_files_in_group = explicit #
--echo # innodb_flush_method = explicit #
--echo ###########################################
let $restart_parameters = restart: --innodb_dedicated_server=ON --innodb_log_file_size=50M --innodb_log_files_in_group=4 --innodb_flush_method=nosync;
let $explicit_default_counter=100000;
--source include/restart_mysqld.inc
--disable_query_log
SELECT VARIABLE_VALUE AS INNODB_DEDICATED_SERVER
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_dedicated_server';
let $actual_innodb_buffer_pool_size = `select @@global.innodb_buffer_pool_size/1024`;
--disable_result_log
eval select $expected_innodb_buffer_pool_size = $actual_innodb_buffer_pool_size into @final_pool_size_result;
--enable_result_log
--echo 1 expected
select @final_pool_size_result;
SELECT VARIABLE_VALUE/(1024*1024) AS LOG_FILE_SIZE_IN_MB
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_log_file_size';
SELECT VARIABLE_VALUE AS LOG_FILES_IN_GROUP
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_log_files_in_group';
SELECT VARIABLE_VALUE AS INNODB_FLUSH_METHOD
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='innodb_flush_method';
--enable_query_log
--echo # Make sure that the warnings are present in server log.
let server_log= $MYSQLTEST_VARDIR/log/mysqld.1.err;
let SEARCH_FILE= $server_log;
let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_log_file_size;
--source include/search_pattern.inc
let SEARCH_PATTERN= \\[Warning\\] .*MY-\\d+.* Option innodb_dedicated_server is ignored for innodb_flush_method;
--source include/search_pattern.inc
--enable_query_log
--remove_file $MYSQLTEST_VARDIR/tmpfile.txt
#######################################################################################
# Check if innodb_dedicated_server can be accessed with and without @@ sign #
#######################################################################################
--Error ER_INCORRECT_GLOBAL_LOCAL_VAR
SET innodb_dedicated_server = 0;
SELECT @@innodb_dedicated_server;
--Error ER_UNKNOWN_TABLE
SELECT local.innodb_dedicated_server;
--Error ER_INCORRECT_GLOBAL_LOCAL_VAR
SET global innodb_dedicated_server = 0;
SELECT @@global.innodb_dedicated_server;
--Error ER_INCORRECT_GLOBAL_LOCAL_VAR
set session innodb_dedicated_server=1;
SELECT @@innodb_dedicated_server;
show global variables like 'innodb_dedicated_server';
show session variables like 'innodb_dedicated_server';
####################################################################################################
# Check if the value of innodb_dedicated_server in GLOBAL Table matches value in variable #
####################################################################################################
--echo 1 Expected
SELECT @@global.innodb_dedicated_server;
select * from performance_schema.global_variables where variable_name='innodb_dedicated_server';
select * from performance_schema.session_variables where variable_name='innodb_dedicated_server';
###################################################################################################
# Check if innodb_dedicated_server a non-persistent variable #
###################################################################################################
--Error ER_INCORRECT_GLOBAL_LOCAL_VAR
set persist_only innodb_dedicated_server=off;