[ 
https://issues.apache.org/jira/browse/TS-4331?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15328903#comment-15328903
 ] 

ASF GitHub Bot commented on TS-4331:
------------------------------------

Github user jpeach commented on a diff in the pull request:

    https://github.com/apache/trafficserver/pull/653#discussion_r66907362
  
    --- Diff: iocore/hostdb/I_HostDBProcessor.h ---
    @@ -139,10 +141,62 @@ struct SRVInfo {
       unsigned int key;
     };
     
    -struct HostDBInfo {
    +struct HostDBInfo : public RefCountObj {
       /** Internal IP address data.
           This is at least large enough to hold an IPv6 address.
       */
    +
    +  int iobuffer_index;
    +  static HostDBInfo *
    +  alloc(int size = 0)
    +  {
    +    size += sizeof(HostDBInfo);
    +    int iobuffer_index = iobuffer_size_to_index(size);
    +    ink_release_assert(iobuffer_index >= 0);
    +    void *ptr = ioBufAllocator[iobuffer_index].alloc_void();
    +    memset(ptr, 0, size);
    +    HostDBInfo *ret = new (ptr) HostDBInfo();
    +    ret->iobuffer_index = iobuffer_index;
    +    return ret;
    +  }
    +
    +  void
    +  free()
    +  {
    +    ioBufAllocator[iobuffer_index].free_void((void *)(this));
    +  }
    +
    +  // return a version number-- so we can manage compatibility with the 
marshal/unmarshal
    +  static VersionNumber
    +  version()
    +  {
    +    return VersionNumber(1, 0);
    +  }
    +
    +  static HostDBInfo *
    +  unmarshall(char *buf, unsigned int size)
    +  {
    +    if (size < sizeof(HostDBInfo)) {
    +      return NULL;
    +    }
    +    HostDBInfo *ret = HostDBInfo::alloc(size - sizeof(HostDBInfo));
    +    int buf_index = ret->iobuffer_index;
    +    memcpy((void *)ret, buf, size);
    +    // Reset the refcount back to 0, this is a bit ugly-- but I'm not sure 
we want to expose a method
    +    // to mess with the refcount, since this is a fairly unique use case
    +    ret = new (ret) HostDBInfo();
    --- End diff --
    
    You allocated ``sizeof(HostDBInfo)`` less than the given size, then put a 
``HostDBInfo`` into it after all? Can you comment what is going on there?


> Hostdb consistency problems due to MultiCache
> ---------------------------------------------
>
>                 Key: TS-4331
>                 URL: https://issues.apache.org/jira/browse/TS-4331
>             Project: Traffic Server
>          Issue Type: Bug
>          Components: HostDB
>            Reporter: Thomas Jackson
>            Assignee: Thomas Jackson
>             Fix For: 7.0.0
>
>
> This ticket is for the correct long term fix to TS-4207
> pulled from a comment, which wraps up the issue
> {quote}
> Leif Hedstrom I have spent a decent amount of time on this while I was OOO on 
> vacation the last couple of weeks. It seems that the root cause of this issue 
> has always existed, and that the addition of always doing hostname storing 
> (https://github.com/apache/trafficserver/commit/0e703e1e) we are just causing 
> the issue to happen all the time.
> To understand the issue I'll give a little background in how hostdb is 
> currently working. Basically hostdb is just a wrapper around this templated 
> struct called MultiCache. MultiCache is "multi" not because it is templated, 
> but because it has two types of storage (static-- blocks and dynamic-- 
> alloc). The static side of the cache can hold N HostDBInfo structs (the 
> results of DNS queries). The dynamic side is used to store the round robin 
> records and various strings associated with the record. The size of this 
> dynamic space is defined as (N x [estimated_heap_bytes_per_entry. The basic 
> problem we are running into is that we are putting too much preassure on the 
> dynamic heap-- such that the heap is getting re-used while people still have 
> references to items in that space.
> So, I've actually been working on re-writing MultiCache to allocate the 
> entire required block at once (so we don't have this problem where the parent 
> exists but not the children), but I'm not certain if we want such a change to 
> go into the 6.x branch (I'm willing to discuss if we want). If we aren't 
> comfortable with such a large change I suggest just accounting for the 
> hostname size in the estimated_heap_bytes_per_entry as a stopgap solution. 
> The maximum allowable size is 253 (so 254 with null terminator), but we could 
> pick a smaller number (~120 or so seems to be more reasonable). Alternatively 
> you can increase the number of records in hostdb (and the size accordingly) 
> to increase the dynamic heap size.
> TLDR; almost done with the long term solution, but I'm not sure if we want to 
> merge that into 6.x-- alternatively we can do a simple workaround in 6.x 
> (https://github.com/apache/trafficserver/pull/553)
> {quote}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to