Skip to content

Commit

Permalink
New conf option for SO_SNDBUF in dump thread.
Browse files Browse the repository at this point in the history
Summary:
A new configuration option rpl_send_buffer_size is added
to control the TCP send buffer size of the socket used in dump thread.

Reference patch: facebook@ac90867

Differential Revision: D6377432 (facebook@a107c9c)

fbshipit-source-id: d9b0099277c
  • Loading branch information
Aliaksei Sandryhaila authored and inikep committed Jul 14, 2021
1 parent 415c426 commit 6d27683
Show file tree
Hide file tree
Showing 8 changed files with 272 additions and 0 deletions.
4 changes: 4 additions & 0 deletions mysql-test/r/mysqld--help-notwin.result
Original file line number Diff line number Diff line change
Expand Up @@ -1174,6 +1174,9 @@ The following options may be given as the first argument:
must be a multiple of 4kb. Making it larger might help
with IO stalls while reading these files when they are
not in the OS buffer cache
--rpl-send-buffer-size=#
The size of output buffer for the socket used during
sending events to a slave.
--rpl-stop-slave-timeout=#
Timeout in seconds to wait for slave to stop before
returning a warning.
Expand Down Expand Up @@ -1772,6 +1775,7 @@ report-port 0
report-user (No default value)
require-secure-transport FALSE
rpl-read-size 8192
rpl-send-buffer-size 2097152
rpl-stop-slave-timeout 31536000
safe-user-create FALSE
schema-definition-cache 256
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ SET PERSIST_ONLY rpl_semi_sync_master_wait_no_slave = @@GLOBAL.rpl_semi_sync_mas
SET PERSIST_ONLY rpl_semi_sync_master_wait_point = @@GLOBAL.rpl_semi_sync_master_wait_point;
SET PERSIST_ONLY rpl_semi_sync_slave_enabled = @@GLOBAL.rpl_semi_sync_slave_enabled;
SET PERSIST_ONLY rpl_semi_sync_slave_trace_level = @@GLOBAL.rpl_semi_sync_slave_trace_level;
SET PERSIST_ONLY rpl_send_buffer_size = @@GLOBAL.rpl_send_buffer_size;
SET PERSIST_ONLY rpl_stop_slave_timeout = @@GLOBAL.rpl_stop_slave_timeout;
SET PERSIST_ONLY session_track_gtids = @@GLOBAL.session_track_gtids;
SET PERSIST_ONLY slave_allow_batching = @@GLOBAL.slave_allow_batching;
Expand Down Expand Up @@ -220,6 +221,7 @@ RESET PERSIST rpl_semi_sync_master_wait_no_slave;
RESET PERSIST rpl_semi_sync_master_wait_point;
RESET PERSIST rpl_semi_sync_slave_enabled;
RESET PERSIST rpl_semi_sync_slave_trace_level;
RESET PERSIST rpl_send_buffer_size;
RESET PERSIST rpl_stop_slave_timeout;
RESET PERSIST session_track_gtids;
RESET PERSIST slave_allow_batching;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ SET PERSIST rpl_semi_sync_master_wait_no_slave = @@GLOBAL.rpl_semi_sync_master_w
SET PERSIST rpl_semi_sync_master_wait_point = @@GLOBAL.rpl_semi_sync_master_wait_point;
SET PERSIST rpl_semi_sync_slave_enabled = @@GLOBAL.rpl_semi_sync_slave_enabled;
SET PERSIST rpl_semi_sync_slave_trace_level = @@GLOBAL.rpl_semi_sync_slave_trace_level;
SET PERSIST rpl_send_buffer_size = @@GLOBAL.rpl_send_buffer_size;
SET PERSIST rpl_stop_slave_timeout = @@GLOBAL.rpl_stop_slave_timeout;
SET PERSIST session_track_gtids = @@GLOBAL.session_track_gtids;
SET PERSIST slave_allow_batching = @@GLOBAL.slave_allow_batching;
Expand Down Expand Up @@ -249,6 +250,7 @@ RESET PERSIST IF EXISTS rpl_semi_sync_master_wait_no_slave;
RESET PERSIST IF EXISTS rpl_semi_sync_master_wait_point;
RESET PERSIST IF EXISTS rpl_semi_sync_slave_enabled;
RESET PERSIST IF EXISTS rpl_semi_sync_slave_trace_level;
RESET PERSIST IF EXISTS rpl_send_buffer_size;
RESET PERSIST IF EXISTS rpl_stop_slave_timeout;
RESET PERSIST IF EXISTS session_track_gtids;
RESET PERSIST IF EXISTS slave_allow_batching;
Expand Down
106 changes: 106 additions & 0 deletions mysql-test/suite/sys_vars/r/rpl_send_buffer_size_basic.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
SET @start_rpl_send_buffer_size = @@global.rpl_send_buffer_size;
SELECT @start_rpl_send_buffer_size;
@start_rpl_send_buffer_size
2097152
'#--------------------TEST_01------------------------#'
SET @@global.rpl_send_buffer_size = 20 * 1024;
SET @@global.rpl_send_buffer_size = DEFAULT;
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
2097152
'#---------------------TEST_02-------------------------#'
SET @@global.rpl_send_buffer_size = @start_rpl_send_buffer_size;
SELECT @@global.rpl_send_buffer_size = 2 * 1024 * 1024;
@@global.rpl_send_buffer_size = 2 * 1024 * 1024
1
'#--------------------TEST_03------------------------#'
SET @@global.rpl_send_buffer_size = 16 * 1024;
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
16384
SET @@global.rpl_send_buffer_size = 128 * 1024 * 1024;
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
134217728
SET @@global.rpl_send_buffer_size = 300 * 1024;
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
307200
SET @@global.rpl_send_buffer_size = 100 * 1024 * 1024;
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
104857600
'#--------------------TEST_04-------------------------#'
SET @@global.rpl_send_buffer_size = -1;
Warnings:
Warning 1292 Truncated incorrect rpl_send_buffer_size value: '-1'
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
1024
SET @@global.rpl_send_buffer_size = 100;
Warnings:
Warning 1292 Truncated incorrect rpl_send_buffer_size value: '100'
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
1024
SET @@global.rpl_send_buffer_size = 18446744073709551616;
ERROR 42000: Incorrect argument type to variable 'rpl_send_buffer_size'
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
1024
SET @@global.rpl_send_buffer_size = 10000.01;
ERROR 42000: Incorrect argument type to variable 'rpl_send_buffer_size'
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
1024
SET @@global.rpl_send_buffer_size = ON;
ERROR 42000: Incorrect argument type to variable 'rpl_send_buffer_size'
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
1024
SET @@global.rpl_send_buffer_size = 'test';
ERROR 42000: Incorrect argument type to variable 'rpl_send_buffer_size'
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
1024
'#-------------------TEST_05----------------------------#'
SET @@session.rpl_send_buffer_size = 20 * 1024;
ERROR HY000: Variable 'rpl_send_buffer_size' is a GLOBAL variable and should be set with SET GLOBAL
SELECT @@session.rpl_send_buffer_size;
ERROR HY000: Variable 'rpl_send_buffer_size' is a GLOBAL variable
'#----------------------TEST_06------------------------#'
SELECT @@global.rpl_send_buffer_size = VARIABLE_VALUE
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='rpl_send_buffer_size';
@@global.rpl_send_buffer_size = VARIABLE_VALUE
1
SELECT @@rpl_send_buffer_size = VARIABLE_VALUE
FROM performance_schema.session_variables
WHERE VARIABLE_NAME='rpl_send_buffer_size';
@@rpl_send_buffer_size = VARIABLE_VALUE
1
'#---------------------TEST_08----------------------#'
SET @@global.rpl_send_buffer_size = 30 * 1024;
SELECT @@rpl_send_buffer_size = @@global.rpl_send_buffer_size;
@@rpl_send_buffer_size = @@global.rpl_send_buffer_size
1
'#---------------------TEST_09----------------------#'
SET rpl_send_buffer_size = 20 * 1024;
ERROR HY000: Variable 'rpl_send_buffer_size' is a GLOBAL variable and should be set with SET GLOBAL
SELECT @@rpl_send_buffer_size;
@@rpl_send_buffer_size
30720
SET local.rpl_send_buffer_size = 20 * 1024;
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_send_buffer_size = 20 * 1024' at line 1
SELECT local.rpl_send_buffer_size;
ERROR 42S02: Unknown table 'local' in field list
SET global.rpl_send_buffer_size = 30 * 1024;
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_send_buffer_size = 30 * 1024' at line 1
SELECT global.rpl_send_buffer_size;
ERROR 42S02: Unknown table 'global' in field list
SELECT rpl_send_buffer_size = @@session.rpl_send_buffer_size;
ERROR 42S22: Unknown column 'rpl_send_buffer_size' in 'field list'
SET @@global.rpl_send_buffer_size = @start_rpl_send_buffer_size;
SELECT @@global.rpl_send_buffer_size;
@@global.rpl_send_buffer_size
2097152
132 changes: 132 additions & 0 deletions mysql-test/suite/sys_vars/t/rpl_send_buffer_size_basic.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
--source include/load_sysvars.inc

########################################################################
# START OF rpl_send_buffer_size TESTS #
########################################################################


SET @start_rpl_send_buffer_size = @@global.rpl_send_buffer_size;
SELECT @start_rpl_send_buffer_size;

--echo '#--------------------TEST_01------------------------#'
########################################################################
# Display the DEFAULT value of rpl_send_buffer_size #
########################################################################

SET @@global.rpl_send_buffer_size = 20 * 1024;
SET @@global.rpl_send_buffer_size = DEFAULT;
SELECT @@global.rpl_send_buffer_size;


--echo '#---------------------TEST_02-------------------------#'
###############################################
# Verify default value of variable #
###############################################

SET @@global.rpl_send_buffer_size = @start_rpl_send_buffer_size;
SELECT @@global.rpl_send_buffer_size = 2 * 1024 * 1024;

--echo '#--------------------TEST_03------------------------#'
########################################################################
# Change the value of rpl_send_buffer_size to a valid value #
########################################################################

SET @@global.rpl_send_buffer_size = 16 * 1024;
SELECT @@global.rpl_send_buffer_size;
SET @@global.rpl_send_buffer_size = 128 * 1024 * 1024;
SELECT @@global.rpl_send_buffer_size;
SET @@global.rpl_send_buffer_size = 300 * 1024;
SELECT @@global.rpl_send_buffer_size;
SET @@global.rpl_send_buffer_size = 100 * 1024 * 1024;
SELECT @@global.rpl_send_buffer_size;


