diff --git a/doc/admin-guide/files/records.config.en.rst b/doc/admin-guide/files/records.config.en.rst index 7a1fe4f11c2..77e88cfb778 100644 --- a/doc/admin-guide/files/records.config.en.rst +++ b/doc/admin-guide/files/records.config.en.rst @@ -1153,6 +1153,7 @@ HTTP Connection Timeouts .. ts:cv:: CONFIG proxy.config.http.transaction_active_timeout_in INT 900 :reloadable: + :overridable: The maximum amount of time Traffic Server can remain connected to a client. If the transfer to the client is not complete before this timeout expires, then Traffic Server closes the connection. diff --git a/lib/ts/apidefs.h.in b/lib/ts/apidefs.h.in index 4fb0977a172..77c101e94b6 100644 --- a/lib/ts/apidefs.h.in +++ b/lib/ts/apidefs.h.in @@ -699,6 +699,7 @@ typedef enum { TS_CONFIG_WEBSOCKET_ACTIVE_TIMEOUT, TS_CONFIG_HTTP_UNCACHEABLE_REQUESTS_BYPASS_PARENT, TS_CONFIG_HTTP_PARENT_PROXY_TOTAL_CONNECT_ATTEMPTS, + TS_CONFIG_HTTP_TRANSACTION_ACTIVE_TIMEOUT_IN, TS_CONFIG_LAST_ENTRY } TSOverridableConfigKey; diff --git a/plugins/experimental/ts_lua/ts_lua_http_config.c b/plugins/experimental/ts_lua/ts_lua_http_config.c index 031a2a3694a..1755fb3d524 100644 --- a/plugins/experimental/ts_lua/ts_lua_http_config.c +++ b/plugins/experimental/ts_lua/ts_lua_http_config.c @@ -118,6 +118,7 @@ typedef enum { TS_LUA_CONFIG_WEBSOCKET_ACTIVE_TIMEOUT = TS_CONFIG_WEBSOCKET_ACTIVE_TIMEOUT, TS_LUA_CONFIG_HTTP_UNCACHEABLE_REQUESTS_BYPASS_PARENT = TS_CONFIG_HTTP_UNCACHEABLE_REQUESTS_BYPASS_PARENT, TS_LUA_CONFIG_HTTP_PARENT_PROXY_TOTAL_CONNECT_ATTEMPTS = TS_CONFIG_HTTP_PARENT_PROXY_TOTAL_CONNECT_ATTEMPTS, + TS_LUA_CONFIG_HTTP_TRANSACTION_ACTIVE_TIMEOUT_IN = TS_CONFIG_HTTP_TRANSACTION_ACTIVE_TIMEOUT_IN, TS_LUA_CONFIG_LAST_ENTRY = TS_CONFIG_LAST_ENTRY, } TSLuaOverridableConfigKey; @@ -228,6 +229,7 @@ ts_lua_var_item ts_lua_http_config_vars[] = { TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_WEBSOCKET_ACTIVE_TIMEOUT), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_UNCACHEABLE_REQUESTS_BYPASS_PARENT), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_PARENT_PROXY_TOTAL_CONNECT_ATTEMPTS), + TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_TRANSACTION_ACTIVE_TIMEOUT_IN), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_LAST_ENTRY), }; diff --git a/proxy/InkAPI.cc b/proxy/InkAPI.cc index 00b544d02f6..fa029890fa7 100644 --- a/proxy/InkAPI.cc +++ b/proxy/InkAPI.cc @@ -7974,6 +7974,9 @@ _conf_to_memberp(TSOverridableConfigKey conf, OverridableHttpConfigParams *overr case TS_CONFIG_HTTP_PARENT_PROXY_TOTAL_CONNECT_ATTEMPTS: typ = OVERRIDABLE_TYPE_INT; ret = &overridableHttpConfig->parent_connect_attempts; + case TS_CONFIG_HTTP_TRANSACTION_ACTIVE_TIMEOUT_IN: + typ = OVERRIDABLE_TYPE_INT; + ret = &overridableHttpConfig->transaction_active_timeout_in; break; // This helps avoiding compiler warnings, yet detect unhandled enum members. case TS_CONFIG_NULL: @@ -8527,6 +8530,10 @@ TSHttpTxnConfigFind(const char *name, int length, TSOverridableConfigKey *conf, else if (!strncmp(name, "proxy.config.http.cache.guaranteed_max_lifetime", length)) cnf = TS_CONFIG_HTTP_CACHE_GUARANTEED_MAX_LIFETIME; break; + case 'n': + if (!strncmp(name, "proxy.config.http.transaction_active_timeout_in", length)) + cnf = TS_CONFIG_HTTP_TRANSACTION_ACTIVE_TIMEOUT_IN; + break; case 't': if (!strncmp(name, "proxy.config.http.post_connect_attempts_timeout", length)) cnf = TS_CONFIG_HTTP_POST_CONNECT_ATTEMPTS_TIMEOUT; diff --git a/proxy/InkAPITest.cc b/proxy/InkAPITest.cc index 82cd9bbd3f0..fcb2b185d28 100644 --- a/proxy/InkAPITest.cc +++ b/proxy/InkAPITest.cc @@ -7355,6 +7355,7 @@ const char *SDK_Overridable_Configs[TS_CONFIG_LAST_ENTRY] = { "proxy.config.websocket.active_timeout", "proxy.config.http.uncacheable_requests_bypass_parent", "proxy.config.http.parent_proxy.total_connect_attempts", + "proxy.config.http.transaction_active_timeout_in", }; REGRESSION_TEST(SDK_API_OVERRIDABLE_CONFIGS)(RegressionTest *test, int /* atype ATS_UNUSED */, int *pstatus) diff --git a/proxy/http/HttpConfig.cc b/proxy/http/HttpConfig.cc index 672748eb956..2627792d7e8 100644 --- a/proxy/http/HttpConfig.cc +++ b/proxy/http/HttpConfig.cc @@ -943,7 +943,7 @@ HttpConfig::startup() HttpEstablishStaticConfigLongLong(c.oride.websocket_active_timeout, "proxy.config.websocket.active_timeout"); HttpEstablishStaticConfigLongLong(c.oride.websocket_inactive_timeout, "proxy.config.websocket.no_activity_timeout"); - HttpEstablishStaticConfigLongLong(c.transaction_active_timeout_in, "proxy.config.http.transaction_active_timeout_in"); + HttpEstablishStaticConfigLongLong(c.oride.transaction_active_timeout_in, "proxy.config.http.transaction_active_timeout_in"); HttpEstablishStaticConfigLongLong(c.oride.transaction_active_timeout_out, "proxy.config.http.transaction_active_timeout_out"); HttpEstablishStaticConfigLongLong(c.accept_no_activity_timeout, "proxy.config.http.accept_no_activity_timeout"); @@ -1217,7 +1217,7 @@ HttpConfig::reconfigure() params->oride.keep_alive_no_activity_timeout_out = m_master.oride.keep_alive_no_activity_timeout_out; params->oride.transaction_no_activity_timeout_in = m_master.oride.transaction_no_activity_timeout_in; params->oride.transaction_no_activity_timeout_out = m_master.oride.transaction_no_activity_timeout_out; - params->transaction_active_timeout_in = m_master.transaction_active_timeout_in; + params->oride.transaction_active_timeout_in = m_master.oride.transaction_active_timeout_in; params->oride.transaction_active_timeout_out = m_master.oride.transaction_active_timeout_out; params->oride.websocket_active_timeout = m_master.oride.websocket_active_timeout; params->oride.websocket_inactive_timeout = m_master.oride.websocket_inactive_timeout; diff --git a/proxy/http/HttpConfig.h b/proxy/http/HttpConfig.h index d2fbbadde0a..38579cba94d 100644 --- a/proxy/http/HttpConfig.h +++ b/proxy/http/HttpConfig.h @@ -423,6 +423,7 @@ struct OverridableHttpConfigParams { transaction_no_activity_timeout_in(30), transaction_no_activity_timeout_out(30), transaction_active_timeout_out(0), + transaction_active_timeout_in(900), websocket_active_timeout(3600), websocket_inactive_timeout(600), origin_max_connections(0), @@ -602,6 +603,7 @@ struct OverridableHttpConfigParams { MgmtInt transaction_no_activity_timeout_in; MgmtInt transaction_no_activity_timeout_out; MgmtInt transaction_active_timeout_out; + MgmtInt transaction_active_timeout_in; MgmtInt websocket_active_timeout; MgmtInt websocket_inactive_timeout; MgmtInt origin_max_connections; @@ -738,7 +740,6 @@ struct HttpConfigParams : public ConfigInfo { // connection variables. timeouts are in seconds // /////////////////////////////////////////////////// MgmtByte session_auth_cache_keep_alive_enabled; - MgmtInt transaction_active_timeout_in; MgmtInt accept_no_activity_timeout; //////////////////////////////////// @@ -943,7 +944,6 @@ inline HttpConfigParams::HttpConfigParams() url_expansions(NULL), num_url_expansions(0), session_auth_cache_keep_alive_enabled(1), - transaction_active_timeout_in(900), accept_no_activity_timeout(120), per_parent_connect_attempts(2), parent_connect_timeout(30), diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc index 66c684a25a7..d7e07a3be02 100644 --- a/proxy/http/HttpSM.cc +++ b/proxy/http/HttpSM.cc @@ -577,8 +577,8 @@ HttpSM::attach_client_session(ProxyClientTransaction *client_vc, IOBufferReader ///////////////////////// // set up timeouts // ///////////////////////// - client_vc->set_inactivity_timeout(HRTIME_SECONDS(HttpConfig::m_master.accept_no_activity_timeout)); - client_vc->set_active_timeout(HRTIME_SECONDS(HttpConfig::m_master.transaction_active_timeout_in)); + client_vc->set_inactivity_timeout(HRTIME_SECONDS(t_state.http_config_param->accept_no_activity_timeout)); + client_vc->set_active_timeout(HRTIME_SECONDS(t_state.txn_conf->transaction_active_timeout_in)); ++reentrancy_count; // Add our state sm to the sm list diff --git a/proxy/http/HttpTransact.cc b/proxy/http/HttpTransact.cc index 9cdf1dfe240..c4a7bd6fc6f 100644 --- a/proxy/http/HttpTransact.cc +++ b/proxy/http/HttpTransact.cc @@ -916,6 +916,9 @@ HttpTransact::EndRemapRequest(State *s) s->server_info.is_transparent = s->state_machine->ua_session ? s->state_machine->ua_session->is_outbound_transparent() : false; done: + // We now set the active-timeout again, since it might have been changed as part of the remap rules. + s->state_machine->ua_session->get_netvc()->set_active_timeout(HRTIME_SECONDS(s->txn_conf->transaction_active_timeout_in)); + if (is_debug_tag_set("http_chdr_describe") || is_debug_tag_set("http_trans") || is_debug_tag_set("url_rewrite")) { DebugTxn("http_trans", "After Remapping:"); obj_describe(s->hdr_info.client_request.m_http, 1);