Commit e0a00c5a authored by Vladislav Vaintroub's avatar Vladislav Vaintroub

MDEV-14412 Support TCP keepalive options

Based on pull request by Oleg Obleukhov
https://github.com/MariaDB/server/pull/400
parent faee08c1
......@@ -51,6 +51,14 @@ enum enum_vio_io_event
VIO_IO_EVENT_CONNECT
};
struct vio_keepalive_opts
{
int interval;
int idle;
int probes;
};
#define VIO_LOCALHOST 1U /* a localhost connection */
#define VIO_BUFFERED_READ 2U /* use buffered read */
#define VIO_READ_BUFFER_SIZE 16384U /* size of read buffer */
......@@ -84,6 +92,7 @@ my_bool vio_is_blocking(Vio *vio);
int vio_fastsend(Vio *vio);
/* setsockopt SO_KEEPALIVE at SOL_SOCKET level, when possible */
int vio_keepalive(Vio *vio, my_bool onoff);
int vio_set_keepalive_options(Vio * vio, const struct vio_keepalive_opts *opts);
/* Whenever we should retry the last read/write operation. */
my_bool vio_should_retry(Vio *vio);
/* Check that operation was timed out */
......@@ -214,7 +223,6 @@ enum SSL_type
SSL_TYPE_SPECIFIED
};
/* HFTODO - hide this if we don't want client in embedded server */
/* This structure is for every connection on both sides */
struct st_vio
......
--- a/mysql-test/r/mysqld--help.result
+++ b/mysql-test/r/mysqld--help.result
@@ -334,7 +334,6 @@
@@ -381,7 +381,6 @@
The number of segments in a key cache
-L, --language=name Client error messages in given language. May be given as
a full path. Deprecated. Use --lc-messages-dir instead.
......@@ -8,7 +8,7 @@
--lc-messages=name Set the language used for the error messages.
-L, --lc-messages-dir=name
Directory where error messages are
@@ -543,6 +542,7 @@
@@ -602,6 +601,7 @@
Use MySQL-5.6 (instead of MariaDB-5.3) format for TIME,
DATETIME, TIMESTAMP columns.
(Defaults to on; use --skip-mysql56-temporal-format to disable.)
......@@ -16,7 +16,7 @@
--net-buffer-length=#
Buffer length for TCP/IP and socket communication
--net-read-timeout=#
@@ -957,6 +957,9 @@
@@ -1020,6 +1020,9 @@
characteristics (isolation level, read only/read
write,snapshot - but not any work done / data modified
within the transaction).
......@@ -26,7 +26,7 @@
--show-slave-auth-info
Show user and password in SHOW SLAVE HOSTS on this
master.
@@ -1069,6 +1072,10 @@
@@ -1132,6 +1135,10 @@
Log slow queries to given log file. Defaults logging to
'hostname'-slow.log. Must be enabled to activate other
slow log options
......@@ -37,15 +37,15 @@
--socket=name Socket file to use for connection
--sort-buffer-size=#
Each thread that needs to do a sort allocates a buffer of
@@ -1087,6 +1094,7 @@
NO_ENGINE_SUBSTITUTION, PAD_CHAR_TO_FULL_LENGTH
@@ -1151,6 +1158,7 @@
EMPTY_STRING_IS_NULL
--stack-trace Print a symbolic stack trace on failure
(Defaults to on; use --skip-stack-trace to disable.)
+ --standalone Dummy option to start as a standalone program (NT).
--standard-compliant-cte
Allow only CTEs compliant to SQL standard
(Defaults to on; use --skip-standard-compliant-cte to disable.)
@@ -1134,6 +1142,11 @@
@@ -1214,6 +1222,11 @@
--thread-pool-max-threads=#
Maximum allowed number of worker threads in the thread
pool
......@@ -57,7 +57,7 @@
--thread-pool-oversubscribe=#
How many additional active worker threads in a group are
allowed.
@@ -1172,8 +1185,8 @@
@@ -1252,8 +1265,8 @@
automatically convert it to an on-disk MyISAM or Aria
table.
-t, --tmpdir=name Path for temporary files. Several paths may be specified,
......@@ -68,7 +68,7 @@
--transaction-alloc-block-size=#
Allocation block size for transactions to be stored in
binary log
@@ -1298,7 +1311,6 @@
@@ -1387,7 +1400,6 @@
key-cache-division-limit 100
key-cache-file-hash-size 512
key-cache-segments 0
......@@ -76,7 +76,7 @@
lc-messages en_US
lc-messages-dir MYSQL_SHAREDIR/
lc-time-names en_US
@@ -1368,6 +1380,7 @@
@@ -1459,6 +1471,7 @@
myisam-stats-method NULLS_UNEQUAL
myisam-use-mmap FALSE
mysql56-temporal-format TRUE
......@@ -84,16 +84,16 @@
net-buffer-length 16384
net-read-timeout 30
net-retry-count 10
@@ -1469,6 +1482,8 @@
@@ -1561,6 +1574,8 @@
session-track-state-change FALSE
session-track-system-variables
session-track-system-variables autocommit,character_set_client,character_set_connection,character_set_results,time_zone
session-track-transaction-info OFF
+shared-memory FALSE
+shared-memory-base-name MYSQL
show-slave-auth-info FALSE
silent-startup FALSE
skip-grant-tables TRUE
@@ -1493,6 +1508,7 @@
@@ -1585,6 +1600,7 @@
slave-type-conversions
slow-launch-time 2
slow-query-log FALSE
......@@ -101,7 +101,7 @@
sort-buffer-size 2097152
sql-mode STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
stack-trace TRUE
@@ -1506,14 +1522,16 @@
@@ -1598,9 +1614,9 @@
sync-relay-log 10000
sync-relay-log-info 10000
sysdate-is-now FALSE
......@@ -112,6 +112,8 @@
+table-open-cache 2000
table-open-cache-instances 8
tc-heuristic-recover OFF
tcp-keepalive-interval 0
@@ -1609,6 +1625,8 @@
thread-cache-size 151
thread-pool-idle-timeout 60
thread-pool-max-threads 65536
......
......@@ -1195,6 +1195,21 @@ The following options may be given as the first argument:
--tc-heuristic-recover=name
Decision to use in heuristic recover process. One of: OFF,
COMMIT, ROLLBACK
--tcp-keepalive-interval=#
The interval, in seconds, between when successive
keep-alive packets are sent if no acknowledgement is
received.If set to 0, system dependent default is used.
(Automatically configured unless set explicitly)
--tcp-keepalive-probes=#
The number of unacknowledged probes to send before
considering the connection dead and notifying the
application layer.If set to 0, system dependent default
is used. (Automatically configured unless set explicitly)
--tcp-keepalive-time=#
Timeout, in milliseconds, with no activity until the
first TCP keep-alive packet is sent.If set to 0, system
dependent default is used. (Automatically configured
unless set explicitly)
--thread-cache-size=#
How many threads we should keep in a cache for reuse.
These are freed after 5 minutes of idle time
......@@ -1594,6 +1609,9 @@ table-definition-cache 400
table-open-cache 431
table-open-cache-instances 8
tc-heuristic-recover OFF
tcp-keepalive-interval 0
tcp-keepalive-probes 0
tcp-keepalive-time 0
thread-cache-size 151
thread-pool-idle-timeout 60
thread-pool-max-threads 65536
......
......@@ -220,6 +220,20 @@ NUMERIC_BLOCK_SIZE NULL
ENUM_VALUE_LIST OFF,ON
READ_ONLY NO
COMMAND_LINE_ARGUMENT OPTIONAL
VARIABLE_NAME BINLOG_FILE_CACHE_SIZE
SESSION_VALUE NULL
GLOBAL_VALUE 16384
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 16384
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE BIGINT UNSIGNED
VARIABLE_COMMENT The size of file cache for the binary log
NUMERIC_MIN_VALUE 8192
NUMERIC_MAX_VALUE 18446744073709551615
NUMERIC_BLOCK_SIZE 4096
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME BINLOG_FORMAT
SESSION_VALUE MIXED
GLOBAL_VALUE MIXED
......@@ -4112,6 +4126,48 @@ NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME TCP_KEEPALIVE_INTERVAL
SESSION_VALUE NULL
GLOBAL_VALUE 0
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE INT
VARIABLE_COMMENT The interval, in seconds, between when successive keep-alive packets are sent if no acknowledgement is received.If set to 0, system dependent default is used.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 2147483
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME TCP_KEEPALIVE_PROBES
SESSION_VALUE NULL
GLOBAL_VALUE 0
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE INT
VARIABLE_COMMENT The number of unacknowledged probes to send before considering the connection dead and notifying the application layer.If set to 0, system dependent default is used.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 2147483
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME TCP_KEEPALIVE_TIME
SESSION_VALUE NULL
GLOBAL_VALUE 0
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE INT
VARIABLE_COMMENT Timeout, in milliseconds, with no activity until the first TCP keep-alive packet is sent.If set to 0, system dependent default is used.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 2147483
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME THREAD_CACHE_SIZE
SESSION_VALUE NULL
GLOBAL_VALUE 151
......
......@@ -4924,6 +4924,48 @@ NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY YES
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME TCP_KEEPALIVE_INTERVAL
SESSION_VALUE NULL
GLOBAL_VALUE 0
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE INT
VARIABLE_COMMENT The interval, in seconds, between when successive keep-alive packets are sent if no acknowledgement is received.If set to 0, system dependent default is used.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 2147483
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME TCP_KEEPALIVE_PROBES
SESSION_VALUE NULL
GLOBAL_VALUE 0
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE INT
VARIABLE_COMMENT The number of unacknowledged probes to send before considering the connection dead and notifying the application layer.If set to 0, system dependent default is used.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 2147483
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME TCP_KEEPALIVE_TIME
SESSION_VALUE NULL
GLOBAL_VALUE 0
GLOBAL_VALUE_ORIGIN COMPILE-TIME
DEFAULT_VALUE 0
VARIABLE_SCOPE GLOBAL
VARIABLE_TYPE INT
VARIABLE_COMMENT Timeout, in milliseconds, with no activity until the first TCP keep-alive packet is sent.If set to 0, system dependent default is used.
NUMERIC_MIN_VALUE 0
NUMERIC_MAX_VALUE 2147483
NUMERIC_BLOCK_SIZE 1
ENUM_VALUE_LIST NULL
READ_ONLY NO
COMMAND_LINE_ARGUMENT REQUIRED
VARIABLE_NAME THREAD_CACHE_SIZE
SESSION_VALUE NULL
GLOBAL_VALUE 151
......
set global tcp_keepalive_time = 1;
set global tcp_keepalive_interval =1;
set global tcp_keepalive_probes=1;
connect con1,"127.0.0.1",root,,test,$MASTER_MYPORT,;
disconnect con1;
connection default;
set global tcp_keepalive_time= default;
set global tcp_keepalive_interval= default;
set global tcp_keepalive_probes=default;
--source include/not_embedded.inc
# A smoke test for TCP keepalive options
set global tcp_keepalive_time = 1;
set global tcp_keepalive_interval =1;
set global tcp_keepalive_probes=1;
connect(con1,"127.0.0.1",root,,test,$MASTER_MYPORT,);
disconnect con1;
connection default;
set global tcp_keepalive_time= default;
set global tcp_keepalive_interval= default;
set global tcp_keepalive_probes=default;
......@@ -45,6 +45,7 @@ HASH global_index_stats;
extern mysql_mutex_t LOCK_global_user_client_stats;
extern mysql_mutex_t LOCK_global_table_stats;
extern mysql_mutex_t LOCK_global_index_stats;
extern vio_keepalive_opts opt_vio_keepalive;
/*
Get structure for logging connection data for the current user
......@@ -1064,7 +1065,8 @@ static int check_connection(THD *thd)
bzero((char*) &net->vio->remote, sizeof(net->vio->remote));
}
vio_keepalive(net->vio, TRUE);
vio_set_keepalive_options(net->vio, &opt_vio_keepalive);
if (thd->packet.alloc(thd->variables.net_buffer_length))
{
/*
......
......@@ -5311,6 +5311,38 @@ static Sys_var_ulong Sys_host_cache_size(
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(NULL),
ON_UPDATE(fix_host_cache_size));
vio_keepalive_opts opt_vio_keepalive;
static Sys_var_int Sys_keepalive_time(
"tcp_keepalive_time",
"Timeout, in milliseconds, with no activity until the first TCP keep-alive packet is sent."
"If set to 0, system dependent default is used.",
AUTO_SET GLOBAL_VAR(opt_vio_keepalive.idle),
CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, INT_MAX32/1000),
DEFAULT(0),
BLOCK_SIZE(1),
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(NULL));
static Sys_var_int Sys_keepalive_interval(
"tcp_keepalive_interval",
"The interval, in seconds, between when successive keep-alive packets are sent if no acknowledgement is received."
"If set to 0, system dependent default is used.",
AUTO_SET GLOBAL_VAR(opt_vio_keepalive.interval),
CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, INT_MAX32/1000),
DEFAULT(0),
BLOCK_SIZE(1),
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(NULL));
static Sys_var_int Sys_keepalive_probes(
"tcp_keepalive_probes",
"The number of unacknowledged probes to send before considering the connection dead and notifying the application layer."
"If set to 0, system dependent default is used.",
AUTO_SET GLOBAL_VAR(opt_vio_keepalive.probes),
CMD_LINE(REQUIRED_ARG), VALID_RANGE(0, INT_MAX32/1000),
DEFAULT(0),
BLOCK_SIZE(1),
NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(NULL));
static Sys_var_charptr Sys_ignore_db_dirs(
"ignore_db_dirs",
"Specifies a directory to add to the ignore list when collecting "
......
......@@ -28,6 +28,7 @@
#ifdef __WIN__
#include <winsock2.h>
#include <MSWSock.h>
#include <mstcpip.h>
#pragma comment(lib, "ws2_32.lib")
#endif
#include "my_context.h"
......@@ -522,6 +523,63 @@ int vio_keepalive(Vio* vio, my_bool set_keep_alive)
DBUG_RETURN(r);
}
/*
Set socket options for keepalive e.g., TCP_KEEPCNT, TCP_KEEPIDLE/TCP_KEEPALIVE, TCP_KEEPINTVL
*/
int vio_set_keepalive_options(Vio* vio, const struct vio_keepalive_opts *opts)
{
#if defined _WIN32
struct tcp_keepalive s;
DWORD nbytes;
if (vio->type == VIO_TYPE_NAMEDPIPE || vio->type == VIO_TYPE_SHARED_MEMORY)
return 0;
if (!opts->idle && !opts->interval)
return 0;
s.onoff= 1;
s.keepalivetime= opts->idle? opts->idle * 1000 : 7200;
s.keepaliveinterval= opts->interval?opts->interval * 1000 : 1;
return WSAIoctl(vio->mysql_socket.fd, SIO_KEEPALIVE_VALS, (LPVOID) &s, sizeof(s),
NULL, 0, &nbytes, NULL, NULL);
#elif defined (TCP_KEEPIDLE) || defined (TCP_KEEPALIVE)
int ret= 0;
if (opts->idle)
{
#ifdef TCP_KEEPIDLE // Linux only
ret= mysql_socket_setsockopt(vio->mysql_socket, IPPROTO_TCP, TCP_KEEPIDLE, (char *)&opts->idle, sizeof(opts->idle));
#elif defined (TCP_KEEPALIVE)
ret= mysql_socket_setsockopt(vio->mysql_socket, IPPROTO_TCP, TCP_KEEPALIVE, (char *)&opts->idle, sizeof(opts->idle));
#endif
if(ret)
return ret;
}
#ifdef TCP_KEEPCNT // Linux only
if(opts->probes)
{
ret= mysql_socket_setsockopt(vio->mysql_socket, IPPROTO_TCP, TCP_KEEPCNT, (char *)&opts->probes, sizeof(opts->probes));
if(ret)
return ret;
}
#endif
#ifdef TCP_KEEPINTVL // Linux only
if(opts->interval)
{
ret= mysql_socket_setsockopt(vio->mysql_socket, IPPROTO_TCP, TCP_KEEPINTVL, (char *)&opts->interval, sizeof(opts->interval));
}
#endif
return ret;
#else /*TCP_KEEPIDLE || TCP_KEEPALIVE */
return -1;
#endif
}
/**
Indicate whether a I/O operation must be retried later.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment