• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

UltraMonkey-L7 V3(multi-thread implementation)


Commit MetaInfo

Revisión0faa6cc26a90d358901d46ec6785d7ca9b3f6d07 (tree)
Tiempo2015-10-08 17:15:04
AutorMichiro Hibari <l05102@shib...>
CommiterMichiro Hibari

Log Message

socketoptionにkeepaliveを指定できるようにした。

l7directord.cf の virtualセクションで
socketoptionにkeepaliveを指定できるようになっています。

(l7directord.cf 設定例)
:
snip
:
virtual = XXX.XXX.XXX.XXX:YY

socketoption = keepalive

:
snip
:

tcp_keepaliveのtimeoutやprobe間隔については
OSの設定をそのまま使っているので、
変更が必要な場合は/etc/sysctl.confに
設定を加えてください。

(sysctl.conf 設定例)
:
snip
:
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 5
net.ipv4.tcp_keepalive_probes = 5

Cambiar Resumen

Diferencia incremental

--- a/l7directord/l7directord
+++ b/l7directord/l7directord
@@ -987,10 +987,10 @@ sub validate_config {
987987 config_error($line, 'ERR0124', $config);
988988 }
989989 my @option_value = split /,/, $value;
990- # OPTION:transparent,deferaccept,nodelay,cork,quickackon|quickackoff
990+ # OPTION:transparent,deferaccept,nodelay,cork,keepalive,quickackon|quickackoff
991991 for my $option (@option_value) {
992992 $option =~ s/ //g;
993- if($option !~ /^transparent|deferaccept|nodelay|cork|quickackon|quickackoff$/) {
993+ if($option !~ /^transparent|deferaccept|nodelay|cork|keepalive|quickackon|quickackoff$/) {
994994 config_error($line, 'ERR0124', $config);
995995 }
996996 }
@@ -4953,6 +4953,10 @@ Set TCP_NODELAY option to the Client and RealServer socket.
49534953
49544954 Set TCP_CORK option to the Client and RealServer socket.
49554955
4956+=item B<keepalive>
4957+
4958+Set SO_KEEPALIVE option to the Client and RealServer socket.
4959+
49564960 =item B<quickackon> or B<quickackoff>
49574961
49584962 Set or unset TCP_QUICKACK option to the Client and RealServer socket.
--- a/l7vsd/include/tcp_socket.h
+++ b/l7vsd/include/tcp_socket.h
@@ -76,6 +76,17 @@ public:
7676 Logger::putLogError(LOG_CAT_L7VSD_SESSION, 101, fmt.str(), __FILE__, __LINE__);
7777 }
7878 }
79+ // set TCP_KEEPALIVE option
80+ if (opt_info.keepalive_opt) {
81+ int val = opt_info.keepalive_val;
82+ int err = ::setsockopt(my_socket->native(), SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(int));
83+ if (unlikely(err)) {
84+ error_code = boost::system::error_code(errno, boost::asio::error::get_system_category());
85+ boost::format fmt("Thread ID[%d] socket option(SO_KEEPALIVE) set failed");
86+ fmt % boost::this_thread::get_id();
87+ Logger::putLogError(LOG_CAT_L7VSD_SESSION, 102, fmt.str(), __FILE__, __LINE__);
88+ }
89+ }
7990 }
8091
8192 // connect
--- a/l7vsd/include/tcp_socket_option.h
+++ b/l7vsd/include/tcp_socket_option.h
@@ -42,6 +42,10 @@ struct tcp_socket_option_info {
4242 bool cork_opt;
4343 //! TCP_CORK option value (false:off,true:on)
4444 bool cork_val;
45+ //! TCP_KEEPALIVE (false:not set,true:set option)
46+ bool keepalive_opt;
47+ //! TCP_KEEPALIVE option value (false:off,true:on)
48+ bool keepalive_val;
4549 //! TCP_QUICKACK (false:not set,true:set option)
4650 bool quickack_opt;
4751 //! TCP_QUICKACK option value (false:off,true:on)
--- a/l7vsd/include/tcp_ssl_socket.h
+++ b/l7vsd/include/tcp_ssl_socket.h
@@ -100,6 +100,17 @@ public:
100100 Logger::putLogError(LOG_CAT_L7VSD_SESSION, 101, fmt.str(), __FILE__, __LINE__);
101101 }
102102 }
103+ // set TCP_KEEPALIVE
104+ if (opt_info.keepalive_opt) {
105+ int val = opt_info.keepalive_val;
106+ int err = ::setsockopt(my_socket->lowest_layer().native(), SOL_SOCKET, SO_KEEPALIVE, &val, sizeof(int));
107+ if (unlikely(err)) {
108+ error_code = boost::system::error_code(errno, boost::asio::error::get_system_category());
109+ boost::format fmt("Thread ID[%d] socket option(SO_KEEPALIVE) set failed");
110+ fmt % boost::this_thread::get_id();
111+ Logger::putLogError(LOG_CAT_L7VSD_SESSION, 102, fmt.str(), __FILE__, __LINE__);
112+ }
113+ }
103114 }
104115
105116 // close
--- a/l7vsd/include/virtualservice_element.h
+++ b/l7vsd/include/virtualservice_element.h
@@ -83,6 +83,7 @@ public:
8383 int socket_option_tcp_defer_accept;
8484 int socket_option_tcp_nodelay;
8585 int socket_option_tcp_cork;
86+ int socket_option_tcp_keepalive;
8687 int socket_option_tcp_quickack;
8788 std::string socket_option_string;
8889
@@ -105,6 +106,7 @@ public:
105106 socket_option_tcp_defer_accept(0),
106107 socket_option_tcp_nodelay(0),
107108 socket_option_tcp_cork(0),
109+ socket_option_tcp_keepalive(0),
108110 socket_option_tcp_quickack(0),
109111 http_total_count(0ULL),
110112 http_get_count(0ULL),
@@ -134,6 +136,7 @@ public:
134136 socket_option_tcp_defer_accept(in.socket_option_tcp_defer_accept),
135137 socket_option_tcp_nodelay(in.socket_option_tcp_nodelay),
136138 socket_option_tcp_cork(in.socket_option_tcp_cork),
139+ socket_option_tcp_keepalive(in.socket_option_tcp_keepalive),
137140 socket_option_tcp_quickack(in.socket_option_tcp_quickack),
138141 socket_option_string(in.socket_option_string),
139142 http_total_count(in.http_total_count),
@@ -177,6 +180,7 @@ public:
177180 socket_option_tcp_defer_accept = in.socket_option_tcp_defer_accept;
178181 socket_option_tcp_nodelay = in.socket_option_tcp_nodelay;
179182 socket_option_tcp_cork = in.socket_option_tcp_cork;
183+ socket_option_tcp_keepalive = in.socket_option_tcp_keepalive;
180184 socket_option_tcp_quickack = in.socket_option_tcp_quickack;
181185 socket_option_string = in.socket_option_string;
182186 http_total_count = in.http_total_count;
@@ -219,6 +223,7 @@ public:
219223 elem1.socket_option_tcp_defer_accept == elem2.socket_option_tcp_defer_accept &&
220224 elem1.socket_option_tcp_nodelay == elem2.socket_option_tcp_nodelay &&
221225 elem1.socket_option_tcp_cork == elem2.socket_option_tcp_cork &&
226+ elem1.socket_option_tcp_keepalive == elem2.socket_option_tcp_keepalive &&
222227 elem1.socket_option_tcp_quickack == elem2.socket_option_tcp_quickack &&
223228 elem1.socket_option_string == elem2.socket_option_string &&
224229 elem1.http_total_count == elem2.http_total_count &&
@@ -280,6 +285,7 @@ public:
280285 elem1.socket_option_tcp_defer_accept == elem2.socket_option_tcp_defer_accept &&
281286 elem1.socket_option_tcp_nodelay == elem2.socket_option_tcp_nodelay &&
282287 elem1.socket_option_tcp_cork == elem2.socket_option_tcp_cork &&
288+ elem1.socket_option_tcp_keepalive == elem2.socket_option_tcp_keepalive &&
283289 elem1.socket_option_tcp_quickack == elem2.socket_option_tcp_quickack &&
284290 elem1.socket_option_string == elem2.socket_option_string &&
285291 elem1.http_total_count == elem2.http_total_count &&
@@ -385,6 +391,7 @@ public:
385391 "socket_option_tcp_defer_accept=%d, "
386392 "socket_option_tcp_nodelay=%d, "
387393 "socket_option_tcp_cork=%d, "
394+ "socket_option_tcp_keepalive=%d, "
388395 "socket_option_tcp_quickack=%d, "
389396 "socket_option_string=%s; "
390397 "http_total_count=%d; "
@@ -410,6 +417,7 @@ public:
410417 % elem.socket_option_tcp_defer_accept
411418 % elem.socket_option_tcp_nodelay
412419 % elem.socket_option_tcp_cork
420+ % elem.socket_option_tcp_keepalive
413421 % elem.socket_option_tcp_quickack
414422 % elem.socket_option_string
415423 % elem.http_total_count
@@ -459,6 +467,7 @@ private:
459467 ar &socket_option_tcp_defer_accept;
460468 ar &socket_option_tcp_nodelay;
461469 ar &socket_option_tcp_cork;
470+ ar &socket_option_tcp_keepalive;
462471 ar &socket_option_tcp_quickack;
463472 ar &socket_option_string;
464473 ar &http_total_count;
--- a/l7vsd/src/l7vsadm.cpp
+++ b/l7vsd/src/l7vsadm.cpp
@@ -1111,11 +1111,13 @@ bool l7vs::l7vsadm::parse_opt_vs_socket_func(int &pos, int argc, char *argv[])
11111111 bool is_set_defer_accept = false;
11121112 bool is_set_nodelay = false;
11131113 bool is_set_cork = false;
1114+ bool is_set_keepalive = false;
11141115 bool is_set_quickack = false;
11151116
11161117 request.vs_element.socket_option_tcp_defer_accept = 0;
11171118 request.vs_element.socket_option_tcp_nodelay = 0;
11181119 request.vs_element.socket_option_tcp_cork = 0;
1120+ request.vs_element.socket_option_tcp_keepalive = 0;
11191121 request.vs_element.socket_option_tcp_quickack = 0;
11201122
11211123 std::string socket_option_string = argv[pos];
@@ -1159,6 +1161,18 @@ bool l7vs::l7vsadm::parse_opt_vs_socket_func(int &pos, int argc, char *argv[])
11591161 Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 105, buf.str(), __FILE__, __LINE__);
11601162 return false;
11611163 }
1164+ } else if (option == "keepalive") {
1165+ if (!is_set_keepalive) {
1166+ is_set_keepalive = true;
1167+ request.vs_element.socket_option_tcp_keepalive = 1;
1168+ } else {
1169+ // keepalive is duplicated
1170+ std::stringstream buf;
1171+ buf << "socket option keepalive is duplicated.(--sockopt)";
1172+ l7vsadm_err.setter(true, buf.str());
1173+ Logger::putLogError(LOG_CAT_L7VSADM_PARSE, 108, buf.str(), __FILE__, __LINE__);
1174+ return false;
1175+ }
11621176 } else if (option == "quickackon" || option == "quickackoff") {
11631177 if (!is_set_quickack) {
11641178 is_set_quickack = true;
@@ -2288,7 +2302,7 @@ bool l7vs::l7vsadm::parse_help_func(l7vs::l7vsadm_request::COMMAND_CODE_TAG cmd,
22882302 " --qos-up -Q QoSval-up QoS Threshold(bps) set to real server direction\n"
22892303 " --qos-down -q QoSval-down QoS Threshold(bps) set to client direction\n"
22902304 " --ssl -z ssl-config-file SSL configuration file(Use SSL)\n"
2291- " --sockopt -O socket-option deferaccept,nodelay,cork,quickackon or quickackoff set to socket option\n"
2305+ " --sockopt -O socket-option deferaccept,nodelay,cork,keepalive,quickackon or quickackoff set to socket option\n"
22922306 " --access-log -L access-log-flag access log flag 0(none) or 1(output)\n"
22932307 " --access-log-name -a access-log-file access log file\n"
22942308 " [logrotate-args]\n"
@@ -2621,10 +2635,12 @@ void l7vs::l7vsadm::disp_list_verbose()
26212635 " TCP_DEFER_ACCEPT %s\n"
26222636 " TCP_NODELAY %s\n"
26232637 " TCP_CORK %s\n"
2638+ " TCP_KEEPALIVE %s\n"
26242639 " TCP_QUICKACK %s\n")
26252640 % ((0 == vse.socket_option_tcp_defer_accept) ? "disable" : "enable")
26262641 % ((0 == vse.socket_option_tcp_nodelay) ? "disable" : "enable")
26272642 % ((0 == vse.socket_option_tcp_cork) ? "disable" : "enable")
2643+ % ((0 == vse.socket_option_tcp_keepalive) ? "disable" : "enable")
26282644 % ((0 == vse.socket_option_tcp_quickack) ? "auto" : ((1 == vse.socket_option_tcp_quickack) ? "enable" : "disable"));
26292645
26302646
--- a/l7vsd/src/virtualservice_tcp.cpp
+++ b/l7vsd/src/virtualservice_tcp.cpp
@@ -1861,6 +1861,10 @@ void l7vs::virtualservice_tcp::set_socket_option()
18611861 set_sock_opt.cork_opt = false;
18621862 //! TCP_CORK option value (false:off,true:on)
18631863 set_sock_opt.cork_val = false;
1864+ //! TCP_KEEPALIVE (false:not set,true:set option)
1865+ set_sock_opt.keepalive_opt = false;
1866+ //! TCP_KEEPALIVE option value (false:off,true:on)
1867+ set_sock_opt.keepalive_val = false;
18641868 //! TCP_QUICKACK (false:not set,true:set option)
18651869 set_sock_opt.quickack_opt = false;
18661870 //! TCP_QUICKACK option value (false:off,true:on)
@@ -1888,6 +1892,13 @@ void l7vs::virtualservice_tcp::set_socket_option()
18881892 }
18891893 }
18901894
1895+ if (element.socket_option_tcp_keepalive != 0) {
1896+ set_sock_opt.keepalive_opt = true;
1897+ if (element.socket_option_tcp_keepalive == 1) {
1898+ set_sock_opt.keepalive_val = true;
1899+ }
1900+ }
1901+
18911902 if (element.socket_option_tcp_quickack != 0) {
18921903 set_sock_opt.quickack_opt = true;
18931904 if (element.socket_option_tcp_quickack == 1) {
@@ -1904,6 +1915,8 @@ void l7vs::virtualservice_tcp::set_socket_option()
19041915 " nodelay_val[%s]"
19051916 " cork_opt[%s]"
19061917 " cork_val[%s]"
1918+ " keepalive_opt[%s]"
1919+ " keepalive_val[%s]"
19071920 " quickack_opt[%s]"
19081921 " quickack_val[%s]");
19091922 formatter
@@ -1913,6 +1926,8 @@ void l7vs::virtualservice_tcp::set_socket_option()
19131926 % (set_sock_opt.nodelay_val ? "true" : "false")
19141927 % (set_sock_opt.cork_opt ? "true" : "false")
19151928 % (set_sock_opt.cork_val ? "true" : "false")
1929+ % (set_sock_opt.keepalive_opt ? "true" : "false")
1930+ % (set_sock_opt.keepalive_val ? "true" : "false")
19161931 % (set_sock_opt.quickack_opt ? "true" : "false")
19171932 % (set_sock_opt.quickack_val ? "true" : "false");
19181933 Logger::putLogDebug(LOG_CAT_L7VSD_VIRTUALSERVICE, 97, formatter.str(), __FILE__, __LINE__);