On Tue, 2012-07-03 at 09:55 -0400, Sam Perman wrote:
> Hello
>
> We're using the CachingHttpClient and are seeing a spike in CPU usage when
> it is enabled. We've profiled our application and see that most of the time
> is being spent parsing dates. Specifically, it is trying to get the age of
> a cache entry on a cache hit by parsing the "Date" header on the
> HttpCacheEntry. I had a couple questions:
>
> 1) Why can't this use the responseDate value that lives on HttpCacheEntry?
> (This would avoid the overhead of parsing)
> 2) If it needs to parse, is it possible to remember the result on the
> HttpCacheEntry so it doesn't need to be parsed every time?
>
> We are using version 4.2
>
> thanks for any advice
> sam
>
> ps - Here is the full backtrace we are seeing:
>
> org.apache.http.impl.cookie.DateUtils.parseDate(String)
>
> org.apache.http.impl.client.cache.CacheValidityPolicy.getDateValue(HttpCacheEntry)
>
> org.apache.http.impl.client.cache.CacheValidityPolicy.getApparentAgeSecs(HttpCacheEntry)
>
> org.apache.http.impl.client.cache.CacheValidityPolicy.getCorrectedReceivedAgeSecs(HttpCacheEntry)
>
> org.apache.http.impl.client.cache.CacheValidityPolicy.getCorrectedInitialAgeSecs(HttpCacheEntry)
>
> org.apache.http.impl.client.cache.CacheValidityPolicy.getCurrentAgeSecs(HttpCacheEntry,
> Date)
>
> There are a couple callers to "getCorrectedAgeSecs":
>
> CacheValidityPolicy.isResponseFresh(HttpCacheEntry, Date)
> CachedResponseSuitabilityChecker.isFreshEnough(HttpCacheEntry,
> HttpRequest, Date)
> CachedResponseSuitabilityChecker.canCachedResponseBeUsed(HttpHost,
> HttpRequest, HttpCacheEntry, Date)
> CachingHttpClient.handleCacheHit(HttpHost, HttpRequest, HttpContext,
> HttpCacheEntry)
>
> CachedHttpResponseGenerator.generateResponse(HttpCacheEntry)
> CachingHttpClient.generateCachedResponse(HttpRequest, HttpContext,
> HttpCacheEntry, Date)
> CachingHttpClient.handleCacheHit(HttpHost, HttpRequest, HttpContext,
> HttpCacheEntry)
>
>
> Looking at the code, it looks like this section from
> CachingHttpClient.handleCacheHit will result in parsing the date twice
> (apologies if I'm misreading this)
>
> if (suitabilityChecker.canCachedResponseBeUsed(target, request,
> entry, now)) {
> return generateCachedResponse(request, context, entry, now);
> }
>
> Both the call to "canCachedResponseBeUsed" and the call to
> "generatedCachedResponse" will ultimately call "getCurrentAgeSecs" and
> parse the Date header.
Sam
Could you please raise a JIRA for this issue?
Oleg
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]