From: levin li <xingke.lwp at taobao.com> Since all the cache entry are not stored in memory, we can not only remove entry from dirty tree/list, we should also remove it from the object tree/list. Signed-off-by: levin li <xingke.lwp at taobao.com> --- sheep/object_cache.c | 29 ++++++----------------------- 1 files changed, 6 insertions(+), 23 deletions(-) diff --git a/sheep/object_cache.c b/sheep/object_cache.c index 371c08e..7223cd7 100644 --- a/sheep/object_cache.c +++ b/sheep/object_cache.c @@ -204,32 +204,12 @@ static struct object_cache_entry *object_tree_search(struct rb_root *root, return NULL; } -static struct object_cache_entry *dirty_tree_search(struct rb_root *root, - uint32_t idx) -{ - struct rb_node *n = root->rb_node; - struct object_cache_entry *t; - - while (n) { - t = rb_entry(n, struct object_cache_entry, dirty_node); - - if (idx < t->idx) - n = n->rb_left; - else if (idx > t->idx) - n = n->rb_right; - else - return t; /* found it */ - } - - return NULL; -} - static inline void del_from_dirty_tree_and_list(struct object_cache_entry *entry, struct rb_root *dirty_tree) { rb_erase(&entry->dirty_node, dirty_tree); - list_del(&entry->list); + list_del_init(&entry->list); } static inline void @@ -1188,10 +1168,13 @@ void object_cache_remove(uint64_t oid) return; pthread_rwlock_wrlock(&oc->lock); - entry = dirty_tree_search(&oc->dirty_tree, idx); + entry = object_tree_search(&oc->object_tree, idx); if (!entry) goto out; - del_from_dirty_tree_and_list(entry, &oc->dirty_tree); + if (!list_empty(&entry->list)) + del_from_dirty_tree_and_list(entry, &oc->dirty_tree); + del_from_object_tree_and_list(entry, &oc->object_tree); + free(entry); out: pthread_rwlock_unlock(&oc->lock); return; -- 1.7.1 |