[ https://issues.apache.org/jira/browse/TS-4707?focusedWorklogId=28707&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-28707 ]
ASF GitHub Bot logged work on TS-4707: -------------------------------------- Author: ASF GitHub Bot Created on: 10/Sep/16 00:31 Start Date: 10/Sep/16 00:31 Worklog Time Spent: 10m Work Description: Github user pbchou commented on a diff in the pull request: https://github.com/apache/trafficserver/pull/834#discussion_r78266512 --- 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; --- End diff -- @jpeach -- It is looking for the last occurrence of '/' similar to strrchr(), but that function is not used since this is not a NULL terminated string. I hope this (and the comments and re-factoring requested by @PSUdaemon ) address your concerns. Issue Time Tracking ------------------- Worklog Id: (was: 28707) Time Spent: 7h 20m (was: 7h 10m) > 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: 7h 20m > 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)