You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2022/02/17 00:22:47 UTC

[trafficserver] branch 9.2.x updated (4d4dbdb -> f0fe805)

This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a change to branch 9.2.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git.


    from 4d4dbdb  Fix plugin parent_select missing hostname len (#8649)
     new 1dada12  Adds two overridable config variables to control parent mark downs. (#8595)
     new f0fe805  Making 9.2.x backwards compatible with 9.1.x (#8661)

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 doc/admin-guide/files/records.config.en.rst | 26 ++++++++++
 include/ts/apidefs.h.in                     | 11 +++-
 include/ts/experimental.h                   | 23 +++++++++
 mgmt/RecordsConfig.cc                       |  4 ++
 plugins/lua/ts_lua_http_config.c            | 32 ++++++++----
 proxy/http/HttpConfig.cc                    | 25 +++++----
 proxy/http/HttpConfig.h                     | 12 +++--
 proxy/http/HttpTransact.cc                  | 16 +++++-
 src/shared/overridable_txn_vars.cc          |  6 ++-
 src/traffic_server/InkAPI.cc                | 78 +++++++++++++++++++++++++++++
 src/traffic_server/InkAPITest.cc            | 17 ++++++-
 11 files changed, 217 insertions(+), 33 deletions(-)

[trafficserver] 01/02: Adds two overridable config variables to control parent mark downs. (#8595)

Posted by zw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a commit to branch 9.2.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit 1dada123bcca0bfbefb9a81560a4db99afe29b24
Author: John J. Rushford <jr...@apache.org>
AuthorDate: Tue Jan 18 10:30:17 2022 -0700

    Adds two overridable config variables to control parent mark downs. (#8595)
    
    These configs may be overridden by the header_rewrite plugin on a
    per remap basis.
    
    - proxy.config.http.parent_proxy.enable_parent_timeout_markdowns is
      used to enable parent markdowns when an inactivity timeout triggers
      on a parent proxy.  The default is disabled or '0'.
    
    - proxy.config.http.parent_proxy.disable_parent_markdowns  is used to
      disable all parent proxy markdowns.  The default is disabled or '0'.
    
    (cherry picked from commit 427c42fc7e94991bcea47198780643a13d4b85d8)
---
 doc/admin-guide/files/records.config.en.rst | 26 ++++++++++++++++++++++++++
 include/ts/apidefs.h.in                     |  2 ++
 mgmt/RecordsConfig.cc                       |  4 ++++
 plugins/lua/ts_lua_http_config.c            |  4 ++++
 proxy/http/HttpConfig.cc                    | 25 +++++++++++++++----------
 proxy/http/HttpConfig.h                     | 12 +++++++-----
 proxy/http/HttpTransact.cc                  | 16 ++++++++++++++--
 src/shared/overridable_txn_vars.cc          |  6 +++++-
 src/traffic_server/InkAPI.cc                |  6 ++++++
 src/traffic_server/InkAPITest.cc            |  4 +++-
 10 files changed, 86 insertions(+), 19 deletions(-)

diff --git a/doc/admin-guide/files/records.config.en.rst b/doc/admin-guide/files/records.config.en.rst
index b3dab3e..de01a6b 100644
--- a/doc/admin-guide/files/records.config.en.rst
+++ b/doc/admin-guide/files/records.config.en.rst
@@ -1347,6 +1347,32 @@ Parent Proxy Configuration
    ``2`` Mark the host down. This is the default.
    ===== ======================================================================
 
+.. ts:cv:: CONFIG proxy.config.http.parent_proxy.enable_parent_timeout_markdowns INT 0
+   :reloadable:
+   :overridable:
+
+   Enables (``1``) or disables (``0``) parent proxy mark downs due to inactivity
+   timeouts.  By default parent proxies are not marked down due to inactivity
+   timeouts, the transaction will retry using another parent instead.  The
+   default for this configuration keeps this behavior and is disabled (``0``).
+   This setting is overridable using one of the two plugins ``header_rewrite``
+   or ``conf_remap`` to enable inactivity timeout markdowns and should be done
+   so rather than enabling this globally. This setting should not be used in
+   conjunction with ``proxy.config.http.parent_proxy.disable_parent_markdowns``
+
+.. ts:cv:: CONFIG proxy.config.http.parent_proxy.disable_parent_markdowns INT 0
+   :reloadable:
+   :overridable:
+
+   Enables (``1``) or disables (``0``) parent proxy markdowns.  This is useful
+   if parent entries in a parent.config line are VIP's and one doesn't wish
+   to mark down a VIP which may have several origin or parent proxies behind
+   the load balancer.  This setting is overridable using one of the
+   ``header_rewrite`` or the ``conf_remap`` plugins to override the default
+   setting and this method should be used rather than disabling markdowns
+   globally.  This setting should not be used in conjunction with
+   ``proxy.config.http.parent_proxy.enable_parent_timeout_markdowns``
+
 HTTP Connection Timeouts
 ========================
 
diff --git a/include/ts/apidefs.h.in b/include/ts/apidefs.h.in
index bf5b314..e3ebe46 100644
--- a/include/ts/apidefs.h.in
+++ b/include/ts/apidefs.h.in
@@ -867,6 +867,8 @@ typedef enum {
   TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK,
   TS_CONFIG_NET_SOCK_NOTSENT_LOWAT,
   TS_CONFIG_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE,
+  TS_CONFIG_HTTP_ENABLE_PARENT_TIMEOUT_MARKDOWNS,
+  TS_CONFIG_HTTP_DISABLE_PARENT_MARKDOWNS,
   TS_CONFIG_LAST_ENTRY
 } TSOverridableConfigKey;
 
diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc
index f78cde7..7153690 100644
--- a/mgmt/RecordsConfig.cc
+++ b/mgmt/RecordsConfig.cc
@@ -451,6 +451,10 @@ static const RecordElement RecordsConfig[] =
   ,
   {RECT_CONFIG, "proxy.config.http.parent_proxy.self_detect", RECD_INT, "2", RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, RECA_NULL}
   ,
+  {RECT_CONFIG, "proxy.config.http.parent_proxy.enable_parent_timeout_markdowns", RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_INT, "[0-1]", RECA_NULL}
+  ,
+  {RECT_CONFIG, "proxy.config.http.parent_proxy.disable_parent_markdowns", RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_INT, "[0-1]", RECA_NULL}
+  ,
   {RECT_CONFIG, "proxy.config.http.forward.proxy_auth_to_parent", RECD_INT, "0", 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 310b068..9d5463a 100644
--- a/plugins/lua/ts_lua_http_config.c
+++ b/plugins/lua/ts_lua_http_config.c
@@ -143,6 +143,8 @@ typedef enum {
   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_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE        = TS_CONFIG_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE,
+  TS_LUA_CONFIG_ENABLE_PARENT_TIMEOUT_MARKDOWNS               = TS_CONFIG_HTTP_ENABLE_PARENT_TIMEOUT_MARKDOWNS,
+  TS_LUA_CONFIG_DISABLE_PARENT_MARKDOWNS                      = TS_CONFIG_HTTP_DISABLE_PARENT_MARKDOWNS,
   TS_LUA_CONFIG_LAST_ENTRY                                    = TS_CONFIG_LAST_ENTRY,
 } TSLuaOverridableConfigKey;
 
@@ -278,6 +280,8 @@ ts_lua_var_item ts_lua_http_config_vars[] = {
   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_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE),
+  TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_ENABLE_PARENT_TIMEOUT_MARKDOWNS),
+  TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_DISABLE_PARENT_MARKDOWNS),
   TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_LAST_ENTRY),
 };
 
diff --git a/proxy/http/HttpConfig.cc b/proxy/http/HttpConfig.cc
index 07ed442..c1d8c46 100644
--- a/proxy/http/HttpConfig.cc
+++ b/proxy/http/HttpConfig.cc
@@ -1250,6 +1250,9 @@ HttpConfig::startup()
                                     "proxy.config.http.parent_proxy.per_parent_connect_attempts");
   HttpEstablishStaticConfigLongLong(c.oride.parent_connect_timeout, "proxy.config.http.parent_proxy.connect_attempts_timeout");
   HttpEstablishStaticConfigByte(c.oride.parent_failures_update_hostdb, "proxy.config.http.parent_proxy.mark_down_hostdb");
+  HttpEstablishStaticConfigByte(c.oride.enable_parent_timeout_markdowns,
+                                "proxy.config.http.parent_proxy.enable_parent_timeout_markdowns");
+  HttpEstablishStaticConfigByte(c.oride.disable_parent_markdowns, "proxy.config.http.parent_proxy.disable_parent_markdowns");
 
   HttpEstablishStaticConfigLongLong(c.oride.sock_recv_buffer_size_out, "proxy.config.net.sock_recv_buffer_size_out");
   HttpEstablishStaticConfigLongLong(c.oride.sock_send_buffer_size_out, "proxy.config.net.sock_send_buffer_size_out");
@@ -1535,16 +1538,18 @@ HttpConfig::reconfigure()
             "will never redispatch to another server",
             m_master.oride.connect_attempts_rr_retries, params->oride.connect_attempts_max_retries);
   }
