>
>
> On Monday, October 3, 2016 at 9:17:00 PM UTC-4, Dormando wrote:
>
>
>       On Mon, 3 Oct 2016, yuantao peng wrote:
>
>       > Hi,  --    I am reading memcached source code and got a question on 
> this function:  do_slabs_alloc_chunked,   it is called by do_slabs_alloc if 
> the request size
>       is larger than
>       > the slabclass size.  I am curious why we don't just move to a 
> slabclass with larger size instead?  Also, I am not sure I understand the way 
> it calculated the
>       number of chunks
>       > needed:
>
>       That's only used if it's already at the highest slab class. It chains
>       multiple chunks of the highest possible class together.
>
>       >     int csize = p->size - sizeof(item_chunk);
>       >     unsigned int chunks_req = size / csize;
>       >     if (size % csize != 0)
>       >         chunks_req++;
>       >
>       >
>       > later on, we store the first chunk in do_item_alloc as follows:
>       >
>       > if (it->it_flags & ITEM_CHUNKED) {
>       >         item_chunk *chunk = (item_chunk *) ITEM_data(it);
>       >
>       >         chunk->next = (item_chunk *) it->h_next;
>       >         chunk->prev = 0;
>       >         chunk->head = it;
>       >         /* Need to chain back into the head's chunk */
>       >         chunk->next->prev = chunk;
>       >         chunk->size = chunk->next->size - ((char *)chunk - (char 
> *)it);
>       >         chunk->used = 0;
>       >         assert(chunk->size > 0);
>       >     }
>       >
>       > That means the first item has an item_chunk header next to item 
> header,   then the csize calculation is wrong, isn't it?   Say if csize 
> equals 2,  we will
>       actually need 3
>       > chunks, because the first chunk will have more meta data 
> (item+item_chunk),   am I missing something here?
>
>       Wish I didn't have to do that, it is pretty confusing. I can double 
> check
>       but the size of the header is added and removed in the appropriate 
> places
>       and it's gotten quite a lot of testing.
>
>       That particular section you're looking at is settign the initial chunk
>       size to the potential size of the chunk minus the offset the current 
> chunk
>       is into the overall item the header is stored into. So that should take
>       into account the entire rendered metadata.
>
>
>  It is indeed quite confusing. :)   Say if the highest slab class have size 
> 2000 bytes,  and sizeof(item) and sizeof(item_chunk) are all 40 bytes,  If I 
> call slab_alloc with
> ntotal=3920 bytes,
>  since csize = p->size - sizeof(item_chunk) ,  csize would be 2000-40=1960,  
> and  chunks_req=3920/1960=2.  
>
>  the following code in do_item_alloc will set the first chunk size to 
> (2000-40)=1960,  
>    chunk->size = chunk->next->size - ((char *)chunk - (char *)it);
>
> but the first chunk is set to start at the location ITEM_data(it) as follows, 
> which is after the struct item meta data,  shouldn't the chunk size here is 
> actually smaller than
> 1960 because item_chunk meta data of the first chunk will also consume some 
> space?   
>
> item_chunk *chunk = (item_chunk *) ITEM_data(it);
>   

Did you have a chance to play with the tests yourself? I didn't have
enough time for the last bugfix release to look into it myself.

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"memcached" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to memcached+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to