[
https://issues.apache.org/jira/browse/TS-4707?focusedWorklogId=28461&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-28461
]
ASF GitHub Bot logged work on TS-4707:
--------------------------------------
Author: ASF GitHub Bot
Created on: 08/Sep/16 17:17
Start Date: 08/Sep/16 17:17
Worklog Time Spent: 10m
Work Description: Github user jpeach commented on a diff in the pull
request:
https://github.com/apache/trafficserver/pull/834#discussion_r78049613
--- Diff: proxy/ParentConsistentHash.cc ---
@@ -64,23 +67,127 @@ ParentConsistentHash::getPathHash(HttpRequestData
*hrdata, ATSHash64 *h)
const char *tmp = NULL;
int len;
URL *url = hrdata->hdr->url_get();
+ char buffer[1024];
+ int slen = 0;
+ int num_dirs = 0;
+
+ // Use over-ride URL from HttpTransact::State's
cache_info.parent_selection_url, if present.
+ URL *ps_url = NULL;
+ Debug("parent_select", "ParentConsistentHash::%s()
hrdata->cache_info_parent_selection_url = 0x%lx", __func__,
+ (unsigned long int)hrdata->cache_info_parent_selection_url);
+ if (hrdata->cache_info_parent_selection_url) {
+ ps_url = *(hrdata->cache_info_parent_selection_url);
+ Debug("parent_select", "ParentConsistentHash::%s() ps_url = 0x%lx",
__func__, (unsigned long int)ps_url);
+ if (ps_url) {
+ tmp = ps_url->string_get_ref(&len);
+ if (tmp && len > 0) {
+ // Print the over-ride URL
+ if (is_debug_tag_set("parent_select")) {
+ slen = (len > 1023) ? 1023 : len;
+ strncpy(buffer, tmp, slen);
+ buffer[slen] = 0;
+ Debug("parent_select", "ParentConsistentHash::%s() Using
Over-Ride String='%s'.", __func__, buffer);
+ }
+ h->update(tmp, len);
+ goto done;
+ }
+ }
+ }
// Always hash on '/' because paths returned by ATS are always stripped
of it
h->update("/", 1);
tmp = url->path_get(&len);
- if (tmp) {
+
+ if (tmp && len > 0) {
+ // Print Original Path
+ if (is_debug_tag_set("parent_select")) {
+ slen = (len > 1023) ? 1023 : len;
+ strncpy(buffer, tmp, slen);
+ buffer[slen] = 0;
+ Debug("parent_select", "ParentConsistentHash::%s() Original
Path='%s'.", __func__, buffer);
+ }
+
+ // Process max_dirs directive.
+ if (max_dirs != 0) {
+ // Determine number of directory components in the path.
+ // NOTE: Leading '/' is gone already.
+ for (int x = 0; x < len; x++) {
+ if (tmp[x] == '/')
+ num_dirs++;
+ }
+ // If max_dirs positive , include directory components from the left
up to max_dirs.
+ // If max_dirs negative , include directory components from the left
up to num_dirs - ( abs(max_dirs) - 1 ).
+ int limit = 0;
+ if (max_dirs > 0)
+ limit = max_dirs;
+ else if (max_dirs < 0) {
+ int md = abs(max_dirs) - 1;
+ if (md < num_dirs)
+ limit = num_dirs - md;
+ else
+ limit = 0;
+ }
+ if (limit > 0) {
+ int x = 0;
+ int count = 0;
+ for (; x < len; x++) {
+ if (tmp[x] == '/')
+ count++;
+ if (count == limit) {
+ len = x + 1;
+ break;
+ }
+ }
+ } else {
+ len = 0;
+ }
+ }
+
+ // Print Post max_dirs Path
+ if (is_debug_tag_set("parent_select")) {
+ slen = (len > 1023) ? 1023 : len;
+ strncpy(buffer, tmp, slen);
+ buffer[slen] = 0;
+ Debug("parent_select", "ParentConsistentHash::%s() Post-MD
Path='%s'.", __func__, buffer);
+ }
+
+ if (ignore_fname || max_dirs != 0) {
+ int x = len - 1;
+ for (; x >= 0; x--) {
+ char c = tmp[x];
+ if (c == '/')
+ break;
+ }
+ len = x + 1;
+ }
+
+ // Print Post fname Path
+ if (is_debug_tag_set("parent_select")) {
+ slen = (len > 1023) ? 1023 : len;
+ strncpy(buffer, tmp, slen);
+ buffer[slen] = 0;
+ Debug("parent_select", "ParentConsistentHash::%s() Post-FN
Path='%s'.", __func__, buffer);
+ }
+
h->update(tmp, len);
}
- if (!ignore_query) {
+ if (!ignore_query && !ignore_fname && max_dirs == 0) {
tmp = url->query_get(&len);
if (tmp) {
h->update("?", 1);
h->update(tmp, len);
+ if (is_debug_tag_set("parent_select")) {
+ slen = (len > 1023) ? 1023 : len;
+ strncpy(buffer, tmp, slen);
+ buffer[slen] = 0;
+ Debug("parent_select", "ParentConsistentHash::%s() Added query
arguments to hash. Query='%s'.", __func__, buffer);
--- End diff --
Since there are ~4 copies of this, you should wrap it up into a helper
function.
Issue Time Tracking
-------------------
Worklog Id: (was: 28461)
Time Spent: 3h 40m (was: 3.5h)
> Parent Consistent Hash Selection - add fname and maxdirs options.
> -----------------------------------------------------------------
>
> Key: TS-4707
> URL: https://issues.apache.org/jira/browse/TS-4707
> Project: Traffic Server
> Issue Type: Improvement
> Components: Parent Proxy
> Reporter: Peter Chou
> Assignee: Peter Chou
> Fix For: 7.0.0
>
> Time Spent: 3h 40m
> Remaining Estimate: 0h
>
> This enhancement adds two options, "fname" and "maxdirs", which can be used
> to exclude the file-name and some of the directories in the path. The
> remaining portions of the path are then used as part of the hash computation
> for selecting among multiple parent caches.
> For our usage, it was desirable from an operational perspective to direct all
> components of particular sub-tree to a single parent cache (to simplify
> trouble-shooting, pre-loading, etc.). This can be achieved by excluding the
> query-string, file-name, and right-most portions of the path from the hash
> computation.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)