On 04/29/2014 05:29 AM, Amos Jeffries wrote:

> +1. All good apart form one minor nit:
> 
> src/tests/stub_store.cc
>  * the new checkCacheable() needs to be STUB_RETVAL(false).
> 
> That can be added on merge.


Finally merged as trunk r13475.

Please note that another, unaudited fix for a frequent shared memory
cache assertion was included in this merge:


> Avoid store_client.cc "entry->swap_filen > -1 || entry->swappingOut()" 
> asserts.
> 
> A client may hit on an incomplete shared memory cache entry. Such entry is
> fully backed by the shared memory cache, but the copy of its data in local RAM
> may be trimmed. When that trimMemory() happens, StoreEntry::storeClientType()
> assumes DISK_CLIENT due to positive inmem_lo, and the store_client constructor
> asserts upon discovering that there is no disk backing.
> 
> To improve shared cache effectiveness for "being cached" entries, we need to
> prevent local memory trimming while the shared cache entry is being filled
> (possibly by another worker, so this is far from trivial!) or, better, stop
> using the local memory for entries feeding off the shared memory cache. The
> latter would also require revising DISK_CLIENT designation to include entries
> backed by a shared memory cache.


This production-tested fix essentially reorders two checks in
StoreEntry::validToSend():


>      if (!mem_obj) // not backed by a memory cache and not collapsed
>          return 0;
>  
> -    if (mem_obj->memCache.index >= 0) // backed by a shared memory cache
> -        return 1;
> -
>      // StoreEntry::storeClientType() assumes DISK_CLIENT here, but there is 
> no
> -    // disk cache backing so we should not rely on the store cache at all. 
> This
> -    // is wrong for range requests that could feed off nibbled memory (XXX).
> -    if (mem_obj->inmem_lo) // in local memory cache, but got nibbled at
> +    // disk cache backing that store_client constructor will assert. XXX: 
> This
> +    // is wrong for range requests (that could feed off nibbled memory) and 
> for
> +    // entries backed by the shared memory cache (that could, in theory, get
> +    // nibbled bytes from that cache, but there is no such "memoryIn" code).
> +    if (mem_obj->inmem_lo) // in memory cache, but got nibbled at
>          return 0;
>  
> +    // The following check is correct but useless at this position. TODO: 
> Move
> +    // it up when the shared memory cache can either replenish locally 
> nibbled
> +    // bytes or, better, does not use local RAM copy at all.
> +    // if (mem_obj->memCache.index >= 0) // backed by a shared memory cache
> +    //    return 1;
> +
>      return 1;
>  }


I can adjust or revert this if needed, of course.


Thank you,

Alex.

Reply via email to