[sheepdog] [PATCH v4 7/8] object cache: refactor object_cache_remove()

levin li levin108 at gmail.com
Fri Jul 27 06:27:41 CEST 2012


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




More information about the sheepdog mailing list