Updated Branches: refs/heads/5.0.x a44a12ab3 -> db67432fc
TS-1919 Backing this change out, since it's been -1'd. git revert did not handle this nicely, since the trees have diverged so much. Instead, I simply made 5.0.x identical to current "master". Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/db67432f Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/db67432f Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/db67432f Branch: refs/heads/5.0.x Commit: db67432fce4bc324856c17038269f327a9128efa Parents: a44a12a Author: Leif Hedstrom <zw...@apache.org> Authored: Fri Jan 3 10:34:36 2014 -0700 Committer: Leif Hedstrom <zw...@apache.org> Committed: Fri Jan 3 10:34:36 2014 -0700 ---------------------------------------------------------------------- CHANGES | 7 +- iocore/cache/Cache.cc | 8 +- iocore/cache/CacheRead.cc | 11 ++- iocore/cache/I_Cache.h | 15 ++-- iocore/cache/P_CacheInternal.h | 46 +++++++----- iocore/cache/P_CacheTest.h | 1 + iocore/cluster/ClusterCache.cc | 26 ++++--- iocore/cluster/P_ClusterCacheInternal.h | 15 ++-- iocore/cluster/P_ClusterInline.h | 15 +++- proxy/ICP.cc | 3 +- proxy/Prefetch.cc | 19 +++-- proxy/Prefetch.h | 2 +- proxy/http/HttpCacheSM.cc | 8 +- proxy/http/HttpCacheSM.h | 9 ++- proxy/http/HttpSM.cc | 16 +++- proxy/http/HttpTransact.h | 2 + proxy/http/HttpTransactCache.cc | 107 +++++++++++++++++++++++++-- proxy/http/HttpTransactCache.h | 61 +++++++++++++-- 18 files changed, 278 insertions(+), 93 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index 75890e1..2a0771c 100644 --- a/CHANGES +++ b/CHANGES @@ -1,8 +1,5 @@ -*- coding: utf-8 -*- -Changes with Apache Traffic Server 5.0.0 - - *) [TS-1919] Eliminate CacheLookupHttpConfig. This breaks cluster - compatibility, so all cluster nodes should be upgraded simultaneously. +Changes with Apache Traffic Server 4.2.0 *) [TS-2467] traffic_shell doesn't work with tcl 8.6. Author: Ben Aitchison <b...@meh.net.nz> @@ -63,8 +60,6 @@ Changes with Apache Traffic Server 5.0.0 *) [TS-2432] Fix a race in aio_err_callblk. -Changes with Apache Traffic Server 4.2.0 - *) [TS-2251] Simplify LogBuffer reference counting. *) [TS-2190] Remove cache.log from the cachurl plugin. http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/iocore/cache/Cache.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/Cache.cc b/iocore/cache/Cache.cc index e3cf044..711b7c9 100644 --- a/iocore/cache/Cache.cc +++ b/iocore/cache/Cache.cc @@ -3413,15 +3413,15 @@ ink_cache_init(ModuleVersion v) //---------------------------------------------------------------------------- Action * CacheProcessor::open_read(Continuation *cont, URL *url, bool cluster_cache_local, CacheHTTPHdr *request, - void *context, time_t pin_in_cache, CacheFragType type) + CacheLookupHttpConfig *params, time_t pin_in_cache, CacheFragType type) { #ifdef CLUSTER_CACHE if (cache_clustering_enabled > 0 && !cluster_cache_local) { - return open_read_internal(CACHE_OPEN_READ_LONG, cont, (MIOBuffer *) 0, url, request, context, - (CacheKey *) 0, pin_in_cache, type, (char *) 0, 0); + return open_read_internal(CACHE_OPEN_READ_LONG, cont, (MIOBuffer *) 0, + url, request, params, (CacheKey *) 0, pin_in_cache, type, (char *) 0, 0); } #endif - return caches[type]->open_read(cont, url, request, context, type); + return caches[type]->open_read(cont, url, request, params, type); } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/iocore/cache/CacheRead.cc ---------------------------------------------------------------------- diff --git a/iocore/cache/CacheRead.cc b/iocore/cache/CacheRead.cc index e155304..5e8c6ac 100644 --- a/iocore/cache/CacheRead.cc +++ b/iocore/cache/CacheRead.cc @@ -90,7 +90,7 @@ Lcallreturn: #ifdef HTTP_CACHE Action * Cache::open_read(Continuation * cont, CacheKey * key, CacheHTTPHdr * request, - void * context, CacheFragType type, char *hostname, int host_len) + CacheLookupHttpConfig * params, CacheFragType type, char *hostname, int host_len) { if (!CacheProcessor::IsCacheReady(type)) { @@ -116,7 +116,7 @@ Cache::open_read(Continuation * cont, CacheKey * key, CacheHTTPHdr * request, CACHE_INCREMENT_DYN_STAT(c->base_stat + CACHE_STAT_ACTIVE); c->request.copy_shallow(request); c->frag_type = CACHE_FRAG_TYPE_HTTP; - c->context = context; + c->params = params; c->od = od; } if (!lock) { @@ -242,7 +242,7 @@ CacheVC::openReadChooseWriter(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSE return -ECACHE_NO_DOC; } if (cache_config_select_alternate) { - alternate_index = HttpTransactCache::SelectFromAlternates(&vector, &request, static_cast<HttpConfigParams*>(context)); + alternate_index = HttpTransactCache::SelectFromAlternates(&vector, &request, params); if (alternate_index < 0) return -ECACHE_ALT_MISS; } else @@ -967,8 +967,7 @@ CacheVC::openReadVecWrite(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */ dir_overwrite(&first_key, vol, &dir, &od->first_dir); if (od->move_resident_alt) dir_insert(&od->single_doc_key, vol, &od->single_doc_dir); - - int alt_ndx = HttpTransactCache::SelectFromAlternates(write_vector, &request, static_cast<HttpConfigParams*>(context)); + int alt_ndx = HttpTransactCache::SelectFromAlternates(write_vector, &request, params); vol->close_write(this); if (alt_ndx >= 0) { vector.clear(); @@ -1074,7 +1073,7 @@ CacheVC::openReadStartHead(int event, Event * e) goto Ldone; } if (cache_config_select_alternate) { - alternate_index = HttpTransactCache::SelectFromAlternates(&vector, &request, static_cast<HttpConfigParams*>(context)); + alternate_index = HttpTransactCache::SelectFromAlternates(&vector, &request, params); if (alternate_index < 0) { err = ECACHE_ALT_MISS; goto Ldone; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/iocore/cache/I_Cache.h ---------------------------------------------------------------------- diff --git a/iocore/cache/I_Cache.h b/iocore/cache/I_Cache.h index 63707e1..b89357f 100644 --- a/iocore/cache/I_Cache.h +++ b/iocore/cache/I_Cache.h @@ -53,6 +53,7 @@ struct CacheVC; #ifdef HTTP_CACHE +class CacheLookupHttpConfig; class URL; class HTTPHdr; class HTTPInfo; @@ -106,10 +107,14 @@ struct CacheProcessor:public Processor #ifdef HTTP_CACHE Action *lookup(Continuation *cont, URL *url, bool cluster_cache_local, bool local_only = false, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP); - inkcoreapi Action *open_read(Continuation *cont, URL *url, bool cluster_cache_local, CacheHTTPHdr *request, - void *context, time_t pin_in_cache = (time_t) 0, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP); - Action *open_read_buffer(Continuation *cont, MIOBuffer *buf, URL *url, CacheHTTPHdr *request, - void *context, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP); + inkcoreapi Action *open_read(Continuation *cont, URL *url, + bool cluster_cache_local, + CacheHTTPHdr *request, + CacheLookupHttpConfig *params, + time_t pin_in_cache = (time_t) 0, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP); + Action *open_read_buffer(Continuation *cont, MIOBuffer *buf, URL *url, + CacheHTTPHdr *request, + CacheLookupHttpConfig *params, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP); Action *open_write(Continuation *cont, int expected_size, URL *url, bool cluster_cache_local, CacheHTTPHdr *request, CacheHTTPInfo *old_info, time_t pin_in_cache = (time_t) 0, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP); @@ -119,7 +124,7 @@ struct CacheProcessor:public Processor Action *remove(Continuation *cont, URL *url, bool cluster_cache_local, CacheFragType frag_type = CACHE_FRAG_TYPE_HTTP); Action *open_read_internal(int, Continuation *, MIOBuffer *, CacheURL *, - CacheHTTPHdr *, void *, + CacheHTTPHdr *, CacheLookupHttpConfig *, CacheKey *, time_t, CacheFragType type, char *hostname, int host_len); #endif Action *link(Continuation *cont, CacheKey *from, CacheKey *to, bool cluster_cache_local, http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/iocore/cache/P_CacheInternal.h ---------------------------------------------------------------------- diff --git a/iocore/cache/P_CacheInternal.h b/iocore/cache/P_CacheInternal.h index 06bfdf4..f9a5845 100644 --- a/iocore/cache/P_CacheInternal.h +++ b/iocore/cache/P_CacheInternal.h @@ -424,7 +424,7 @@ struct CacheVC: public CacheVConnection CacheHTTPInfo *info; CacheHTTPInfoVector *write_vector; #ifdef HTTP_CACHE - void *context; + CacheLookupHttpConfig *params; #endif int header_len; // for communicating with agg_copy int frag_len; // for communicating with agg_copy @@ -1035,9 +1035,9 @@ struct Cache Action *lookup(Continuation *cont, URL *url, CacheFragType type); inkcoreapi Action *open_read(Continuation *cont, CacheKey *key, CacheHTTPHdr *request, - void *context, CacheFragType type, char *hostname, int host_len); + CacheLookupHttpConfig *params, CacheFragType type, char *hostname, int host_len); Action *open_read(Continuation *cont, URL *url, CacheHTTPHdr *request, - void *context, CacheFragType type); + CacheLookupHttpConfig *params, CacheFragType type); Action *open_write(Continuation *cont, CacheKey *key, CacheHTTPInfo *old_info, time_t pin_in_cache = (time_t) 0, CacheKey *key1 = NULL, @@ -1069,13 +1069,14 @@ inkcoreapi extern Cache *caches[NUM_CACHE_FRAG_TYPES]; #ifdef HTTP_CACHE TS_INLINE Action * -Cache::open_read(Continuation *cont, CacheURL *url, CacheHTTPHdr *request, void *context, CacheFragType type) +Cache::open_read(Continuation *cont, CacheURL *url, CacheHTTPHdr *request, + CacheLookupHttpConfig *params, CacheFragType type) { INK_MD5 md5; int len; url->MD5_get(&md5); const char *hostname = url->host_get(&len); - return open_read(cont, &md5, request, context, type, (char *) hostname, len); + return open_read(cont, &md5, request, params, type, (char *) hostname, len); } TS_INLINE void @@ -1178,8 +1179,9 @@ CacheProcessor::open_read(Continuation *cont, CacheKey *key, bool cluster_cache_ { #ifdef CLUSTER_CACHE if (cache_clustering_enabled > 0 && !cluster_cache_local) { - return open_read_internal(CACHE_OPEN_READ, cont, (MIOBuffer *) 0, (CacheURL *) 0, (CacheHTTPHdr *) 0, - (void *) 0, key, 0, frag_type, hostname, host_len); + return open_read_internal(CACHE_OPEN_READ, cont, (MIOBuffer *) 0, + (CacheURL *) 0, (CacheHTTPHdr *) 0, + (CacheLookupHttpConfig *) 0, key, 0, frag_type, hostname, host_len); } #endif return caches[frag_type]->open_read(cont, key, frag_type, hostname, host_len); @@ -1191,8 +1193,9 @@ CacheProcessor::open_read_buffer(Continuation *cont, MIOBuffer *buf ATS_UNUSED, { #ifdef CLUSTER_CACHE if (cache_clustering_enabled > 0) { - return open_read_internal(CACHE_OPEN_READ_BUFFER, cont, buf, (CacheURL *) 0, (CacheHTTPHdr *) 0, - (void*) 0, key, 0, frag_type, hostname, host_len); + return open_read_internal(CACHE_OPEN_READ_BUFFER, cont, buf, + (CacheURL *) 0, (CacheHTTPHdr *) 0, + (CacheLookupHttpConfig *) 0, key, 0, frag_type, hostname, host_len); } #endif return caches[frag_type]->open_read(cont, key, frag_type, hostname, host_len); @@ -1273,17 +1276,17 @@ CacheProcessor::lookup(Continuation *cont, URL *url, bool cluster_cache_local, b } TS_INLINE Action * -CacheProcessor::open_read_buffer(Continuation *cont, MIOBuffer *buf, URL *url, CacheHTTPHdr *request, - void *context, CacheFragType type) +CacheProcessor::open_read_buffer(Continuation *cont, MIOBuffer *buf, + URL *url, CacheHTTPHdr *request, CacheLookupHttpConfig *params, CacheFragType type) { (void) buf; #ifdef CLUSTER_CACHE if (cache_clustering_enabled > 0) { - return open_read_internal(CACHE_OPEN_READ_BUFFER_LONG, cont, buf, url, request, context, (CacheKey *) 0, - 0, type, (char *) 0, 0); + return open_read_internal(CACHE_OPEN_READ_BUFFER_LONG, cont, buf, url, + request, params, (CacheKey *) 0, 0, type, (char *) 0, 0); } #endif - return caches[type]->open_read(cont, url, request, context, type); + return caches[type]->open_read(cont, url, request, params, type); } TS_INLINE Action * @@ -1305,9 +1308,13 @@ CacheProcessor::open_write_buffer(Continuation * cont, MIOBuffer * buf, URL * ur #ifdef CLUSTER_CACHE TS_INLINE Action * -CacheProcessor::open_read_internal(int opcode, Continuation *cont, MIOBuffer *buf, CacheURL *url, CacheHTTPHdr *request, - void *context, CacheKey *key, time_t pin_in_cache, CacheFragType frag_type, char *hostname, - int host_len) +CacheProcessor::open_read_internal(int opcode, + Continuation *cont, MIOBuffer *buf, + CacheURL *url, + CacheHTTPHdr *request, + CacheLookupHttpConfig *params, + CacheKey *key, + time_t pin_in_cache, CacheFragType frag_type, char *hostname, int host_len) { INK_MD5 url_md5; if ((opcode == CACHE_OPEN_READ_LONG) || (opcode == CACHE_OPEN_READ_BUFFER_LONG)) { @@ -1318,11 +1325,12 @@ CacheProcessor::open_read_internal(int opcode, Continuation *cont, MIOBuffer *bu ClusterMachine *m = cluster_machine_at_depth(cache_hash(url_md5)); if (m) { - return Cluster_read(m, opcode, cont, buf, url, request, key, pin_in_cache, frag_type, hostname, host_len); + return Cluster_read(m, opcode, cont, buf, url, + request, params, key, pin_in_cache, frag_type, hostname, host_len); } else { if ((opcode == CACHE_OPEN_READ_LONG) || (opcode == CACHE_OPEN_READ_BUFFER_LONG)) { - return caches[frag_type]->open_read(cont, &url_md5, request, context, frag_type, hostname, host_len); + return caches[frag_type]->open_read(cont, &url_md5, request, params, frag_type, hostname, host_len); } else { return caches[frag_type]->open_read(cont, key, frag_type, hostname, host_len); } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/iocore/cache/P_CacheTest.h ---------------------------------------------------------------------- diff --git a/iocore/cache/P_CacheTest.h b/iocore/cache/P_CacheTest.h index 2959ea3..8ef83ca 100644 --- a/iocore/cache/P_CacheTest.h +++ b/iocore/cache/P_CacheTest.h @@ -76,6 +76,7 @@ struct CacheTestSM : public RegressionSM { MIOBuffer *buffer; IOBufferReader *buffer_reader; #ifdef HTTP_CACHE + CacheLookupHttpConfig params; CacheHTTPInfo info; char urlstr[1024]; #endif http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/iocore/cluster/ClusterCache.cc ---------------------------------------------------------------------- diff --git a/iocore/cluster/ClusterCache.cc b/iocore/cluster/ClusterCache.cc index fc80ef5..8d4b6e5 100644 --- a/iocore/cluster/ClusterCache.cc +++ b/iocore/cluster/ClusterCache.cc @@ -1212,6 +1212,14 @@ cache_op_ClusterFunction(ClusterHandler * ch, void *data, int len) moi_len -= res; p += res; ink_assert(moi_len > 0); + // Unmarshal CacheLookupHttpConfig + c->ic_params = new(CacheLookupHttpConfigAllocator.alloc()) + CacheLookupHttpConfig(); + res = c->ic_params->unmarshal(&c->ic_arena, (const char *) p, moi_len); + ink_assert(res > 0); + + moi_len -= res; + p += res; CacheKey key(msg->url_md5); @@ -1231,10 +1239,9 @@ cache_op_ClusterFunction(ClusterHandler * ch, void *data, int len) memcpy(c->ic_hostname->data(), hostname, host_len); } - c->http_config_params = HttpConfig::acquire(); Cache *call_cache = caches[c->frag_type]; Action *a = call_cache->open_read(c, &key, &c->ic_request, - c->http_config_params, + c->ic_params, c->frag_type, hostname, host_len); // Get rid of purify warnings since 'c' can be freed by open_read. if (a != ACTION_RESULT_DONE) { @@ -1873,21 +1880,22 @@ struct retryDisposeOfDataBuffer:public Continuation { CacheContinuation *c; - int handleRetryEvent(int event, Event * e) { + int handleRetryEvent(int event, Event * e) + { if (CacheContinuation::handleDisposeEvent(event, c) == EVENT_DONE) { delete this; - return EVENT_DONE; - } else { + return EVENT_DONE; + } else + { e->schedule_in(HRTIME_MSECONDS(10)); return EVENT_CONT; } } - retryDisposeOfDataBuffer(CacheContinuation * cont) - : Continuation(new_ProxyMutex()), c(cont) { - SET_HANDLER((rtryDisOfDBufHandler) &retryDisposeOfDataBuffer::handleRetryEvent); +: Continuation(new_ProxyMutex()), c(cont) { + SET_HANDLER((rtryDisOfDBufHandler) + & retryDisposeOfDataBuffer::handleRetryEvent); } - }; ////////////////////////////////////////////////////////////////// http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/iocore/cluster/P_ClusterCacheInternal.h ---------------------------------------------------------------------- diff --git a/iocore/cluster/P_ClusterCacheInternal.h b/iocore/cluster/P_ClusterCacheInternal.h index 907d6f5..8b62d44 100644 --- a/iocore/cluster/P_ClusterCacheInternal.h +++ b/iocore/cluster/P_ClusterCacheInternal.h @@ -30,7 +30,6 @@ #define __P_CLUSTERCACHEINTERNAL_H__ #include "P_ClusterCache.h" #include "I_OneWayTunnel.h" -#include "HttpConfig.h" // // Compilation Options @@ -165,10 +164,10 @@ struct CacheContinuation:public Continuation Arena ic_arena; CacheHTTPHdr ic_request; CacheHTTPHdr ic_response; - HttpConfigParams *http_config_params; + CacheLookupHttpConfig *ic_params; CacheHTTPInfo ic_old_info; CacheHTTPInfo ic_new_info; - Ptr<IOBufferData> ic_hostname; + Ptr<IOBufferData> ic_hostname; int ic_hostname_len; // debugging @@ -247,11 +246,11 @@ struct CacheContinuation:public Continuation if (cache_vc_info.valid()) { cache_vc_info.destroy(); } - if (http_config_params) { - HttpConfig::release(http_config_params); - http_config_params = 0; + // Deallocate unmarshaled data + if (ic_params) { + delete ic_params; + ic_params = 0; } - if (ic_request.valid()) { ic_request.clear(); } @@ -312,7 +311,7 @@ CacheContinuation(): lookup_open_write_vc_event(0), ic_arena(), ic_request(), - ic_response(), http_config_params(0), ic_old_info(), ic_new_info(), ic_hostname_len(0), cache_op_ClusterFunction(0) { + ic_response(), ic_params(0), ic_old_info(), ic_new_info(), ic_hostname_len(0), cache_op_ClusterFunction(0) { token.clear(); SET_HANDLER((CacheContHandler) & CacheContinuation::remoteOpEvent); } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/iocore/cluster/P_ClusterInline.h ---------------------------------------------------------------------- diff --git a/iocore/cluster/P_ClusterInline.h b/iocore/cluster/P_ClusterInline.h index 75fa571..c653956 100644 --- a/iocore/cluster/P_ClusterInline.h +++ b/iocore/cluster/P_ClusterInline.h @@ -59,10 +59,13 @@ Cluster_lookup(Continuation * cont, CacheKey * key, CacheFragType frag_type, cha } inline Action * -Cluster_read(ClusterMachine * owner_machine, int opcode, Continuation * cont, MIOBuffer * buf, CacheURL * url, - CacheHTTPHdr * request, CacheKey * key, time_t pin_in_cache, CacheFragType frag_type, char *hostname, - int host_len) +Cluster_read(ClusterMachine * owner_machine, int opcode, + Continuation * cont, MIOBuffer * buf, + CacheURL * url, CacheHTTPHdr * request, + CacheLookupHttpConfig * params, CacheKey * key, + time_t pin_in_cache, CacheFragType frag_type, char *hostname, int host_len) { + (void) params; if (clusterProcessor.disable_remote_cluster_ops(owner_machine)) { Action a; a = cont; @@ -90,6 +93,7 @@ Cluster_read(ClusterMachine * owner_machine, int opcode, Continuation * cont, MI url_hostname = url->host_get(&url_hlen); len += request->m_heap->marshal_length(); + len += params->marshal_length(); len += url_hlen; if ((flen + len) > DEFAULT_MAX_BUFFER_SIZE) // Bound marshalled data @@ -106,7 +110,10 @@ Cluster_read(ClusterMachine * owner_machine, int opcode, Continuation * cont, MI } data += res; cur_len -= res; - + if ((res = params->marshal(data, cur_len)) < 0) + goto err_exit; + data += res; + cur_len -= res; memcpy(data, url_hostname, url_hlen); CacheOpArgs_General readArgs; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/proxy/ICP.cc ---------------------------------------------------------------------- diff --git a/proxy/ICP.cc b/proxy/ICP.cc index 9450ec4..8124a44 100644 --- a/proxy/ICP.cc +++ b/proxy/ICP.cc @@ -43,6 +43,7 @@ #include "BaseManager.h" #include "HdrUtils.h" +extern CacheLookupHttpConfig global_cache_lookup_config; HTTPHdr gclient_request; //**************************************************************************** @@ -480,7 +481,7 @@ ICPPeerReadCont::ICPPeerQueryCont(int /* event ATS_UNUSED */, Event * /* e ATS_U // cache clustering is not used with stale lookup. ////////////////////////////////////////////////////////////// a = cacheProcessor.open_read(this, &_state->_cachelookupURL, false, - &gclient_request, NULL, (time_t) 0); + &gclient_request, &global_cache_lookup_config, (time_t) 0); } else { a = cacheProcessor.lookup(this, &_state->_cachelookupURL, false, _state->_cache_lookup_local); } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/proxy/Prefetch.cc ---------------------------------------------------------------------- diff --git a/proxy/Prefetch.cc b/proxy/Prefetch.cc index b402504..182e4c3 100644 --- a/proxy/Prefetch.cc +++ b/proxy/Prefetch.cc @@ -1131,11 +1131,6 @@ PrefetchBlaster::free() delete request; } - if (http_config_params) { - HttpConfig::release(http_config_params); - http_config_params = 0; - } - mutex.clear(); prefetchBlasterAllocator.free(this); } @@ -1489,7 +1484,7 @@ PrefetchBlaster::handleEvent(int event, void *data) //if (cache_lookup_necessary) do: initCacheLookupConfig(); - cacheProcessor.open_read(this, request->url_get(), false, request, http_config_params, 0); + cacheProcessor.open_read(this, request->url_get(), false, request, &cache_lookup_config, 0); break; } @@ -1867,7 +1862,17 @@ PrefetchBlaster::invokeBlaster() void PrefetchBlaster::initCacheLookupConfig() { - this->http_config_params = HttpConfig::acquire(); + //The look up parameters are intialized in the same as it is done + //in HttpSM::init(). Any changes there should come in here. + HttpConfigParams *http_config_params = HttpConfig::acquire(); + cache_lookup_config.cache_global_user_agent_header = http_config_params->global_user_agent_header ? true : false; + cache_lookup_config.cache_enable_default_vary_headers = + http_config_params->cache_enable_default_vary_headers ? true : false; + cache_lookup_config.cache_vary_default_text = http_config_params->cache_vary_default_text; + cache_lookup_config.cache_vary_default_images = http_config_params->cache_vary_default_images; + cache_lookup_config.cache_vary_default_other = http_config_params->cache_vary_default_other; + + HttpConfig::release(http_config_params); } static int http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/proxy/Prefetch.h ---------------------------------------------------------------------- diff --git a/proxy/Prefetch.h b/proxy/Prefetch.h index ec8a9ec..34289fa 100644 --- a/proxy/Prefetch.h +++ b/proxy/Prefetch.h @@ -328,7 +328,7 @@ public: PrefetchBlastData data_blast; - HttpConfigParams *http_config_params; + CacheLookupHttpConfig cache_lookup_config; //udp related: uint32_t n_pkts_sent; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/proxy/http/HttpCacheSM.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpCacheSM.cc b/proxy/http/HttpCacheSM.cc index f5f05e7..7f82dd5 100644 --- a/proxy/http/HttpCacheSM.cc +++ b/proxy/http/HttpCacheSM.cc @@ -212,8 +212,8 @@ HttpCacheSM::do_cache_open_read() } //Initialising read-while-write-inprogress flag this->readwhilewrite_inprogress = false; - Action *action_handle = cacheProcessor.open_read(this, this->lookup_url, master_sm->t_state.cache_control.cluster_cache_local, - this->read_request_hdr, this->read_config, this->read_pin_in_cache); + Action *action_handle = cacheProcessor.open_read(this, this->lookup_url, master_sm->t_state.cache_control.cluster_cache_local, this->read_request_hdr, this->read_config, + this->read_pin_in_cache); if (action_handle != ACTION_RESULT_DONE) { pending_action = action_handle; @@ -231,13 +231,13 @@ HttpCacheSM::do_cache_open_read() } Action * -HttpCacheSM::open_read(URL * url, HTTPHdr * hdr, HttpConfigParams *http_config_params, time_t pin_in_cache) +HttpCacheSM::open_read(URL * url, HTTPHdr * hdr, CacheLookupHttpConfig * params, time_t pin_in_cache) { Action *act_return; lookup_url = url; read_request_hdr = hdr; - read_config = http_config_params; + read_config = params; read_pin_in_cache = pin_in_cache; ink_assert(pending_action == NULL); SET_HANDLER(&HttpCacheSM::state_cache_open_read); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/proxy/http/HttpCacheSM.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpCacheSM.h b/proxy/http/HttpCacheSM.h index e2af016..a6b40a9 100644 --- a/proxy/http/HttpCacheSM.h +++ b/proxy/http/HttpCacheSM.h @@ -42,6 +42,7 @@ class HttpSM; class HttpCacheSM; +class CacheLookupHttpConfig; struct HttpCacheAction:public Action { @@ -66,10 +67,10 @@ public: captive_action.init(this); } - Action *open_read(URL * url, HTTPHdr * hdr, HttpConfigParams * http_config_params, time_t pin_in_cache); + Action *open_read(URL * url, HTTPHdr * hdr, CacheLookupHttpConfig * params, time_t pin_in_cache); - Action *open_write(URL * url, HTTPHdr * request, CacheHTTPInfo * old_info, time_t pin_in_cache, bool retry, - bool allow_multiple); + Action *open_write(URL * url, + HTTPHdr * request, CacheHTTPInfo * old_info, time_t pin_in_cache, bool retry, bool allow_multiple); CacheVConnection *cache_read_vc; CacheVConnection *cache_write_vc; @@ -157,7 +158,7 @@ private: // Open read parameters int open_read_tries; HTTPHdr *read_request_hdr; - HttpConfigParams *read_config; + CacheLookupHttpConfig *read_config; time_t read_pin_in_cache; // Open write parameters http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/proxy/http/HttpSM.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc index fbf9dd4..df9dac5 100644 --- a/proxy/http/HttpSM.cc +++ b/proxy/http/HttpSM.cc @@ -405,6 +405,20 @@ HttpSM::init() // Simply point to the global config for the time being, no need to copy this // entire struct if nothing is going to change it. t_state.txn_conf = &t_state.http_config_param->oride; + + // update the cache info config structure so that + // selection from alternates happens correctly. + t_state.cache_info.config.cache_global_user_agent_header = t_state.http_config_param->global_user_agent_header ? true : false; + t_state.cache_info.config.ignore_accept_mismatch = t_state.http_config_param->ignore_accept_mismatch; + t_state.cache_info.config.ignore_accept_language_mismatch = t_state.http_config_param->ignore_accept_language_mismatch ; + t_state.cache_info.config.ignore_accept_encoding_mismatch = t_state.http_config_param->ignore_accept_encoding_mismatch; + t_state.cache_info.config.ignore_accept_charset_mismatch = t_state.http_config_param->ignore_accept_charset_mismatch; + t_state.cache_info.config.cache_enable_default_vary_headers = t_state.http_config_param->cache_enable_default_vary_headers ? true : false; + + t_state.cache_info.config.cache_vary_default_text = t_state.http_config_param->cache_vary_default_text; + t_state.cache_info.config.cache_vary_default_images = t_state.http_config_param->cache_vary_default_images; + t_state.cache_info.config.cache_vary_default_other = t_state.http_config_param->cache_vary_default_other; + t_state.init(); t_state.srv_lookup = hostdb_srv_enabled; @@ -4278,7 +4292,7 @@ HttpSM::do_cache_lookup_and_read() DebugSM("http_seq", "[HttpSM::do_cache_lookup_and_read] [%" PRId64 "] Issuing cache lookup for URL %s", sm_id, c_url->string_get(&t_state.arena)); Action *cache_action_handle = cache_sm.open_read(c_url, &t_state.hdr_info.client_request, - t_state.http_config_param, + &(t_state.cache_info.config), (time_t) ((t_state.cache_control.pin_in_cache_for < 0) ? 0 : t_state.cache_control.pin_in_cache_for)); // http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/proxy/http/HttpTransact.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransact.h b/proxy/http/HttpTransact.h index 1232aca..ad3152b 100644 --- a/proxy/http/HttpTransact.h +++ b/proxy/http/HttpTransact.h @@ -636,6 +636,7 @@ public: HTTPInfo *second_object_read; HTTPInfo object_store; HTTPInfo transform_store; + CacheLookupHttpConfig config; CacheDirectives directives; int open_read_retries; int open_write_retries; @@ -655,6 +656,7 @@ public: second_object_read(NULL), object_store(), transform_store(), + config(), directives(), open_read_retries(0), open_write_retries(0), http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/proxy/http/HttpTransactCache.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransactCache.cc b/proxy/http/HttpTransactCache.cc index ebde9cc..1b0fc04 100644 --- a/proxy/http/HttpTransactCache.cc +++ b/proxy/http/HttpTransactCache.cc @@ -32,6 +32,10 @@ #include "Error.h" #include "InkErrno.h" +ClassAllocator<CacheLookupHttpConfig> CacheLookupHttpConfigAllocator("CacheLookupHttpConfigAllocator"); + +CacheLookupHttpConfig global_cache_lookup_config; + /** Find the pointer and length of an etag, after stripping off any leading "W/" prefix, and surrounding double quotes. @@ -161,22 +165,21 @@ is_empty(char *s) */ int -HttpTransactCache::SelectFromAlternates(CacheHTTPInfoVector * cache_vector, HTTPHdr * client_request, - HttpConfigParams * http_config_params) +HttpTransactCache::SelectFromAlternates(CacheHTTPInfoVector * cache_vector, + HTTPHdr * client_request, CacheLookupHttpConfig * http_config_params) { time_t current_age, best_age = NUM_SECONDS_IN_ONE_YEAR; time_t t_now = 0; int best_index = -1; float best_Q = -1.0; float unacceptable_Q = 0.0; - int alt_count = cache_vector->count(); - // TODO: for ICP we also want to exit here with a return 0, it's what the - // old code implied. + int alt_count = cache_vector->count(); if (alt_count == 0) { return -1; } + Debug("http_match", "[SelectFromAlternates] # alternates = %d", alt_count); Debug("http_seq", "[SelectFromAlternates] %d alternates for this cached doc", alt_count); if (diags->on("http_alts")) { @@ -184,6 +187,9 @@ HttpTransactCache::SelectFromAlternates(CacheHTTPInfoVector * cache_vector, HTTP fprintf(stderr, "[alts] There are %d alternates for this request header.\n", alt_count); RELEASE_PRINT_LOCK() } + // used by ICP to bypass this function + if (http_config_params == &global_cache_lookup_config) + return 0; if (!client_request->valid()) { return 0; @@ -290,7 +296,7 @@ HttpTransactCache::SelectFromAlternates(CacheHTTPInfoVector * cache_vector, HTTP */ float -HttpTransactCache::calculate_quality_of_match(HttpConfigParams * http_config_param, +HttpTransactCache::calculate_quality_of_match(CacheLookupHttpConfig * http_config_param, HTTPHdr * client_request, HTTPHdr * obj_client_request, HTTPHdr * obj_origin_server_response) @@ -1153,7 +1159,7 @@ language_wildcard: */ Variability_t -HttpTransactCache::CalcVariability(HttpConfigParams * http_config_params, HTTPHdr * client_request, +HttpTransactCache::CalcVariability(CacheLookupHttpConfig * http_config_params, HTTPHdr * client_request, HTTPHdr * obj_client_request, HTTPHdr * obj_origin_server_response) { ink_assert(http_config_params != NULL); @@ -1235,7 +1241,7 @@ HttpTransactCache::CalcVariability(HttpConfigParams * http_config_params, HTTPHd // we should ignore Vary: User-Agent even if 'proxy.config.cache.vary_on_user_agent' // // is 1. Actually the 'proxy.config.cache.vary_on_user_agent' is useless in such case // /////////////////////////////////////////////////////////////////////////////////////// - if (http_config_params->global_user_agent_header && + if (http_config_params->cache_global_user_agent_header && !strcasecmp((char *) field->str, "User-Agent")) continue; @@ -1477,3 +1483,88 @@ L1: return response->status_get(); } + + +/*--------------------------------------------------- + * class CacheLookupHttpConfig + *---------------------------------------------------*/ +int +CacheLookupHttpConfig::marshal_length() +{ + int len = (int) sizeof(int32_t); + len += (cache_vary_default_text ? strlen(cache_vary_default_text) + 1 : 1); + len += (cache_vary_default_images ? strlen(cache_vary_default_images) + 1 : 1); + len += (cache_vary_default_other ? strlen(cache_vary_default_other) + 1 : 1); + return len; +} + +int +CacheLookupHttpConfig::marshal(char *buf, int length) +{ + int32_t i32_tmp; + char *p = buf; + int len; + + if ((length -= sizeof(int32_t)) < 0) + return -1; + + i32_tmp = (int32_t) cache_enable_default_vary_headers; + memcpy(p, &i32_tmp, sizeof(int32_t)); + p += sizeof(int32_t); + + len = (cache_vary_default_text ? strlen(cache_vary_default_text) + 1 : 1); + if ((length -= len) < 0) + return -1; + ink_strlcpy(p, (cache_vary_default_text ? cache_vary_default_text : ""), length); + p += len; + + len = (cache_vary_default_images ? strlen(cache_vary_default_images) + 1 : 1); + if ((length -= len) < 0) + return -1; + ink_strlcpy(p, (cache_vary_default_images ? cache_vary_default_images : ""), length); + p += len; + + len = (cache_vary_default_other ? strlen(cache_vary_default_other) + 1 : 1); + if ((length -= len) < 0) + return -1; + ink_strlcpy(p, (cache_vary_default_other ? cache_vary_default_other : ""), length); + p += len; + + return (p - buf); +} + +int +CacheLookupHttpConfig::unmarshal(Arena * arena, const char *buf, int buflen) +{ + const char *p = buf; + int length = buflen; + int len; + int32_t i32_tmp; + + if ((length -= sizeof(int32_t)) < 0) + return -1; + + memcpy(&i32_tmp, p, sizeof(int32_t)); + cache_enable_default_vary_headers = (bool) i32_tmp; + p += sizeof(int32_t); + + len = strlen(p) + 1; + if ((length -= len) < 0) + return -1; + cache_vary_default_text = arena->str_store(((len == 2) ? "" : p), len - 1); + p += len; + + len = strlen(p) + 1; + if ((length -= len) < 0) + return -1; + cache_vary_default_images = arena->str_store(((len == 2) ? "" : p), len - 1); + p += len; + + len = strlen(p) + 1; + if ((length -= len) < 0) + return -1; + cache_vary_default_other = arena->str_store(((len == 2) ? "" : p), len - 1); + p += len; + + return (p - buf); +} http://git-wip-us.apache.org/repos/asf/trafficserver/blob/db67432f/proxy/http/HttpTransactCache.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpTransactCache.h b/proxy/http/HttpTransactCache.h index 90c5614..bd6e9bd 100644 --- a/proxy/http/HttpTransactCache.h +++ b/proxy/http/HttpTransactCache.h @@ -35,6 +35,54 @@ struct CacheHTTPInfoVector; +class CacheLookupHttpConfig +{ +public: + bool cache_global_user_agent_header; // 'global' user agent flag (don't need to marshal/unmarshal) + bool cache_enable_default_vary_headers; + unsigned ignore_accept_mismatch; + unsigned ignore_accept_language_mismatch; + unsigned ignore_accept_encoding_mismatch; + unsigned ignore_accept_charset_mismatch; + char *cache_vary_default_text; + char *cache_vary_default_images; + char *cache_vary_default_other; + + inkcoreapi int marshal_length(); + inkcoreapi int marshal(char *buf, int length); + int unmarshal(Arena * arena, const char *buf, int length); + + CacheLookupHttpConfig(): + cache_global_user_agent_header(false), + cache_enable_default_vary_headers(false), + ignore_accept_mismatch(0), + ignore_accept_language_mismatch(0), + ignore_accept_encoding_mismatch(0), + ignore_accept_charset_mismatch(0), + cache_vary_default_text(NULL), cache_vary_default_images(NULL), cache_vary_default_other(NULL) + { } + + void *operator new(size_t size, void *mem); + void operator delete(void *mem); +}; + +extern ClassAllocator<CacheLookupHttpConfig> CacheLookupHttpConfigAllocator; +// this is a global CacheLookupHttpConfig used to bypass SelectFromAlternates +extern CacheLookupHttpConfig global_cache_lookup_config; + +inline void * +CacheLookupHttpConfig::operator new(size_t size, void *mem) +{ + (void) size; + return mem; +} + +inline void +CacheLookupHttpConfig::operator delete(void *mem) +{ + CacheLookupHttpConfigAllocator.free((CacheLookupHttpConfig *) mem); +} + enum Variability_t { VARIABILITY_NONE = 0, @@ -49,8 +97,6 @@ enum ContentEncoding }; -struct HttpConfigParams; - class HttpTransactCache { public: @@ -59,9 +105,10 @@ public: // content negotiation support // ///////////////////////////////// - static int SelectFromAlternates(CacheHTTPInfoVector * cache_vector_data, HTTPHdr * client_request, HttpConfigParams* http_config_params); + static int SelectFromAlternates(CacheHTTPInfoVector * cache_vector_data, + HTTPHdr * client_request, CacheLookupHttpConfig * cache_lookup_http_config_params); - static float calculate_quality_of_match(HttpConfigParams * http_config_params, HTTPHdr * client_request, // in + static float calculate_quality_of_match(CacheLookupHttpConfig * http_config_params, HTTPHdr * client_request, // in HTTPHdr * obj_client_request, // in HTTPHdr * obj_origin_server_response); // in @@ -84,8 +131,10 @@ public: // variability & server negotiation routines // /////////////////////////////////////////////// - static Variability_t CalcVariability(HttpConfigParams * http_config_params, HTTPHdr * client_request, - HTTPHdr * obj_client_request, HTTPHdr * obj_origin_server_response ); + static Variability_t CalcVariability(CacheLookupHttpConfig * http_config_params, HTTPHdr * client_request, // in + HTTPHdr * obj_client_request, // in + HTTPHdr * obj_origin_server_response // in + ); static HTTPStatus match_response_to_request_conditionals(HTTPHdr * ua_request, HTTPHdr * c_response);