the item lock can only protect the hash list, but what about the LRU list? As far as i know, if trying to delete a node from a doubly-linked-list, it is necessary to lock at least 3 node: node, node->pre, node->next. I will try to check if it may crash the LRU list in gdb next week . And I think in do_item_get it is not necessary to delete the item that is re-balanced, just leave it there and return NULL seems better.
在 2014年7月3日星期四UTC+8下午1时30分29秒,Dormando写道: > > the item lock is already held for that key when do_item_get is called, > which is why the nolock code is called there. > > slab rebalance has that second short-circuiting of fetches to ensure very > hot items don't permanently jam a page move. > > On Wed, 2 Jul 2014, Zhiwei Chan wrote: > > > Hi all, I have thought carefully about the the thread-safe memcached > recently, and found that if the re-balance is running, it may not > > thread-safety. The code "do_item_get->do_item_unlink_nolock" may corrupt > the hash table. Whenever it trying to modify the hash table, it should get > > cache_lock, but the function do_item_get have not got the cache_lock. > > Please tell me if anything i neglected. > > > > /** wrapper around assoc_find which does the lazy expiration logic */ > > item *do_item_get(const char *key, const size_t nkey, const uint32_t hv) > { > > //mutex_lock(&cache_lock); > > item *it = assoc_find(key, nkey, hv); > > if (it != NULL) { > > refcount_incr(&it->refcount); > > /* Optimization for slab reassignment. prevents popular items > from > > * jamming in busy wait. Can only do this here to satisfy lock > order > > * of item_lock, cache_lock, slabs_lock. */ > > if (slab_rebalance_signal && > > ((void *)it >= slab_rebal.slab_start && (void *)it < > slab_rebal.slab_end)) { > > do_item_unlink_nolock(it, hv); > -------------------------------------------------------------------> no > lock before unlink. > > do_item_remove(it); > > it = NULL; > > } > > } > > > > -- > > > > --- > > 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+...@googlegroups.com <javascript:>. > > For more options, visit https://groups.google.com/d/optout. > > > > -- --- 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.