[ 
https://issues.apache.org/jira/browse/TS-4723?focusedWorklogId=26925&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-26925
 ]

ASF GitHub Bot logged work on TS-4723:
--------------------------------------

                Author: ASF GitHub Bot
            Created on: 23/Aug/16 14:40
            Start Date: 23/Aug/16 14:40
    Worklog Time Spent: 10m 
      Work Description: Github user SolidWallOfCode commented on a diff in the 
pull request:

    https://github.com/apache/trafficserver/pull/843#discussion_r75879815
  
    --- Diff: plugins/experimental/carp/UrlComponents.h ---
    @@ -0,0 +1,219 @@
    +/** @file
    +
    + URL helper
    +
    +  @section license License
    +
    +  Licensed to the Apache Software Foundation (ASF) under one
    +  or more contributor license agreements.  See the NOTICE file
    +  distributed with this work for additional information
    +  regarding copyright ownership.  The ASF licenses this file
    +  to you under the Apache License, Version 2.0 (the
    +  "License"); you may not use this file except in compliance
    +  with the License.  You may obtain a copy of the License at
    +
    +      http://www.apache.org/licenses/LICENSE-2.0
    +
    +  Unless required by applicable law or agreed to in writing, software
    +  distributed under the License is distributed on an "AS IS" BASIS,
    +  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +  See the License for the specific language governing permissions and
    +  limitations under the License.
    + */
    +#ifndef __URLCOMPONENTS_H__
    +#define __URLCOMPONENTS_H__ 1
    +
    +#include <cstdio>
    
