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