[ 
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)

Reply via email to