This is an automated email from the ASF dual-hosted git repository. rrm pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push: new b53e745 Adds support for TCP_NOTSENT_LOWAT sockopt (#8354) b53e745 is described below commit b53e74581b9fc7517280451c3d5e9799f2e7d9fa Author: Randall Meyer <r...@apache.org> AuthorDate: Mon Oct 4 16:43:56 2021 -0700 Adds support for TCP_NOTSENT_LOWAT sockopt (#8354) --- doc/admin-guide/files/records.config.en.rst | 7 +++++++ doc/admin-guide/plugins/lua.en.rst | 1 + .../api/functions/TSHttpOverridableConfig.en.rst | 1 + .../api/types/TSOverridableConfigKey.en.rst | 1 + include/ts/apidefs.h.in | 1 + iocore/net/I_NetProcessor.h | 1 + iocore/net/I_NetVConnection.h | 5 ++++- iocore/net/P_UnixNetVConnection.h | 22 ++++++++++++---------- iocore/net/UnixConnection.cc | 7 +++++++ iocore/net/UnixNetAccept.cc | 14 ++++++++------ iocore/net/UnixNetProcessor.cc | 1 + mgmt/RecordsConfig.cc | 2 ++ plugins/lua/ts_lua_http_config.c | 2 ++ proxy/http/HttpConfig.cc | 2 ++ proxy/http/HttpConfig.h | 1 + proxy/http/HttpProxyServerMain.cc | 4 ++++ proxy/http/HttpSM.cc | 12 +++++++----- proxy/shared/UglyLogStubs.cc | 1 + src/shared/overridable_txn_vars.cc | 3 ++- src/traffic_server/InkAPI.cc | 3 +++ src/traffic_server/InkAPITest.cc | 3 ++- 21 files changed, 70 insertions(+), 24 deletions(-) diff --git a/doc/admin-guide/files/records.config.en.rst b/doc/admin-guide/files/records.config.en.rst index 03e9e29..7a226a5 100644 --- a/doc/admin-guide/files/records.config.en.rst +++ b/doc/admin-guide/files/records.config.en.rst @@ -4581,6 +4581,7 @@ Sockets TCP_FASTOPEN (8) PACKET_MARK (16) PACKET_TOS (32) + TCP_NOTSENT_LOWAT (64) .. note:: @@ -4615,6 +4616,7 @@ Sockets TCP_FASTOPEN (8) PACKET_MARK (16) PACKET_TOS (32) + TCP_NOTSENT_LOWAT (64) .. note:: @@ -4666,6 +4668,11 @@ Sockets .. seealso:: `Traffic Shaping`_ +.. ts:cv:: CONFIG proxy.config.net.sock_notsent_lowat INT 16384 + :overridable: + + Set socket option TCP_NOTSENT_LOWAT to specified value for a connection + .. ts:cv:: CONFIG proxy.config.net.poll_timeout INT 10 (or 30 on Solaris) Same as the command line option ``--poll_timeout``, or ``-t``, which diff --git a/doc/admin-guide/plugins/lua.en.rst b/doc/admin-guide/plugins/lua.en.rst index 6c598da..62c280b 100644 --- a/doc/admin-guide/plugins/lua.en.rst +++ b/doc/admin-guide/plugins/lua.en.rst @@ -4007,6 +4007,7 @@ Http config constants TS_LUA_CONFIG_HTTP_HOST_RESOLUTION_PREFERENCE TS_LUA_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_INDEX TS_LUA_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK + TS_LUA_CONFIG_NET_SOCK_NOTSENT_LOWAT TS_LUA_CONFIG_LAST_ENTRY :ref:`TOP <admin-plugins-ts-lua>` diff --git a/doc/developer-guide/api/functions/TSHttpOverridableConfig.en.rst b/doc/developer-guide/api/functions/TSHttpOverridableConfig.en.rst index 8ad3ae5..d6bc066 100644 --- a/doc/developer-guide/api/functions/TSHttpOverridableConfig.en.rst +++ b/doc/developer-guide/api/functions/TSHttpOverridableConfig.en.rst @@ -187,6 +187,7 @@ TSOverridableConfigKey Value Config :c:enumerator:`TS_CONFIG_HTTP_HOST_RESOLUTION_PREFERENCE` :ts:cv:`proxy.config.hostdb.ip_resolve` :c:enumerator:`TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_INDEX` :ts:cv:`proxy.config.plugin.vc.default_buffer_index` :c:enumerator:`TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK` :ts:cv:`proxy.config.plugin.vc.default_buffer_water_mark` +:c:enumerator:`TS_CONFIG_NET_SOCK_NOTSENT_LOWAT` :ts:cv:`proxy.config.net.sock_notsent_lowat` ======================================================================== ==================================================================== Examples diff --git a/doc/developer-guide/api/types/TSOverridableConfigKey.en.rst b/doc/developer-guide/api/types/TSOverridableConfigKey.en.rst index 8e1a919..50b9d8e 100644 --- a/doc/developer-guide/api/types/TSOverridableConfigKey.en.rst +++ b/doc/developer-guide/api/types/TSOverridableConfigKey.en.rst @@ -152,6 +152,7 @@ Enumeration Members .. c:enumerator:: TS_CONFIG_HTTP_HOST_RESOLUTION_PREFERENCE .. c:enumerator:: TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_INDEX .. c:enumerator:: TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK +.. c:enumerator:: TS_CONFIG_NET_SOCK_NOTSENT_LOWAT Description diff --git a/include/ts/apidefs.h.in b/include/ts/apidefs.h.in index ee65fab..be12d43 100644 --- a/include/ts/apidefs.h.in +++ b/include/ts/apidefs.h.in @@ -865,6 +865,7 @@ typedef enum { TS_CONFIG_HTTP_CONNECT_DEAD_POLICY, TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_INDEX, TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK, + TS_CONFIG_NET_SOCK_NOTSENT_LOWAT, TS_CONFIG_LAST_ENTRY } TSOverridableConfigKey; diff --git a/iocore/net/I_NetProcessor.h b/iocore/net/I_NetProcessor.h index 7edb8e8..8afd264 100644 --- a/iocore/net/I_NetProcessor.h +++ b/iocore/net/I_NetProcessor.h @@ -85,6 +85,7 @@ public: uint32_t sockopt_flags; uint32_t packet_mark; uint32_t packet_tos; + uint32_t packet_notsent_lowat; int tfo_queue_length; diff --git a/iocore/net/I_NetVConnection.h b/iocore/net/I_NetVConnection.h index 6ad2a01..f74c750 100644 --- a/iocore/net/I_NetVConnection.h +++ b/iocore/net/I_NetVConnection.h @@ -180,9 +180,12 @@ struct NetVCOptions { static uint32_t const SOCK_OPT_PACKET_MARK = 16; /// Value for IP_TOS @c sockopt_flags static uint32_t const SOCK_OPT_PACKET_TOS = 32; + /// Value for TCP_NOTSENT_LOWAT @c sockopt_flags + static uint32_t const SOCK_OPT_TCP_NOTSENT_LOWAT = 64; uint32_t packet_mark; uint32_t packet_tos; + uint32_t packet_notsent_lowat; EventType etype; @@ -241,7 +244,7 @@ struct NetVCOptions { void reset(); void set_sock_param(int _recv_bufsize, int _send_bufsize, unsigned long _opt_flags, unsigned long _packet_mark = 0, - unsigned long _packet_tos = 0); + unsigned long _packet_tos = 0, unsigned long _packet_notsent_lowat = 0); NetVCOptions() { reset(); } ~NetVCOptions() {} diff --git a/iocore/net/P_UnixNetVConnection.h b/iocore/net/P_UnixNetVConnection.h index fcd05db..65e763f 100644 --- a/iocore/net/P_UnixNetVConnection.h +++ b/iocore/net/P_UnixNetVConnection.h @@ -60,10 +60,11 @@ NetVCOptions::reset() #else 0; #endif - socket_send_bufsize = 0; - sockopt_flags = 0; - packet_mark = 0; - packet_tos = 0; + socket_send_bufsize = 0; + sockopt_flags = 0; + packet_mark = 0; + packet_tos = 0; + packet_notsent_lowat = 0; etype = ET_NET; @@ -77,13 +78,14 @@ NetVCOptions::reset() inline void NetVCOptions::set_sock_param(int _recv_bufsize, int _send_bufsize, unsigned long _opt_flags, unsigned long _packet_mark, - unsigned long _packet_tos) + unsigned long _packet_tos, unsigned long _packet_notsent_lowat) { - socket_recv_bufsize = _recv_bufsize; - socket_send_bufsize = _send_bufsize; - sockopt_flags = _opt_flags; - packet_mark = _packet_mark; - packet_tos = _packet_tos; + socket_recv_bufsize = _recv_bufsize; + socket_send_bufsize = _send_bufsize; + sockopt_flags = _opt_flags; + packet_mark = _packet_mark; + packet_tos = _packet_tos; + packet_notsent_lowat = _packet_notsent_lowat; } enum tcp_congestion_control_t { CLIENT_SIDE, SERVER_SIDE }; diff --git a/iocore/net/UnixConnection.cc b/iocore/net/UnixConnection.cc index 7be4de6..99d1785 100644 --- a/iocore/net/UnixConnection.cc +++ b/iocore/net/UnixConnection.cc @@ -286,6 +286,13 @@ Connection::apply_options(NetVCOptions const &opt) safe_setsockopt(fd, SOL_SOCKET, SO_LINGER, reinterpret_cast<char *>(&l), sizeof(l)); Debug("socket", "::open:: setsockopt() turn on SO_LINGER on socket"); } +#ifdef TCP_NOTSENT_LOWAT + if (opt.sockopt_flags & NetVCOptions::SOCK_OPT_TCP_NOTSENT_LOWAT) { + uint32_t lowat = opt.packet_notsent_lowat; + safe_setsockopt(fd, IPPROTO_TCP, TCP_NOTSENT_LOWAT, reinterpret_cast<char *>(&lowat), sizeof(lowat)); + Debug("socket", "::open:: setsockopt() set TCP_NOTSENT_LOWAT to %d", lowat); + } +#endif } #if TS_HAS_SO_MARK diff --git a/iocore/net/UnixNetAccept.cc b/iocore/net/UnixNetAccept.cc index 86bf38c..35e5660 100644 --- a/iocore/net/UnixNetAccept.cc +++ b/iocore/net/UnixNetAccept.cc @@ -337,9 +337,10 @@ NetAccept::do_blocking_accept(EThread *t) vc->action_ = *action_; vc->set_is_transparent(opt.f_inbound_transparent); vc->set_is_proxy_protocol(opt.f_proxy_protocol); - vc->options.packet_mark = opt.packet_mark; - vc->options.packet_tos = opt.packet_tos; - vc->options.ip_family = opt.ip_family; + vc->options.packet_mark = opt.packet_mark; + vc->options.packet_tos = opt.packet_tos; + vc->options.packet_notsent_lowat = opt.packet_notsent_lowat; + vc->options.ip_family = opt.ip_family; vc->apply_options(); vc->set_context(NET_VCONNECTION_IN); if (opt.f_mptcp) { @@ -488,9 +489,10 @@ NetAccept::acceptFastEvent(int event, void *ep) vc->action_ = *action_; vc->set_is_transparent(opt.f_inbound_transparent); vc->set_is_proxy_protocol(opt.f_proxy_protocol); - vc->options.packet_mark = opt.packet_mark; - vc->options.packet_tos = opt.packet_tos; - vc->options.ip_family = opt.ip_family; + vc->options.packet_mark = opt.packet_mark; + vc->options.packet_tos = opt.packet_tos; + vc->options.packet_notsent_lowat = opt.packet_notsent_lowat; + vc->options.ip_family = opt.ip_family; vc->apply_options(); vc->set_context(NET_VCONNECTION_IN); if (opt.f_mptcp) { diff --git a/iocore/net/UnixNetProcessor.cc b/iocore/net/UnixNetProcessor.cc index ba012e0..ba5062d 100644 --- a/iocore/net/UnixNetProcessor.cc +++ b/iocore/net/UnixNetProcessor.cc @@ -49,6 +49,7 @@ NetProcessor::AcceptOptions::reset() sockopt_flags = 0; packet_mark = 0; packet_tos = 0; + packet_notsent_lowat = 0; tfo_queue_length = 0; f_inbound_transparent = false; f_mptcp = false; diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc index 997d5fc..b89ab4e 100644 --- a/mgmt/RecordsConfig.cc +++ b/mgmt/RecordsConfig.cc @@ -786,6 +786,8 @@ static const RecordElement RecordsConfig[] = , {RECT_CONFIG, "proxy.config.net.sock_mss_in", RECD_INT, "0", RECU_RESTART_TS, RR_NULL, RECC_NULL, nullptr, RECA_NULL} , + {RECT_CONFIG, "proxy.config.net.sock_notsent_lowat", RECD_INT, "32768", RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, RECA_NULL} + , {RECT_CONFIG, "proxy.config.net.poll_timeout", RECD_INT, "10", RECU_RESTART_TS, RR_NULL, RECC_NULL, nullptr, RECA_NULL} , {RECT_CONFIG, "proxy.config.net.default_inactivity_timeout", RECD_INT, "86400", RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, RECA_NULL} diff --git a/plugins/lua/ts_lua_http_config.c b/plugins/lua/ts_lua_http_config.c index 24420fe..faa70ef 100644 --- a/plugins/lua/ts_lua_http_config.c +++ b/plugins/lua/ts_lua_http_config.c @@ -141,6 +141,7 @@ typedef enum { TS_LUA_CONFIG_HTTP_HOST_RESOLUTION_PREFERENCE = TS_CONFIG_HTTP_HOST_RESOLUTION_PREFERENCE, TS_LUA_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_INDEX = TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_INDEX, TS_LUA_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK = TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK, + TS_LUA_CONFIG_NET_SOCK_NOTSENT_LOWAT = TS_CONFIG_NET_SOCK_NOTSENT_LOWAT, TS_LUA_CONFIG_LAST_ENTRY = TS_CONFIG_LAST_ENTRY, } TSLuaOverridableConfigKey; @@ -274,6 +275,7 @@ ts_lua_var_item ts_lua_http_config_vars[] = { TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_PER_SERVER_CONNECTION_MATCH), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_INDEX), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK), + TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_NET_SOCK_NOTSENT_LOWAT), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_LAST_ENTRY), }; diff --git a/proxy/http/HttpConfig.cc b/proxy/http/HttpConfig.cc index e00f8d9..9b8f372 100644 --- a/proxy/http/HttpConfig.cc +++ b/proxy/http/HttpConfig.cc @@ -1256,6 +1256,7 @@ HttpConfig::startup() HttpEstablishStaticConfigLongLong(c.oride.sock_option_flag_out, "proxy.config.net.sock_option_flag_out"); HttpEstablishStaticConfigLongLong(c.oride.sock_packet_mark_out, "proxy.config.net.sock_packet_mark_out"); HttpEstablishStaticConfigLongLong(c.oride.sock_packet_tos_out, "proxy.config.net.sock_packet_tos_out"); + HttpEstablishStaticConfigLongLong(c.oride.sock_packet_notsent_lowat, "proxy.config.net.sock_notsent_lowat"); HttpEstablishStaticConfigByte(c.oride.fwd_proxy_auth_to_parent, "proxy.config.http.forward.proxy_auth_to_parent"); @@ -1547,6 +1548,7 @@ HttpConfig::reconfigure() params->oride.sock_packet_mark_out = m_master.oride.sock_packet_mark_out; params->oride.sock_packet_tos_out = m_master.oride.sock_packet_tos_out; params->oride.sock_option_flag_out = m_master.oride.sock_option_flag_out; + params->oride.sock_packet_notsent_lowat = m_master.oride.sock_packet_notsent_lowat; // Clear the TCP Fast Open option if it is not supported on this host. if ((params->oride.sock_option_flag_out & NetVCOptions::SOCK_OPT_TCP_FAST_OPEN) && !SocketManager::fastopen_supported()) { diff --git a/proxy/http/HttpConfig.h b/proxy/http/HttpConfig.h index 233f875..457c487 100644 --- a/proxy/http/HttpConfig.h +++ b/proxy/http/HttpConfig.h @@ -630,6 +630,7 @@ struct OverridableHttpConfigParams { MgmtInt sock_option_flag_out = 0; MgmtInt sock_packet_mark_out = 0; MgmtInt sock_packet_tos_out = 0; + MgmtInt sock_packet_notsent_lowat = 0; /////////////// // Hdr Limit // diff --git a/proxy/http/HttpProxyServerMain.cc b/proxy/http/HttpProxyServerMain.cc index f5f1c3b..68f6810 100644 --- a/proxy/http/HttpProxyServerMain.cc +++ b/proxy/http/HttpProxyServerMain.cc @@ -149,6 +149,10 @@ make_net_accept_options(const HttpProxyPort *port, unsigned nthreads) REC_ReadConfigInteger(net.sockopt_flags, "proxy.config.net.sock_option_flag_in"); REC_ReadConfigInteger(net.defer_accept, "proxy.config.net.defer_accept"); +#if TCP_NOTSENT_LOWAT + REC_ReadConfigInteger(net.packet_notsent_lowat, "proxy.config.net.sock_notsent_lowat"); +#endif + #ifdef TCP_FASTOPEN REC_ReadConfigInteger(net.tfo_queue_length, "proxy.config.net.sock_option_tfo_queue_size_in"); #endif diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc index ec77453..51da337 100644 --- a/proxy/http/HttpSM.cc +++ b/proxy/http/HttpSM.cc @@ -5307,7 +5307,7 @@ HttpSM::do_http_server_open(bool raw) opt.f_blocking_connect = false; opt.set_sock_param(t_state.txn_conf->sock_recv_buffer_size_out, t_state.txn_conf->sock_send_buffer_size_out, t_state.txn_conf->sock_option_flag_out, t_state.txn_conf->sock_packet_mark_out, - t_state.txn_conf->sock_packet_tos_out); + t_state.txn_conf->sock_packet_tos_out, t_state.txn_conf->sock_packet_notsent_lowat); set_tls_options(opt, t_state.txn_conf); @@ -5766,10 +5766,12 @@ HttpSM::handle_http_server_open() server_connection_provided_cert = vc->provided_cert(); if (vc->options.sockopt_flags != t_state.txn_conf->sock_option_flag_out || vc->options.packet_mark != t_state.txn_conf->sock_packet_mark_out || - vc->options.packet_tos != t_state.txn_conf->sock_packet_tos_out) { - vc->options.sockopt_flags = t_state.txn_conf->sock_option_flag_out; - vc->options.packet_mark = t_state.txn_conf->sock_packet_mark_out; - vc->options.packet_tos = t_state.txn_conf->sock_packet_tos_out; + vc->options.packet_tos != t_state.txn_conf->sock_packet_tos_out || + vc->options.packet_notsent_lowat != t_state.txn_conf->sock_packet_notsent_lowat) { + vc->options.sockopt_flags = t_state.txn_conf->sock_option_flag_out; + vc->options.packet_mark = t_state.txn_conf->sock_packet_mark_out; + vc->options.packet_tos = t_state.txn_conf->sock_packet_tos_out; + vc->options.packet_notsent_lowat = t_state.txn_conf->sock_packet_notsent_lowat; vc->apply_options(); } } diff --git a/proxy/shared/UglyLogStubs.cc b/proxy/shared/UglyLogStubs.cc index 99081ec..f845633 100644 --- a/proxy/shared/UglyLogStubs.cc +++ b/proxy/shared/UglyLogStubs.cc @@ -122,6 +122,7 @@ NetProcessor::AcceptOptions::reset() sockopt_flags = 0; packet_mark = 0; packet_tos = 0; + packet_notsent_lowat = 0; f_inbound_transparent = false; return *this; } diff --git a/src/shared/overridable_txn_vars.cc b/src/shared/overridable_txn_vars.cc index 7c2f398..84d90cf 100644 --- a/src/shared/overridable_txn_vars.cc +++ b/src/shared/overridable_txn_vars.cc @@ -165,4 +165,5 @@ const std::unordered_map<std::string_view, std::tuple<const TSOverridableConfigK {"proxy.config.ssl.client.CA.cert.filename", {TS_CONFIG_SSL_CLIENT_CA_CERT_FILENAME, TS_RECORDDATATYPE_STRING}}, {"proxy.config.hostdb.ip_resolve", {TS_CONFIG_HTTP_HOST_RESOLUTION_PREFERENCE, TS_RECORDDATATYPE_STRING}}, {"proxy.config.plugin.vc.default_buffer_index", {TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_INDEX, TS_RECORDDATATYPE_INT}}, - {"proxy.config.plugin.vc.default_buffer_water_mark", {TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK, TS_RECORDDATATYPE_INT}}}); + {"proxy.config.plugin.vc.default_buffer_water_mark", {TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK, TS_RECORDDATATYPE_INT}}, + {"proxy.config.net.sock_notsent_lowat", {TS_CONFIG_NET_SOCK_NOTSENT_LOWAT, TS_RECORDDATATYPE_INT}}}); diff --git a/src/traffic_server/InkAPI.cc b/src/traffic_server/InkAPI.cc index c3f0cd7..21f711c 100644 --- a/src/traffic_server/InkAPI.cc +++ b/src/traffic_server/InkAPI.cc @@ -8944,6 +8944,9 @@ _conf_to_memberp(TSOverridableConfigKey conf, OverridableHttpConfigParams *overr case TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK: ret = _memberp_to_generic(&overridableHttpConfig->plugin_vc_default_buffer_water_mark, conv); break; + case TS_CONFIG_NET_SOCK_NOTSENT_LOWAT: + ret = _memberp_to_generic(&overridableHttpConfig->sock_packet_notsent_lowat, conv); + break; // This helps avoiding compiler warnings, yet detect unhandled enum members. case TS_CONFIG_NULL: case TS_CONFIG_LAST_ENTRY: diff --git a/src/traffic_server/InkAPITest.cc b/src/traffic_server/InkAPITest.cc index 783c1c7..0230012 100644 --- a/src/traffic_server/InkAPITest.cc +++ b/src/traffic_server/InkAPITest.cc @@ -8698,7 +8698,8 @@ std::array<std::string_view, TS_CONFIG_LAST_ENTRY> SDK_Overridable_Configs = { "proxy.config.hostdb.ip_resolve", "proxy.config.http.connect.dead.policy", "proxy.config.plugin.vc.default_buffer_index", - "proxy.config.plugin.vc.default_buffer_water_mark"}}; + "proxy.config.plugin.vc.default_buffer_water_mark", + "proxy.config.net.sock_notsent_lowat"}}; extern ClassAllocator<HttpSM> httpSMAllocator;