Uploaded image for project: 'HttpComponents HttpClient'
  1. HttpComponents HttpClient
  2. HTTPCLIENT-1213

performance issue with CachingHttpClient

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 4.2 Final
    • 4.3 Beta1
    • HttpCache
    • None

    Description

      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

      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.

      Attachments

        1. httpclient-1213.patch
          7 kB
          Sam Perman

        Activity

          People

            Unassigned Unassigned
            samper Sam Perman
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: