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