You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by bc...@apache.org on 2013/09/05 02:32:01 UTC
git commit: TS-2113 - Porting balancer over to ATS,
still more work to be done
Updated Branches:
refs/heads/master 5ba16cb66 -> ae49e1663
TS-2113 - Porting balancer over to ATS, still more work to be done
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/ae49e166
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/ae49e166
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/ae49e166
Branch: refs/heads/master
Commit: ae49e16639b35e9304adf6a3ef41ce77bb2612f6
Parents: 5ba16cb
Author: Bryan Call <bc...@apache.org>
Authored: Wed Sep 4 17:31:12 2013 -0700
Committer: Bryan Call <bc...@apache.org>
Committed: Wed Sep 4 17:31:12 2013 -0700
----------------------------------------------------------------------
plugins/experimental/balancer/balancer.cc | 46 ++++++++++++--------------
plugins/experimental/balancer/hashkey.h | 44 +++++++++++++-----------
plugins/experimental/balancer/resources.h | 36 ++++++--------------
3 files changed, 57 insertions(+), 69 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/ae49e166/plugins/experimental/balancer/balancer.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/balancer/balancer.cc b/plugins/experimental/balancer/balancer.cc
index 8b8a5a1..adc91ad 100644
--- a/plugins/experimental/balancer/balancer.cc
+++ b/plugins/experimental/balancer/balancer.cc
@@ -41,8 +41,8 @@
#include <string>
-#include <ts/ts.h>
#include <ts/remap.h>
+#include <ts/ts.h>
#include "resources.h"
#include "hashkey.h"
@@ -151,25 +151,24 @@ public:
if (TSIsDebugTagSet("balancer")) {
TSDebug("balancer", "Making %s hash ID's using %s", secondary ? "secondary" : "primary", buf);
}
- //MD5(buf, key_len, id);
+ ycrMD5_r(buf, key_len, id);
} else {
if (secondary) {
// Secondary ID defaults to IP (if none of the specified hashes computes)
char buf[4];
-
- //*buf = resr.getRRI()->client_ip; // ToDo: this only works for IPv4
+ *buf = resr.getRRI()->client_ip; // ToDo: this only works for IPv4
TSDebug("balancer", "Making secondary hash ID's using IP (default) = %s", buf);
- //MD5(buf, key_len, id);
+ ycrMD5_r(buf, key_len, id);
} else {
// Primary ID defaults to URL (if none of the specified hashes computes)
- char buf[resr._urlSize + 1];
+ char buf[resr.getRRI()->orig_url_size + 1];
- memcpy(buf, resr._urlString, resr._urlSize);
- buf[resr._urlSize] = '\0';
+ memcpy(buf, resr.getRRI()->orig_url, resr.getRRI()->orig_url_size);
+ buf[resr.getRRI()->orig_url_size] = '\0';
TSDebug("balancer", "Making primary hash ID's using URL (default) = %s", buf);
- //MD5(buf, key_len, id);
+ ycrMD5_r(buf, key_len, id);
}
}
} else {
@@ -191,14 +190,14 @@ private:
// Initialize the plugin.
//
int
-tsremap_init(TSRemapInterface *api_info, char *errbuf, int errbuf_size)
+tsremap_init(TSREMAP_INTERFACE *api_info, char *errbuf, int errbuf_size)
{
if (!api_info) {
strncpy(errbuf, "[tsremap_init] - Invalid TSREMAP_INTERFACE argument", errbuf_size - 1);
return -1;
}
- if (api_info->size < sizeof(TSRemapInterface)) {
+ if (api_info->size < sizeof(TSREMAP_INTERFACE)) {
strncpy(errbuf, "[tsremap_init] - Incorrect size of TSREMAP_INTERFACE structure", errbuf_size - 1);
return -2;
}
@@ -217,19 +216,16 @@ tsremap_init(TSRemapInterface *api_info, char *errbuf, int errbuf_size)
///////////////////////////////////////////////////////////////////////////////
// One instance per remap.config invocation.
//
-TSReturnCode
-TSRemapNewInstance(int argc, char *argv[], void **ih, char *errbuf, int errbuf_size)
+int
+tsremap_new_instance(int argc, char *argv[], ihandle *ih, char *errbuf, int errbuf_size)
{
- (void) errbuf;
- (void) errbuf_size;
-
BalancerInstance* ri = new BalancerInstance;
- *ih = static_cast<void*>(ri);
+ *ih = static_cast<ihandle>(ri);
if (ri == NULL) {
TSError("Unable to create remap instance");
- return TS_ERROR;
+ return -5;
}
for (int ix=2; ix < argc; ++ix) {
@@ -314,13 +310,13 @@ TSRemapNewInstance(int argc, char *argv[], void **ih, char *errbuf, int errbuf_s
}
}
- return TS_SUCCESS;
+ return 0;
}
void
-tsremap_delete_instance(void** ih)
+tsremap_delete_instance(ihandle ih)
{
- BalancerInstance* ri = static_cast<BalancerInstance*>(*ih);
+ BalancerInstance* ri = static_cast<BalancerInstance*>(ih);
delete ri;
}
@@ -329,8 +325,8 @@ tsremap_delete_instance(void** ih)
///////////////////////////////////////////////////////////////////////////////
// This is the main "entry" point for the plugin, called for every request.
//
-TSRemapStatus
-TSRemapDoRemap(void** ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
+int
+tsremap_remap(ihandle ih, rhandle rh, REMAP_REQUEST_INFO *rri)
{
BalancerInstance* balancer;
int error = 0;
@@ -342,9 +338,9 @@ TSRemapDoRemap(void** ih, TSHttpTxn rh, TSRemapRequestInfo *rri)
if (NULL == ih) {
TSDebug("balancer", "Falling back to default URL on remap without rules");
- return TSREMAP_NO_REMAP;
+ return 0;
}
- balancer = static_cast<BalancerInstance*>(*ih);
+ balancer = static_cast<BalancerInstance*>(ih);
// Get the rotation name to use.
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/ae49e166/plugins/experimental/balancer/hashkey.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/balancer/hashkey.h b/plugins/experimental/balancer/hashkey.h
index 9cec9fd..856c84f 100644
--- a/plugins/experimental/balancer/hashkey.h
+++ b/plugins/experimental/balancer/hashkey.h
@@ -56,9 +56,6 @@ public:
virtual int key(const void** data, Resources& resr) const = 0;
virtual void free_key(const void* data, int len, Resources& resr) const {
- (void) data;
- (void) len;
- (void) resr;
// No-op by default
}
@@ -89,9 +86,8 @@ class URLHashKey : public HashKey
public:
int
key(const void** data, Resources& resr) const {
- int size;
- *data = resr.getUrl(&size);
- return size;
+ *data = resr.getRRI()->orig_url;
+ return resr.getRRI()->orig_url_size;
}
};
@@ -104,9 +100,8 @@ class PathHashKey : public HashKey
public:
int
key(const void** data, Resources& resr) const {
- int size;
- *data = TSUrlPathGet(resr._rri->requestBufp, resr._rri->requestUrl, &size);
- return size;
+ *data = resr.getRRI()->request_path;
+ return resr.getRRI()->request_path_size;
}
};
@@ -157,9 +152,9 @@ class CookieHashKey : public HashKey
const char* cookie;
if (_sub) {
- cookie = NULL; // TODO - get sub cookie
+ cookie = // TODO - get sub cookie
} else {
- cookie = NULL; // TODO - get full cookie
+ cookie = // TODO - get full cookie
}
if (cookie) {
*data = cookie;
@@ -167,9 +162,9 @@ class CookieHashKey : public HashKey
}
}
} else {
- if (resr._cookie_size > 0) {
- *data = resr._cookie;
- return resr._cookie_size;
+ if (resr.getRRI()->request_cookie_size > 0) {
+ *data = resr.getRRI()->request_cookie;
+ return resr.getRRI()->request_cookie_size;
}
}
@@ -194,10 +189,8 @@ class IPHashKey : public HashKey
public:
int
key(const void** data, Resources& resr) const {
- const struct sockaddr *addr = TSHttpTxnClientAddrGet(resr._txnp);
- (void) addr;
- *data = NULL; // TODO set the right pointer
- return 4; // TODO set the right size
+ *data = &(resr.getRRI()->client_ip);
+ return 4; // ToDo: This only works with IPV4, obviously
}
};
@@ -224,12 +217,17 @@ class HeaderHashKey : public HashKey
TSMBuffer bufp = resr.getBufp();
TSMLoc hdrLoc = resr.getHdrLoc();
TSMLoc fieldLoc;
+ const char* val;
int len = -1;
// Note that hdrLoc is freed as part of the Resources dtor, and we free the "string" value
// in the free_key() implementation (after we're done with it).
if (bufp && hdrLoc && (fieldLoc = TSMimeHdrFieldFind(bufp, hdrLoc, _header, _header_len))) {
- *data = TSMimeHdrFieldValueStringGet(bufp, hdrLoc, fieldLoc, 0, &len);
+ if (TS_ERROR != TSMimeHdrFieldValueStringGet(bufp, hdrLoc, fieldLoc, 0, &val, &len)) {
+ *data = val;
+ } else {
+ *data = NULL;
+ }
TSHandleMLocRelease(bufp, hdrLoc, fieldLoc);
} else {
*data = NULL;
@@ -238,6 +236,14 @@ class HeaderHashKey : public HashKey
return len;
}
+ void free_key(const void* data, int len, Resources& resr) const {
+ TSMBuffer bufp = resr.getBufp();
+ TSMLoc hdrLoc = resr.getHdrLoc();
+
+ if (bufp && hdrLoc)
+ TSHandleStringRelease(bufp, hdrLoc, (const char*)data);
+ }
+
private:
const char* _header;
int _header_len;
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/ae49e166/plugins/experimental/balancer/resources.h
----------------------------------------------------------------------
diff --git a/plugins/experimental/balancer/resources.h b/plugins/experimental/balancer/resources.h
index 531278b..6188951 100644
--- a/plugins/experimental/balancer/resources.h
+++ b/plugins/experimental/balancer/resources.h
@@ -31,7 +31,7 @@
#include <ts/remap.h>
#include <ts/ts.h>
-#include <string.h>
+
///////////////////////////////////////////////////////////////////////////////
@@ -41,7 +41,7 @@ class Resources
{
public:
Resources(TSHttpTxn txnp, TSRemapRequestInfo *rri) :
- _rri(rri), _txnp(txnp), _jar(NULL), _bufp(NULL), _hdrLoc(NULL), _urlString(NULL)
+ _txnp(txnp), _rri(rri), _jar(NULL), _bufp(NULL), _hdrLoc(NULL)
{ }
~Resources() {
@@ -54,28 +54,24 @@ public:
TSDebug("balancer", "Destroying the cookie jar");
// TODO - destroy cookies
}
-
- if (_urlString) {
- TSfree(_urlString);
- }
}
const TSHttpTxn getTxnp() const { return _txnp; }
const TSRemapRequestInfo* getRRI() const { return _rri; }
- const char*
+ const cookiejar_t
getJar() {
if (_jar)
return _jar;
// Setup the cookie jar for all processing
- if (_cookie_size > 0) {
- char cookie_hdr[_cookie_size + 1];
+ if (_rri->request_cookie_size > 0) {
+ char cookie_hdr[_rri->request_cookie_size + 1];
- memcpy(cookie_hdr, _cookie, _cookie_size);
- cookie_hdr[_cookie_size] = '\0';
- _jar = NULL; // TODO - create cookies
+ memcpy(cookie_hdr, _rri->request_cookie, _rri->request_cookie_size);
+ cookie_hdr[_rri->request_cookie_size] = '\0';
+ _jar = // TODO - create cookies
TSDebug("balancer", "Creating the cookie jar");
}
@@ -103,22 +99,12 @@ public:
return _hdrLoc;
}
- char* getUrl(int *size) {
- _urlString = TSUrlStringGet(_rri->requestBufp, _rri->requestUrl, size);
- _urlSize = *size;
- return _urlString;
- }
-
-public:
- TSRemapRequestInfo* _rri;
+private:
TSHttpTxn _txnp;
- size_t _cookie_size;
- char* _cookie;
- char* _jar;
+ TSRemapRequestInfo* _rri;
+ cookiejar_t _jar;
TSMBuffer _bufp;
TSMLoc _hdrLoc;
- int _urlSize;
- char* _urlString;
};