+///////////////////////////////////////////////////////////////////////////////
    +// Class holding one request URL's component.
    +//
    +
    +struct UrlComponents
    +{
    +
    +  UrlComponents()
    +  : _port(0)
    +  {
    +  }
    +
    +  void populate(TSMBuffer bufp, TSMLoc urlLoc)
    +  {
    +    int scheme_len;
    +    int host_len;
    +    int path_len;
    +    int query_len;
    +    int matrix_len;
    +
    +    const char* scheme = TSUrlSchemeGet(bufp, urlLoc, &scheme_len);
    +    const char* host = TSUrlHostGet(bufp, urlLoc, &host_len);
    +    const char* path = TSUrlPathGet(bufp, urlLoc, &path_len);
    +    const char* query = TSUrlHttpQueryGet(bufp, urlLoc, &query_len);
    +    const char* matrix = TSUrlHttpParamsGet(bufp, urlLoc, &matrix_len);
    +    _port = TSUrlPortGet(bufp, urlLoc);
    +
    +    _scheme.assign(scheme, scheme_len);
    +    _host.assign(host, host_len);
    +    _path.assign(path, path_len);
    +    _query.assign(query, query_len);
    +    _matrix.assign(matrix, matrix_len);
    +
    +  }
    +
    +  // get entire url (e.g.http://host/path?query)
    +  void construct(std::string & url)
    +  {
    +    // schemeExtra= :// = 3
    +    // portExtra = :xxxxx = 6
    +    // just in case extra = 32
    +    size_t iLen = _scheme.size() + _host.size() + _path.size() + 
_query.size() + _matrix.size() + 3 + 6 + 32;
    +    url.reserve(iLen);
    +
    +    size_t pos = _host.find(":");
    +    if (pos != std::string::npos) {
    +      // Strip the embeded port 
    +      // If the port is non-standard it will be added back below
    +      _host.resize(pos);
    +    }
    +
    +    const int bitAddPort = 1;
    +    const int bitAddQuery = 1 << 1;
    +    const int bitAddMatrix = 1 << 2;
    +    int bitField = bitAddPort; // add port by default
    +    if ((_scheme.compare("http") == 0 && _port == 80) || 
(_scheme.compare("https") == 0 && _port == 443) ) bitField &= ~bitAddPort;
    +    if (_query.size() != 0) bitField |= bitAddQuery;
    +    if (_matrix.size() != 0) bitField |= bitAddMatrix;
    +
    +    switch (bitField) {
    +    case 0: // default port, no query, no matrix
    +      url = _scheme + "://" + _host + "/" + _path;
    +      break;
    +
    +    case bitAddPort:
    +    { //  port, no query, no matrix
    +      char sTemp[10];
    +      url = _scheme + "://" + _host + ":";
    +      sprintf(sTemp, "%d", _port);
    +      url += sTemp;
    +      url += "/" + _path;
    +      break;
    +    }
    +
    +    case bitAddQuery: //  default port, with query, no matrix
    +      url = _scheme + "://" + _host + "/" + _path + "?" + _query;
    +      break;
    +    case bitAddQuery | bitAddMatrix: //  default port, with query, with 
matrix (even possible?)
    +      url = _scheme + "://" + _host + "/" + _path + ";" + _matrix + "?" + 
_query;
    +      break;
    +
    +    case bitAddMatrix: //  default port, no query, with matrix
    +      url = _scheme + "://" + _host + "/" + _path + ";" + _matrix;
    +      break;
    +
    +    case bitAddPort | bitAddQuery: //  port, with query, no matrix
    +    { //port, with query, with matrix (even possible?)
    +      char sTemp[10];
    +      url = _scheme + "://" + _host + ":";
    +      sprintf(sTemp, "%d", _port);
    +      url += sTemp;
    +      url += "/" + _path + "?" + _query;
    +      break;
    +    }
    +
    +    case bitAddPort | bitAddQuery | bitAddMatrix:
    +    { //port, with query, with matrix (even possible?)
    +      char sTemp[10];
    +      url = _scheme + "://" + _host + ":";
    +      sprintf(sTemp, "%d", _port);
    +      url += sTemp;
    +      url += "/" + _path + ";" + _matrix + "?" + _query;
    +      break;
    +    }
    +
    +    case bitAddPort | bitAddMatrix:
    +    { //  port, no query, with matrix
    +      char sTemp[10];
    +      url = _scheme + "://" + _host + ":";
    +      sprintf(sTemp, "%d", _port);
    +      url += sTemp;
    +      url += "/" + _path + ";" + _matrix;
    +      break;
    +    }
    +    }
    +  }
    +
    +  // get path w/query or matrix
    +  void getCompletePathString(std::string& p) 
    +  {
    +       // schemeExtra= :// = 3
    +    // portExtra = :xxxxx = 6
    +    // just in case extra = 32
    +    size_t iLen = _path.size() + _query.size() + _matrix.size() + 3 + 6 + 
32;
    +    p.reserve(iLen);
    +
    +    int bitField=0;
    +    const int bitAddQuery = 1 << 1;
    +    const int bitAddMatrix = 1 << 2;
    +    if (_query.size() != 0) bitField |= bitAddQuery;
    +    if (_matrix.size() != 0) bitField |= bitAddMatrix;
    +
    +    switch (bitField) {
    --- End diff --
    
    Can this be unified with the previous method, rather than duplicated?


Issue Time Tracking
-------------------

    Worklog Id:     (was: 26925)
    Time Spent: 7h 10m  (was: 7h)

> ATS CARP Plugin
> ---------------
>
>                 Key: TS-4723
>                 URL: https://issues.apache.org/jira/browse/TS-4723
>             Project: Traffic Server
>          Issue Type: New Feature
>          Components: Plugins
>            Reporter: Eric Schwartz
>            Assignee: Eric Schwartz
>             Fix For: 7.0.0
>
>          Time Spent: 7h 10m
>  Remaining Estimate: 0h
>
> Open sourcing this plugin we use internally within Yahoo in place of 
> hierarchical caching.
> CARP is a plugin that allows you to group a bunch of ATS hosts into a cluster 
> and share cache space across the entire group. This is done with consistent 
> hashing on the object URL to generate an "owner" node in the cluster. 
> Requests to any other node in the cluster will be forwarded on to the 
> corresponding owner. More info in the README.
> Difference from internal version of note:
> I've ripped out some code we weren't entirely sure we could open source 
> because of a hash function. If it turns out that we can open source this, 
> I'll do so. The CarpHashAlgorithm class is meant to be extensible, so any 
> consistent hash function can replace it. The function included here is pretty 
> straightforward but not what we use in production, so just wanted to use that 
> caveat.
> One last caveat:
> You'll see some code and documentation in here for object replication. This 
> is something I added recently to CARP that allows you to specify an object be 
> replicated a certain number of times in the cluster. This is useful if you 
> have a network partition or if you're performing some sort of update. When an 
> object's primary owner is unreachable, a node in the cluster can go to the 
> secondary owner if it's available rather than having to fall all the way back 
> to origin. While I've done some initial testing on this with my own cluster 
> of hosts, it's not been tested in production so use at your own risk for now. 
> I'll be sure to keep the open source community informed on the progress of 
> our tests with this feature.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to