Repository: trafficserver Updated Branches: refs/heads/master edf9ff13d -> 824f2ab7b
TS-4115: Add a multi origin hierarchy to parent selection. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/824f2ab7 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/824f2ab7 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/824f2ab7 Branch: refs/heads/master Commit: 824f2ab7bde25b9b7f8da48fdf36bc3278920444 Parents: edf9ff1 Author: John J. Rushford <[email protected]> Authored: Tue Feb 23 20:59:49 2016 +0000 Committer: John J. Rushford <[email protected]> Committed: Wed Mar 16 15:15:30 2016 +0000 ---------------------------------------------------------------------- doc/admin-guide/files/parent.config.en.rst | 12 +++++++++++ proxy/ParentConsistentHash.cc | 4 ++-- proxy/ParentRoundRobin.cc | 6 +++--- proxy/ParentSelection.cc | 11 ++++++++++ proxy/ParentSelection.h | 7 ++++--- proxy/http/HttpTransact.cc | 28 ++++++++++++++++--------- 6 files changed, 50 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/824f2ab7/doc/admin-guide/files/parent.config.en.rst ---------------------------------------------------------------------- diff --git a/doc/admin-guide/files/parent.config.en.rst b/doc/admin-guide/files/parent.config.en.rst index e3d8952..a8554f8 100644 --- a/doc/admin-guide/files/parent.config.en.rst +++ b/doc/admin-guide/files/parent.config.en.rst @@ -138,6 +138,18 @@ The following list shows the possible actions and their allowed values. list, then the request will be re-tried from a server found in this list using a consistent hash of the url. +.. _parent-config-format-parent-is-proxy: + +``parent_is_proxy`` + One of the following values: + + - ``true`` - This is the default. The list of parents and secondary parents + are proxy cache servers. + - ``false`` - The list of parents and secondary parents are the origin + servers ``go_direct`` flag is ignored and origins are selected using + the specified ``round_robin`` algorithm. The FQDN is removed from + the http request line. + .. _parent-config-format-round-robin: ``round_robin`` http://git-wip-us.apache.org/repos/asf/trafficserver/blob/824f2ab7/proxy/ParentConsistentHash.cc ---------------------------------------------------------------------- diff --git a/proxy/ParentConsistentHash.cc b/proxy/ParentConsistentHash.cc index 6233bdc..67318bd 100644 --- a/proxy/ParentConsistentHash.cc +++ b/proxy/ParentConsistentHash.cc @@ -105,7 +105,7 @@ ParentConsistentHash::selectParent(const ParentSelectionPolicy *policy, bool fir // Should only get into this state if we are supposed to go direct. if (parents[PRIMARY] == NULL && parents[SECONDARY] == NULL) { - if (result->rec->go_direct == true) { + if (result->rec->go_direct == true && result->rec->parent_is_proxy == true) { result->r = PARENT_DIRECT; } else { result->r = PARENT_FAIL; @@ -207,7 +207,7 @@ ParentConsistentHash::selectParent(const ParentSelectionPolicy *policy, bool fir ink_assert(result->port != 0); Debug("parent_select", "Chosen parent: %s.%d", result->hostname, result->port); } else { - if (result->rec->go_direct == true) { + if (result->rec->go_direct == true && result->rec->parent_is_proxy == true) { result->r = PARENT_DIRECT; } else { result->r = PARENT_FAIL; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/824f2ab7/proxy/ParentRoundRobin.cc ---------------------------------------------------------------------- diff --git a/proxy/ParentRoundRobin.cc b/proxy/ParentRoundRobin.cc index d2a77d0..ac453d3 100644 --- a/proxy/ParentRoundRobin.cc +++ b/proxy/ParentRoundRobin.cc @@ -68,7 +68,7 @@ ParentRoundRobin::selectParent(const ParentSelectionPolicy *policy, bool first_c // if we are supposed to go direct ink_assert(result->rec->go_direct == true); // Could not find a parent - if (result->rec->go_direct == true) { + if (result->rec->go_direct == true && result->rec->parent_is_proxy == true) { result->r = PARENT_DIRECT; } else { result->r = PARENT_FAIL; @@ -111,7 +111,7 @@ ParentRoundRobin::selectParent(const ParentSelectionPolicy *policy, bool first_c // We've wrapped around so bypass if we can if (bypass_ok == true) { // Could not find a parent - if (result->rec->go_direct == true) { + if (result->rec->go_direct == true && result->rec->parent_is_proxy == true) { result->r = PARENT_DIRECT; } else { result->r = PARENT_FAIL; @@ -166,7 +166,7 @@ ParentRoundRobin::selectParent(const ParentSelectionPolicy *policy, bool first_c cur_index = (cur_index + 1) % result->rec->num_parents; } while ((unsigned int)cur_index != result->start_parent); - if (result->rec->go_direct == true) { + if (result->rec->go_direct == true && result->rec->parent_is_proxy == true) { result->r = PARENT_DIRECT; } else { result->r = PARENT_FAIL; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/824f2ab7/proxy/ParentSelection.cc ---------------------------------------------------------------------- diff --git a/proxy/ParentSelection.cc b/proxy/ParentSelection.cc index f4e9ebb..d4096eb 100644 --- a/proxy/ParentSelection.cc +++ b/proxy/ParentSelection.cc @@ -478,6 +478,7 @@ ParentRecord::DefaultInit(char *val) this->go_direct = true; this->ignore_query = false; this->scheme = NULL; + this->parent_is_proxy = true; errPtr = ProcessParents(val, true); if (errPtr != NULL) { @@ -560,6 +561,15 @@ ParentRecord::Init(matcher_line *line_info) this->ignore_query = false; } used = true; + } else if (strcasecmp(label, "parent_is_proxy") == 0) { + if (strcasecmp(val, "false") == 0) { + parent_is_proxy = false; + } else if (strcasecmp(val, "true") != 0) { + errPtr = "invalid argument to parent_is_proxy directed"; + } else { + parent_is_proxy = true; + } + used = true; } // Report errors generated by ProcessParents(); if (errPtr != NULL) { @@ -647,6 +657,7 @@ ParentRecord::Print() printf(" %s:%d ", parents[i].hostname, parents[i].port); } printf(" direct=%s\n", (go_direct == true) ? "true" : "false"); + printf(" parent_is_proxy=%s\n", (parent_is_proxy == true) ? "true" : "false"); } // ParentRecord* createDefaultParent(char* val) http://git-wip-us.apache.org/repos/asf/trafficserver/blob/824f2ab7/proxy/ParentSelection.h ---------------------------------------------------------------------- diff --git a/proxy/ParentSelection.h b/proxy/ParentSelection.h index 33adc0a..af0ea8e 100644 --- a/proxy/ParentSelection.h +++ b/proxy/ParentSelection.h @@ -90,7 +90,7 @@ class ParentRecord : public ControlBase public: ParentRecord() : parents(NULL), secondary_parents(NULL), num_parents(0), num_secondary_parents(0), ignore_query(false), rr_next(0), - go_direct(true), selection_strategy(NULL) + go_direct(true), parent_is_proxy(true), selection_strategy(NULL) { } @@ -117,6 +117,7 @@ public: bool ignore_query; volatile uint32_t rr_next; bool go_direct; + bool parent_is_proxy; ParentSelectionStrategy *selection_strategy; }; @@ -163,13 +164,13 @@ struct ParentSelectionPolicy { class ParentSelectionStrategy { public: - // void selectParent(const ParentSelectionPolicy, *policy, bool firstCall, ParentResult *result, RequestData *rdata) + // void selectParent(const ParentSelectionPolicy *policy, bool firstCall, ParentResult *result, RequestData *rdata) // // The implementation parent lookup. // virtual void selectParent(const ParentSelectionPolicy *policy, bool firstCall, ParentResult *result, RequestData *rdata) = 0; - // void markParentDown(const ParentSelectionPolicy, *policy, ParentResult* rsult) + // void markParentDown(const ParentSelectionPolicy *policy, ParentResult *result) // // Marks the parent pointed to by result as down // http://git-wip-us.apache.org/repos/asf/trafficserver/blob/824f2ab7/proxy/http/HttpTransact.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransact.cc b/proxy/http/HttpTransact.cc index 362c63b..55654d6 100644 --- a/proxy/http/HttpTransact.cc +++ b/proxy/http/HttpTransact.cc @@ -210,11 +210,12 @@ find_server_and_update_current_info(HttpTransact::State *s) // I just wanted to do this for cop heartbeats, someone else // wanted it for all requests to local_host. s->parent_result.r = PARENT_DIRECT; - } else if (s->method == HTTP_WKSIDX_CONNECT && s->http_config_param->disable_ssl_parenting) { + } else if (s->method == HTTP_WKSIDX_CONNECT && s->http_config_param->disable_ssl_parenting && + s->parent_result.rec->parent_is_proxy) { s->parent_result.r = PARENT_DIRECT; } else if (s->http_config_param->uncacheable_requests_bypass_parent && s->http_config_param->no_dns_forward_to_parent == 0 && - !HttpTransact::is_request_cache_lookupable(s)) { - // request not lookupable and cacheable, so bypass parent + !HttpTransact::is_request_cache_lookupable(s) && s->parent_result.rec->parent_is_proxy) { + // request not lookupable and cacheable, so bypass parent if the parent is not an origin server. // Note that the configuration of the proxy as well as the request // itself affects the result of is_request_cache_lookupable(); // we are assuming both child and parent have similar configuration @@ -246,7 +247,7 @@ find_server_and_update_current_info(HttpTransact::State *s) // 2) the config permits us // 3) the config permitted us to dns the origin server if (!s->parent_params->apiParentExists(&s->request_data) && s->parent_result.rec->bypass_ok() && - s->http_config_param->no_dns_forward_to_parent == 0) { + s->http_config_param->no_dns_forward_to_parent == 0 && s->parent_result.rec->parent_is_proxy) { s->parent_result.r = PARENT_DIRECT; } break; @@ -7784,12 +7785,19 @@ HttpTransact::build_request(State *s, HTTPHdr *base_request, HTTPHdr *outgoing_r // If we're going to a parent proxy, make sure we pass host and port // in the URL even if we didn't get them (e.g. transparent proxy) - if (s->current.request_to == PARENT_PROXY && !outgoing_request->is_target_in_url()) { - DebugTxn("http_trans", "[build_request] adding target to URL for parent proxy"); - - // No worry about HTTP/0.9 because we reject forward proxy requests that - // don't have a host anywhere. - outgoing_request->set_url_target_from_host_field(); + if (s->current.request_to == PARENT_PROXY) { + if (!outgoing_request->is_target_in_url() && s->parent_result.rec->parent_is_proxy) { + DebugTxn("http_trans", "[build_request] adding target to URL for parent proxy"); + + // No worry about HTTP/0.9 because we reject forward proxy requests that + // don't have a host anywhere. + outgoing_request->set_url_target_from_host_field(); + } else if (s->current.request_to == PARENT_PROXY && !s->parent_result.rec->parent_is_proxy && + outgoing_request->is_target_in_url()) { + // If the parent is an origin server remove the hostname from the url. + DebugTxn("http_trans", "[build_request] removing target from URL for a parent origin."); + HttpTransactHeaders::remove_host_name_from_url(outgoing_request); + } } // If the response is most likely not cacheable, eg, request with Authorization,