-  params->oride.connect_attempts_rr_retries   = m_master.oride.connect_attempts_rr_retries;
-  params->oride.connect_attempts_timeout      = m_master.oride.connect_attempts_timeout;
-  params->oride.connect_dead_policy           = m_master.oride.connect_dead_policy;
-  params->oride.post_connect_attempts_timeout = m_master.oride.post_connect_attempts_timeout;
-  params->oride.parent_connect_attempts       = m_master.oride.parent_connect_attempts;
-  params->oride.parent_retry_time             = m_master.oride.parent_retry_time;
-  params->oride.parent_fail_threshold         = m_master.oride.parent_fail_threshold;
-  params->oride.per_parent_connect_attempts   = m_master.oride.per_parent_connect_attempts;
-  params->oride.parent_connect_timeout        = m_master.oride.parent_connect_timeout;
-  params->oride.parent_failures_update_hostdb = m_master.oride.parent_failures_update_hostdb;
+  params->oride.connect_attempts_rr_retries     = m_master.oride.connect_attempts_rr_retries;
+  params->oride.connect_attempts_timeout        = m_master.oride.connect_attempts_timeout;
+  params->oride.connect_dead_policy             = m_master.oride.connect_dead_policy;
+  params->oride.post_connect_attempts_timeout   = m_master.oride.post_connect_attempts_timeout;
+  params->oride.parent_connect_attempts         = m_master.oride.parent_connect_attempts;
+  params->oride.parent_retry_time               = m_master.oride.parent_retry_time;
+  params->oride.parent_fail_threshold           = m_master.oride.parent_fail_threshold;
+  params->oride.per_parent_connect_attempts     = m_master.oride.per_parent_connect_attempts;
+  params->oride.parent_connect_timeout          = m_master.oride.parent_connect_timeout;
+  params->oride.parent_failures_update_hostdb   = m_master.oride.parent_failures_update_hostdb;
+  params->oride.enable_parent_timeout_markdowns = m_master.oride.enable_parent_timeout_markdowns;
+  params->oride.disable_parent_markdowns        = m_master.oride.disable_parent_markdowns;
 
   params->oride.sock_recv_buffer_size_out = m_master.oride.sock_recv_buffer_size_out;
   params->oride.sock_send_buffer_size_out = m_master.oride.sock_send_buffer_size_out;