--echo '#--------------------TEST_04-------------------------#'
#########################################################################
# Change the value of rpl_send_buffer_size to invalid value #
#########################################################################

SET @@global.rpl_send_buffer_size = -1;
SELECT @@global.rpl_send_buffer_size;
SET @@global.rpl_send_buffer_size = 100;
SELECT @@global.rpl_send_buffer_size;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.rpl_send_buffer_size = 18446744073709551616;
SELECT @@global.rpl_send_buffer_size;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.rpl_send_buffer_size = 10000.01;
SELECT @@global.rpl_send_buffer_size;

--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.rpl_send_buffer_size = ON;
SELECT @@global.rpl_send_buffer_size;
--Error ER_WRONG_TYPE_FOR_VAR
SET @@global.rpl_send_buffer_size = 'test';
SELECT @@global.rpl_send_buffer_size;


--echo '#-------------------TEST_05----------------------------#'
##########################################################################
# Test if accessing session rpl_send_buffer_size gives error #
##########################################################################

--Error ER_GLOBAL_VARIABLE
SET @@session.rpl_send_buffer_size = 20 * 1024;
--Error ER_INCORRECT_GLOBAL_LOCAL_VAR
SELECT @@session.rpl_send_buffer_size;


--echo '#----------------------TEST_06------------------------#'
##############################################################################
# Check if the value in GLOBAL & SESSION Tables matches values in variable #
##############################################################################

SELECT @@global.rpl_send_buffer_size = VARIABLE_VALUE
FROM performance_schema.global_variables
WHERE VARIABLE_NAME='rpl_send_buffer_size';

SELECT @@rpl_send_buffer_size = VARIABLE_VALUE
FROM performance_schema.session_variables
WHERE VARIABLE_NAME='rpl_send_buffer_size';


--echo '#---------------------TEST_08----------------------#'
########################################################################################################
# Check if accessing variable with SESSION,LOCAL and without SCOPE points to same session variable #
########################################################################################################

SET @@global.rpl_send_buffer_size = 30 * 1024;
SELECT @@rpl_send_buffer_size = @@global.rpl_send_buffer_size;


