You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jr...@apache.org on 2018/04/25 16:09:35 UTC

[trafficserver] branch master updated: Parent Selection -- Make self-detection configurable.

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

jrushford 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 1da1499  Parent Selection -- Make self-detection configurable.
1da1499 is described below

commit 1da149923f4f28c0b382b5299f5cfa5e7ab9bcf1
Author: Peter Chou <pb...@labs.att.com>
AuthorDate: Tue Apr 24 10:33:14 2018 -0700

    Parent Selection -- Make self-detection configurable.
    
    * Adds a new configuration option "proxy.config.http.parent_proxy.self_detect" that
      enables "1" or disables "0" the self detection filtering of parent lists
      specified in parent.config. The default is "1".
    
    * The self detect filtering only filters on the host rather than the host:port so this
      filtering can interfere with certain configurations such as test/dev hosts
      that have multiple instances of ATS running on different ports.
    
    * Also, modified the string-tokenizer delimiter in PreProcessParents() to include
      ";, " rather than just ";" since the ProcessParents() delimiter includes these characters.
---
 doc/admin-guide/files/records.config.en.rst |  5 +++++
 mgmt/RecordsConfig.cc                       |  2 ++
 proxy/ParentSelection.cc                    | 21 ++++++++++++++-------
 3 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/doc/admin-guide/files/records.config.en.rst b/doc/admin-guide/files/records.config.en.rst
index b5f30ea..9ac0102 100644
--- a/doc/admin-guide/files/records.config.en.rst
+++ b/doc/admin-guide/files/records.config.en.rst
@@ -1317,6 +1317,11 @@ Parent Proxy Configuration
 
 .. ts:cv:: CONFIG proxy.local.http.parent_proxy.disable_connect_tunneling INT 0
 
+.. ts:cv:: CONFIG proxy.config.http.parent_proxy.self_detect INT 1
+
+   Filter out hosts that are determined to be the same as the current host, e.g., localhost,
+   that have been specified in any parent and secondary_parent lists in the parent.config file.
+
 HTTP Connection Timeouts
 ========================
 
diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc
index 7b1fa78..ce159ce 100644
--- a/mgmt/RecordsConfig.cc
+++ b/mgmt/RecordsConfig.cc
@@ -446,6 +446,8 @@ static const RecordElement RecordsConfig[] =
   ,
   {RECT_CONFIG, "proxy.config.http.parent_proxy.mark_down_hostdb", RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_INT, "[0-1]", RECA_NULL}
   ,
+  {RECT_CONFIG, "proxy.config.http.parent_proxy.self_detect", RECD_INT, "1", RECU_DYNAMIC, RR_NULL, RECC_NULL, nullptr, 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/proxy/ParentSelection.cc b/proxy/ParentSelection.cc
index 3ceeab9..86d8de7 100644
--- a/proxy/ParentSelection.cc
+++ b/proxy/ParentSelection.cc
@@ -40,6 +40,7 @@ typedef ControlMatcher<ParentRecord, ParentResult> P_table;
 // Global Vars for Parent Selection
 static const char modulePrefix[]                             = "[ParentSelection]";
 static ConfigUpdateHandler<ParentConfig> *parentConfigUpdate = nullptr;
+static int self_detect                                       = 1;
 
 // Config var names
 static const char *file_var      = "proxy.config.http.parent_proxy.file";
@@ -350,33 +351,34 @@ ParentRecord::PreProcessParents(const char *val, const int line_num, char *buf,
   char *_val                      = static_cast<char *>(ats_strndup(val, strlen(val)));
   char fqdn[TS_MAX_HOST_NAME_LEN] = {0}, *nm, *token, *savePtr;
   std::string str;
-  Machine *machine = Machine::instance();
+  Machine *machine                   = Machine::instance();
+  constexpr char PARENT_DELIMITERS[] = ";, ";
 
   strncpy(_val, val, strlen(val));
 
-  token = strtok_r(_val, ";", &savePtr);
+  token = strtok_r(_val, PARENT_DELIMITERS, &savePtr);
   while (token != nullptr) {
     if ((nm = strchr(token, ':')) != nullptr) {
       size_t len = (nm - token);
       ink_assert(len < sizeof(fqdn));
       memset(fqdn, 0, sizeof(fqdn));
       strncpy(fqdn, token, len);
-      if (machine->is_self(fqdn)) {
+      if (self_detect && machine->is_self(fqdn)) {
         Debug("parent_select", "token: %s, matches this machine.  Removing self from parent list at line %d", fqdn, line_num);
-        token = strtok_r(nullptr, ";", &savePtr);
+        token = strtok_r(nullptr, PARENT_DELIMITERS, &savePtr);
         continue;
       }
     } else {
-      if (machine->is_self(token)) {
+      if (self_detect && machine->is_self(token)) {
         Debug("parent_select", "token: %s, matches this machine.  Removing self from parent list at line %d", token, line_num);
-        token = strtok_r(nullptr, ";", &savePtr);
+        token = strtok_r(nullptr, PARENT_DELIMITERS, &savePtr);
         continue;
       }
     }
 
     str += token;
     str += ";";
-    token = strtok_r(nullptr, ";", &savePtr);
+    token = strtok_r(nullptr, PARENT_DELIMITERS, &savePtr);
   }
   strncpy(buf, str.c_str(), len);
   ats_free(_val);
@@ -580,10 +582,15 @@ ParentRecord::Init(matcher_line *line_info)
   bool used              = false;
   ParentRR_t round_robin = P_NO_ROUND_ROBIN;
   char buf[128];
+  RecInt rec_self_detect = 1;
 
   this->line_num = line_info->line_num;
   this->scheme   = nullptr;
 
+  if (RecGetRecordInt("proxy.config.http.parent_proxy.self_detect", &rec_self_detect) == REC_ERR_OKAY) {
+    self_detect = static_cast<int>(rec_self_detect);
+  }
+
   for (int i = 0; i < MATCHER_MAX_TOKENS; i++) {
     used  = false;
     label = line_info->line[0][i];

-- 
To stop receiving notification emails like this one, please contact
jrushford@apache.org.