diff --git a/proxy/http/HttpConfig.h b/proxy/http/HttpConfig.h
index 2b6ea37..145fffe 100644
--- a/proxy/http/HttpConfig.h
+++ b/proxy/http/HttpConfig.h
@@ -678,11 +678,13 @@ struct OverridableHttpConfigParams {
   ////////////////////////////////////
   // parent proxy connect attempts //
   ///////////////////////////////////
-  MgmtInt parent_connect_attempts     = 4;
-  MgmtInt parent_retry_time           = 300;
-  MgmtInt parent_fail_threshold       = 10;
-  MgmtInt per_parent_connect_attempts = 2;
-  MgmtInt parent_connect_timeout      = 30;
+  MgmtInt parent_connect_attempts          = 4;
+  MgmtInt parent_retry_time                = 300;
+  MgmtInt parent_fail_threshold            = 10;
+  MgmtInt per_parent_connect_attempts      = 2;
+  MgmtInt parent_connect_timeout           = 30;
+  MgmtByte enable_parent_timeout_markdowns = 0;
+  MgmtByte disable_parent_markdowns        = 0;
 
   MgmtInt down_server_timeout    = 300;
   MgmtInt client_abort_threshold = 1000;
diff --git a/proxy/http/HttpTransact.cc b/proxy/http/HttpTransact.cc
index b0a794b..f4f51d8 100644
--- a/proxy/http/HttpTransact.cc
+++ b/proxy/http/HttpTransact.cc
@@ -214,6 +214,18 @@ markParentDown(HttpTransact::State *s)
   HTTP_INCREMENT_DYN_STAT(http_total_parent_marked_down_count);
   url_mapping *mp = s->url_map.getMapping();
 
+  TxnDebug("http_trans", "sm_id[%" PRId64 "] enable_parent_timeout_markdowns: %d, disable_parent_markdowns: %d",
+           s->state_machine->sm_id, s->txn_conf->enable_parent_timeout_markdowns, s->txn_conf->disable_parent_markdowns);
+
+  if (s->txn_conf->disable_parent_markdowns == 1) {
+    TxnDebug("http_trans", "parent markdowns are disabled for this request");
+    return;
+  }
+
+  if (s->current.state == HttpTransact::INACTIVE_TIMEOUT && s->txn_conf->enable_parent_timeout_markdowns == 0) {
+    return;
+  }
+
   if (s->response_action.handled) {
     // Do nothing. If a plugin handled the response, let it handle markdown.
   } else if (mp && mp->strategy) {
@@ -3727,7 +3739,7 @@ HttpTransact::handle_response_from_parent(State *s)
         // Only mark the parent down if we failed to connect
         //  to the parent otherwise slow origin servers cause
         //  us to mark the parent down
-        if (s->current.state == CONNECTION_ERROR) {
+        if (s->current.state == CONNECTION_ERROR || s->current.state == INACTIVE_TIMEOUT) {
           markParentDown(s);
         }
         // We are done so look for another parent if any
@@ -3738,7 +3750,7 @@ HttpTransact::handle_response_from_parent(State *s)
       //   appropriate
       HTTP_INCREMENT_DYN_STAT(http_total_parent_retries_exhausted_stat);
       TxnDebug("http_trans", "[handle_response_from_parent] Error. No more retries.");
-      if (s->current.state == CONNECTION_ERROR) {
+      if (s->current.state == CONNECTION_ERROR || s->current.state == INACTIVE_TIMEOUT) {
         markParentDown(s);
       }
       s->parent_result.result = PARENT_FAIL;
diff --git a/src/shared/overridable_txn_vars.cc b/src/shared/overridable_txn_vars.cc
index 906de8e..5b6f3db 100644
--- a/src/shared/overridable_txn_vars.cc
+++ b/src/shared/overridable_txn_vars.cc
@@ -168,4 +168,8 @@ const std::unordered_map<std::string_view, std::tuple<const TSOverridableConfigK
      {"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}},
      {"proxy.config.body_factory.response_suppression_mode",
-      {TS_CONFIG_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE, TS_RECORDDATATYPE_INT}}});
+      {TS_CONFIG_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE, TS_RECORDDATATYPE_INT}},
+     {"proxy.config.http.parent_proxy.enable_parent_timeout_markdowns",
+      {TS_CONFIG_HTTP_ENABLE_PARENT_TIMEOUT_MARKDOWNS, TS_RECORDDATATYPE_INT}},
+     {"proxy.config.http.parent_proxy.disable_parent_markdowns",
+      {TS_CONFIG_HTTP_DISABLE_PARENT_MARKDOWNS, TS_RECORDDATATYPE_INT}}});
diff --git a/src/traffic_server/InkAPI.cc b/src/traffic_server/InkAPI.cc
index da3331e..5ac59e4 100644
--- a/src/traffic_server/InkAPI.cc
+++ b/src/traffic_server/InkAPI.cc
@@ -8979,6 +8979,12 @@ _conf_to_memberp(TSOverridableConfigKey conf, OverridableHttpConfigParams *overr
   case TS_CONFIG_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE:
     ret = _memberp_to_generic(&overridableHttpConfig->response_suppression_mode, conv);
     break;
+  case TS_CONFIG_HTTP_ENABLE_PARENT_TIMEOUT_MARKDOWNS:
+    ret = _memberp_to_generic(&overridableHttpConfig->enable_parent_timeout_markdowns, conv);
+    break;
+  case TS_CONFIG_HTTP_DISABLE_PARENT_MARKDOWNS:
+    ret = _memberp_to_generic(&overridableHttpConfig->disable_parent_markdowns, conv);
+    break;
 
   // This helps avoiding compiler warnings, yet detect unhandled enum members.
   case TS_CONFIG_NULL:
diff --git a/src/traffic_server/InkAPITest.cc b/src/traffic_server/InkAPITest.cc
index 5fc5a10..e1d547e 100644
--- a/src/traffic_server/InkAPITest.cc
+++ b/src/traffic_server/InkAPITest.cc
@@ -8700,7 +8700,9 @@ std::array<std::string_view, TS_CONFIG_LAST_ENTRY> SDK_Overridable_Configs = {
    "proxy.config.plugin.vc.default_buffer_index",
    "proxy.config.plugin.vc.default_buffer_water_mark",
    "proxy.config.net.sock_notsent_lowat",
-   "proxy.config.body_factory.response_suppression_mode"}};
+   "proxy.config.body_factory.response_suppression_mode",
+   "proxy.config.http.parent_proxy.enable_parent_timeout_markdowns",
+   "proxy.config.http.parent_proxy.disable_parent_markdowns"}};
 
 extern ClassAllocator<HttpSM> httpSMAllocator;
 