--echo '#---------------------TEST_09----------------------#'
################################################################################
# Check if rpl_send_buffer_size can be accessed with and without @@ sign #
################################################################################

--Error ER_GLOBAL_VARIABLE
SET rpl_send_buffer_size = 20 * 1024;
SELECT @@rpl_send_buffer_size;
--Error ER_PARSE_ERROR
SET local.rpl_send_buffer_size = 20 * 1024;
--Error ER_UNKNOWN_TABLE
SELECT local.rpl_send_buffer_size;
--Error ER_PARSE_ERROR
SET global.rpl_send_buffer_size = 30 * 1024;
--Error ER_UNKNOWN_TABLE
SELECT global.rpl_send_buffer_size;
--Error ER_BAD_FIELD_ERROR
SELECT rpl_send_buffer_size = @@session.rpl_send_buffer_size;


##############################
# Restore initial value #
##############################

SET @@global.rpl_send_buffer_size = @start_rpl_send_buffer_size;
SELECT @@global.rpl_send_buffer_size;


######################################################################
# END OF rpl_send_buffer_size TESTS #
######################################################################
16 changes: 16 additions & 0 deletions sql/rpl_binlog_sender.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@

#include "sql/rpl_binlog_sender.h"

#include <errno.h>
#include <stdio.h>
#include <sys/socket.h>
#include <algorithm>
#include <atomic>
#include <memory>
Expand Down Expand Up @@ -229,6 +231,8 @@ class Binlog_sender::Event_allocator {
Binlog_sender *m_sender = nullptr;
};

uint rpl_send_buffer_size = 0;

Binlog_sender::Binlog_sender(THD *thd, const char *start_file,
my_off_t start_pos, Gtid_set *exclude_gtids,
uint32 flag)
Expand Down Expand Up @@ -312,6 +316,18 @@ void Binlog_sender::init() {
}
m_transmit_started = true;

NET *net = thd->get_protocol_classic()->get_net();
if (rpl_send_buffer_size &&
(setsockopt(net->vio->mysql_socket.fd, SOL_SOCKET, SO_SNDBUF,
&rpl_send_buffer_size, sizeof(rpl_send_buffer_size)) == -1
#ifdef UNIV_LINUX
|| setsockopt(net->vio->mysql_socket.fd, IPPROTO_TCP, TCP_WINDOW_CLAMP,
&rpl_send_buffer_size, sizeof(rpl_send_buffer_size)) == -1
#endif
))
sql_print_warning("Failed to set SO_SNDBUF with (error: %s).",
strerror(errno));

init_checksum_alg();
/*
There are two ways to tell the server to not block:
Expand Down
2 changes: 2 additions & 0 deletions sql/rpl_binlog_sender.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@
class String;
class THD;

extern uint rpl_send_buffer_size;

/**
The major logic of dump thread is implemented in this class. It sends
required binlog events to clients according to their requests.
Expand Down
8 changes: 8 additions & 0 deletions sql/sys_vars.cc
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@
#include "sql/protocol_classic.h"
#include "sql/psi_memory_key.h"
#include "sql/query_options.h"
#include "sql/rpl_binlog_sender.h"
#include "sql/rpl_group_replication.h" // is_group_replication_running
#include "sql/rpl_handler.h" // delegates_update_lock_type
#include "sql/rpl_info_factory.h" // Rpl_info_factory
Expand Down Expand Up @@ -5796,6 +5797,13 @@ static Sys_var_ulong Sys_rpl_read_size(
VALID_RANGE(IO_SIZE * 2, ULONG_MAX), DEFAULT(IO_SIZE * 2),
BLOCK_SIZE(IO_SIZE));

static Sys_var_uint Sys_rpl_send_buffer_size(
"rpl_send_buffer_size",
"The size of output buffer for the socket used during sending "
"events to a slave.",
GLOBAL_VAR(rpl_send_buffer_size), CMD_LINE(REQUIRED_ARG),
VALID_RANGE(1024, UINT_MAX), DEFAULT(2 * 1024 * 1024), BLOCK_SIZE(1024));

static Sys_var_bool Sys_slave_allow_batching(
"slave_allow_batching", "Allow slave to batch requests",
GLOBAL_VAR(opt_slave_allow_batching), CMD_LINE(OPT_ARG), DEFAULT(false));
Expand Down

0 comments on commit 6d27683

Please sign in to comment.