[trafficserver] 02/02: Making 9.2.x backwards compatible with 9.1.x (#8661)

Posted by zw...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a commit to branch 9.2.x
in repository https://gitbox.apache.org/repos/asf/trafficserver.git

commit f0fe8058c97471d69f5b5434938dd51511e93a72
Author: Brian Neradt <br...@verizonmedia.com>
AuthorDate: Tue Feb 15 11:46:43 2022 -0600

    Making 9.2.x backwards compatible with 9.1.x (#8661)
    
    In order to make 9.2.x backwards compatible against plugins compiled
    with 9.1.x, this PR does the following:
    
    1. Adds back exposed enum values removed in 9.2.x
    2. Any added enum values are put at the end of their enumeration lists.
    3. Adds back the TSHttpTxnCntl function
    
    (cherry picked from commit c04ccc82a37dff6d89852cc4548baed610a6db13)
---
 include/ts/apidefs.h.in          |  9 +++--
 include/ts/experimental.h        | 23 +++++++++++++
 plugins/lua/ts_lua_http_config.c | 32 ++++++++++--------
 src/traffic_server/InkAPI.cc     | 72 ++++++++++++++++++++++++++++++++++++++++
 src/traffic_server/InkAPITest.cc | 13 +++++++-
 5 files changed, 133 insertions(+), 16 deletions(-)

diff --git a/include/ts/apidefs.h.in b/include/ts/apidefs.h.in
index e3ebe46..ac550a9 100644
--- a/include/ts/apidefs.h.in
+++ b/include/ts/apidefs.h.in
@@ -437,8 +437,8 @@ typedef enum {
   TS_LIFECYCLE_CLIENT_SSL_CTX_INITIALIZED_HOOK,
   TS_LIFECYCLE_MSG_HOOK,
   TS_LIFECYCLE_TASK_THREADS_READY_HOOK,
-  TS_LIFECYCLE_SSL_SECRET_HOOK,
   TS_LIFECYCLE_SHUTDOWN_HOOK,
+  TS_LIFECYCLE_SSL_SECRET_HOOK,
   TS_LIFECYCLE_LAST_HOOK
 } TSLifecycleHookID;
 
@@ -827,7 +827,6 @@ typedef enum {
   TS_CONFIG_HTTP_CACHE_MAX_OPEN_WRITE_RETRIES,
   TS_CONFIG_HTTP_REDIRECT_USE_ORIG_CACHE_KEY,
   TS_CONFIG_HTTP_ATTACH_SERVER_SESSION_TO_CLIENT,
-  TS_CONFIG_HTTP_MAX_PROXY_CYCLES,
   TS_CONFIG_WEBSOCKET_NO_ACTIVITY_TIMEOUT,
   TS_CONFIG_WEBSOCKET_ACTIVE_TIMEOUT,
   TS_CONFIG_HTTP_UNCACHEABLE_REQUESTS_BYPASS_PARENT,
@@ -856,6 +855,11 @@ typedef enum {
   TS_CONFIG_HTTP_SERVER_MIN_KEEP_ALIVE_CONNS,
   TS_CONFIG_HTTP_PER_SERVER_CONNECTION_MAX,
   TS_CONFIG_HTTP_PER_SERVER_CONNECTION_MATCH,
+#if TS_VERSION_MAJOR < 10
+  /* This is kept in the 9.x releases to preserve the ABI. Remove this in the
+   * 10 release. */
+  TS_CONFIG_SSL_CLIENT_VERIFY_SERVER,
+#endif
   TS_CONFIG_SSL_CLIENT_VERIFY_SERVER_POLICY,
   TS_CONFIG_SSL_CLIENT_VERIFY_SERVER_PROPERTIES,
   TS_CONFIG_SSL_CLIENT_SNI_POLICY,
@@ -863,6 +867,7 @@ typedef enum {
   TS_CONFIG_SSL_CLIENT_CA_CERT_FILENAME,
   TS_CONFIG_HTTP_HOST_RESOLUTION_PREFERENCE,
   TS_CONFIG_HTTP_CONNECT_DEAD_POLICY,
+  TS_CONFIG_HTTP_MAX_PROXY_CYCLES,
   TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_INDEX,
   TS_CONFIG_PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK,
   TS_CONFIG_NET_SOCK_NOTSENT_LOWAT,
diff --git a/include/ts/experimental.h b/include/ts/experimental.h
index deef0ab..b2d020f 100644
--- a/include/ts/experimental.h
+++ b/include/ts/experimental.h
@@ -73,6 +73,29 @@ int64_t TSCacheHttpInfoSizeGet(TSCacheHttpInfo infop);
 tsapi int TSMimeHdrFieldEqual(TSMBuffer bufp, TSMLoc hdr_obj, TSMLoc field1, TSMLoc field2);
 tsapi TSReturnCode TSHttpTxnHookRegisteredFor(TSHttpTxn txnp, TSHttpHookID id, TSEventFunc funcp);
 
+#if TS_VERSION_MAJOR < 10
+
+/* These are kept in the 9.x releases to preserve the ABI. These should be
+ * removed in the ATS 10 release. */
+
+/* Various HTTP "control" modes */
+typedef enum {
+  TS_HTTP_CNTL_GET_LOGGING_MODE,
+  TS_HTTP_CNTL_SET_LOGGING_MODE,
+  TS_HTTP_CNTL_GET_INTERCEPT_RETRY_MODE,
+  TS_HTTP_CNTL_SET_INTERCEPT_RETRY_MODE
+} TSHttpCntlTypeExperimental;
+
+#define TS_HTTP_CNTL_OFF (void *)0
+#define TS_HTTP_CNTL_ON (void *)1
+/* usage:
+   void *onoff = 0;
+   TSHttpTxnCntl(.., TS_HTTP_CNTL_GET_LOGGING_MODE, &onoff);
+   if (onoff == TS_HTTP_CNTL_ON) ....
+*/
+tsapi TSReturnCode TSHttpTxnCntl(TSHttpTxn txnp, TSHttpCntlTypeExperimental cntl, void *data);
+
+#endif
 /* Protocols APIs */
 tsapi void TSVConnCacheHttpInfoSet(TSVConn connp, TSCacheHttpInfo infop);
 
diff --git a/plugins/lua/ts_lua_http_config.c b/plugins/lua/ts_lua_http_config.c
index 9d5463a..5bcc583 100644
--- a/plugins/lua/ts_lua_http_config.c
+++ b/plugins/lua/ts_lua_http_config.c
@@ -133,19 +133,22 @@ typedef enum {
   TS_LUA_CONFIG_HTTP_ALLOW_MULTI_RANGE                        = TS_CONFIG_HTTP_ALLOW_MULTI_RANGE,
   TS_LUA_CONFIG_HTTP_REQUEST_BUFFER_ENABLED                   = TS_CONFIG_HTTP_REQUEST_BUFFER_ENABLED,
   TS_LUA_CONFIG_HTTP_ALLOW_HALF_OPEN                          = TS_CONFIG_HTTP_ALLOW_HALF_OPEN,
-  TS_LUA_CONFIG_SSL_CLIENT_VERIFY_SERVER_POLICY               = TS_CONFIG_SSL_CLIENT_VERIFY_SERVER_POLICY,
-  TS_LUA_CONFIG_SSL_CLIENT_VERIFY_SERVER_PROPERTIES           = TS_CONFIG_SSL_CLIENT_VERIFY_SERVER_PROPERTIES,
-  TS_LUA_CONFIG_SSL_CLIENT_SNI_POLICY                         = TS_CONFIG_SSL_CLIENT_SNI_POLICY,
-  TS_LUA_CONFIG_SSL_CLIENT_PRIVATE_KEY_FILENAME               = TS_CONFIG_SSL_CLIENT_PRIVATE_KEY_FILENAME,
-  TS_LUA_CONFIG_SSL_CLIENT_CA_CERT_FILENAME                   = TS_CONFIG_SSL_CLIENT_CA_CERT_FILENAME,
-  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_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE        = TS_CONFIG_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE,
-  TS_LUA_CONFIG_ENABLE_PARENT_TIMEOUT_MARKDOWNS               = TS_CONFIG_HTTP_ENABLE_PARENT_TIMEOUT_MARKDOWNS,
-  TS_LUA_CONFIG_DISABLE_PARENT_MARKDOWNS                      = TS_CONFIG_HTTP_DISABLE_PARENT_MARKDOWNS,
-  TS_LUA_CONFIG_LAST_ENTRY                                    = TS_CONFIG_LAST_ENTRY,
+#if TS_VERSION_MAJOR < 10
+  TS_LUA_CONFIG_SSL_CLIENT_VERIFY_SERVER = TS_CONFIG_SSL_CLIENT_VERIFY_SERVER,
+#endif
+  TS_LUA_CONFIG_SSL_CLIENT_VERIFY_SERVER_POLICY        = TS_CONFIG_SSL_CLIENT_VERIFY_SERVER_POLICY,
+  TS_LUA_CONFIG_SSL_CLIENT_VERIFY_SERVER_PROPERTIES    = TS_CONFIG_SSL_CLIENT_VERIFY_SERVER_PROPERTIES,
+  TS_LUA_CONFIG_SSL_CLIENT_SNI_POLICY                  = TS_CONFIG_SSL_CLIENT_SNI_POLICY,
+  TS_LUA_CONFIG_SSL_CLIENT_PRIVATE_KEY_FILENAME        = TS_CONFIG_SSL_CLIENT_PRIVATE_KEY_FILENAME,
+  TS_LUA_CONFIG_SSL_CLIENT_CA_CERT_FILENAME            = TS_CONFIG_SSL_CLIENT_CA_CERT_FILENAME,
+  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_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE = TS_CONFIG_BODY_FACTORY_RESPONSE_SUPPRESSION_MODE,
+  TS_LUA_CONFIG_ENABLE_PARENT_TIMEOUT_MARKDOWNS        = TS_CONFIG_HTTP_ENABLE_PARENT_TIMEOUT_MARKDOWNS,
+  TS_LUA_CONFIG_DISABLE_PARENT_MARKDOWNS               = TS_CONFIG_HTTP_DISABLE_PARENT_MARKDOWNS,
+  TS_LUA_CONFIG_LAST_ENTRY                             = TS_CONFIG_LAST_ENTRY,
 } TSLuaOverridableConfigKey;
 
 typedef enum {
@@ -267,6 +270,9 @@ ts_lua_var_item ts_lua_http_config_vars[] = {
   TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_ALLOW_MULTI_RANGE),
   TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_REQUEST_BUFFER_ENABLED),
   TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_ALLOW_HALF_OPEN),
+#if TS_VERSION_MAJOR < 10
+  TS_LUA_MAKE_VAR_ITEM(TS_CONFIG_SSL_CLIENT_VERIFY_SERVER),
+#endif
   TS_LUA_MAKE_VAR_ITEM(TS_CONFIG_SSL_CLIENT_VERIFY_SERVER_POLICY),
   TS_LUA_MAKE_VAR_ITEM(TS_CONFIG_SSL_CLIENT_VERIFY_SERVER_PROPERTIES),
   TS_LUA_MAKE_VAR_ITEM(TS_CONFIG_SSL_CLIENT_SNI_POLICY),
diff --git a/src/traffic_server/InkAPI.cc b/src/traffic_server/InkAPI.cc
index 5ac59e4..2dae1a9 100644
--- a/src/traffic_server/InkAPI.cc
+++ b/src/traffic_server/InkAPI.cc
@@ -6555,6 +6555,72 @@ TSHttpTxnStatusGet(TSHttpTxn txnp)
   return static_cast<TSHttpStatus>(sm->t_state.http_return_code);
 }
 
+#if TS_VERSION_MAJOR < 10
+/* control channel for HTTP */
+TSReturnCode
+TSHttpTxnCntl(TSHttpTxn txnp, TSHttpCntlTypeExperimental cntl, void *data)
+{
+  sdk_assert(sdk_sanity_check_txn(txnp) == TS_SUCCESS);
+
+  HttpSM *sm = (HttpSM *)txnp;
+
+  switch (cntl) {
+  case TS_HTTP_CNTL_GET_LOGGING_MODE: {
+    if (data == nullptr) {
+      return TS_ERROR;
+    }
+
+    intptr_t *rptr = static_cast<intptr_t *>(data);
+
+    if (sm->t_state.api_info.logging_enabled) {
+      *rptr = (intptr_t)TS_HTTP_CNTL_ON;
+    } else {
+      *rptr = (intptr_t)TS_HTTP_CNTL_OFF;
+    }
+
+    return TS_SUCCESS;
+  }
+
+  case TS_HTTP_CNTL_SET_LOGGING_MODE:
+    if (data != TS_HTTP_CNTL_ON && data != TS_HTTP_CNTL_OFF) {
+      return TS_ERROR;
+    } else {
+      sm->t_state.api_info.logging_enabled = (bool)data;
+      return TS_SUCCESS;
+    }
+    break;
+
+  case TS_HTTP_CNTL_GET_INTERCEPT_RETRY_MODE: {
+    if (data == nullptr) {
+      return TS_ERROR;
+    }
+
+    intptr_t *rptr = static_cast<intptr_t *>(data);
+
+    if (sm->t_state.api_info.retry_intercept_failures) {
+      *rptr = (intptr_t)TS_HTTP_CNTL_ON;
+    } else {
+      *rptr = (intptr_t)TS_HTTP_CNTL_OFF;
+    }
+
+    return TS_SUCCESS;
+  }
+
+  case TS_HTTP_CNTL_SET_INTERCEPT_RETRY_MODE:
+    if (data != TS_HTTP_CNTL_ON && data != TS_HTTP_CNTL_OFF) {
+      return TS_ERROR;
+    } else {
+      sm->t_state.api_info.retry_intercept_failures = (bool)data;
+      return TS_SUCCESS;
+    }
+  default:
+    return TS_ERROR;
+  }
+
+  return TS_ERROR;
+}
+
+#endif
 TSReturnCode
 TSHttpTxnCntlSet(TSHttpTxn txnp, TSHttpCntlType cntl, bool data)
 {
@@ -8989,6 +9055,12 @@ _conf_to_memberp(TSOverridableConfigKey conf, OverridableHttpConfigParams *overr
   // This helps avoiding compiler warnings, yet detect unhandled enum members.
   case TS_CONFIG_NULL:
   case TS_CONFIG_LAST_ENTRY:
+#if TS_VERSION_MAJOR < 10
+
+  // The following is not used in 9.2.x, but preserved for ABI compatibility.
+  case TS_CONFIG_SSL_CLIENT_VERIFY_SERVER:
+
+#endif
     break;
   }
 
diff --git a/src/traffic_server/InkAPITest.cc b/src/traffic_server/InkAPITest.cc
index e1d547e..3c57ec6 100644
--- a/src/traffic_server/InkAPITest.cc
+++ b/src/traffic_server/InkAPITest.cc
@@ -8662,7 +8662,6 @@ std::array<std::string_view, TS_CONFIG_LAST_ENTRY> SDK_Overridable_Configs = {
    "proxy.config.http.cache.max_open_write_retries",
    "proxy.config.http.redirect_use_orig_cache_key",
    "proxy.config.http.attach_server_session_to_client",
-   "proxy.config.http.max_proxy_cycles",
    "proxy.config.websocket.no_activity_timeout",
    "proxy.config.websocket.active_timeout",
    "proxy.config.http.uncacheable_requests_bypass_parent",
@@ -8690,6 +8689,9 @@ std::array<std::string_view, TS_CONFIG_LAST_ENTRY> SDK_Overridable_Configs = {
    OutboundConnTrack::CONFIG_VAR_MIN,
    OutboundConnTrack::CONFIG_VAR_MAX,
    OutboundConnTrack::CONFIG_VAR_MATCH,
+#if TS_VERSION_MAJOR < 10
+   "proxy.config.ssl.client.verify.server",
+#endif
    "proxy.config.ssl.client.verify.server.policy",
    "proxy.config.ssl.client.verify.server.properties",
    "proxy.config.ssl.client.sni_policy",
@@ -8697,6 +8699,7 @@ std::array<std::string_view, TS_CONFIG_LAST_ENTRY> SDK_Overridable_Configs = {
    "proxy.config.ssl.client.CA.cert.filename",
    "proxy.config.hostdb.ip_resolve",
    "proxy.config.http.connect.dead.policy",
+   "proxy.config.http.max_proxy_cycles",
    "proxy.config.plugin.vc.default_buffer_index",
    "proxy.config.plugin.vc.default_buffer_water_mark",
    "proxy.config.net.sock_notsent_lowat",
@@ -8725,6 +8728,14 @@ REGRESSION_TEST(SDK_API_OVERRIDABLE_CONFIGS)(RegressionTest *test, int /* atype
   *pstatus = REGRESSION_TEST_INPROGRESS;
   for (int i = 0; i < static_cast<int>(SDK_Overridable_Configs.size()); ++i) {
     std::string_view conf{SDK_Overridable_Configs[i]};
+#if TS_VERSION_MAJOR < 10
+    if (conf == "proxy.config.ssl.client.verify.server") {
+      // TODO: remove this in 10.x. Kept here because we keep the
+      // `TS_CONFIG_SSL_CLIENT_VERIFY_SERVER` in 9.x to preserve ABI
+      // compatibility in the 9.x releases.
+      continue;
+    }
+#endif
 
     if (TS_SUCCESS == TSHttpTxnConfigFind(conf.data(), -1, &key, &type)) {
       if (key != i) {