[Sheepdog] [PATCH v6 8/8] object cache: implement vdi delete operation

Liu Yuan namei.unix at gmail.com
Mon Mar 26 15:48:30 CEST 2012


From: Liu Yuan <tailai.ly at taobao.com>


Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
 sheep/object_cache.c |   29 +++++++++++++++++++++++++++++
 sheep/ops.c          |    2 ++
 sheep/sheep_priv.h   |    1 +
 3 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/sheep/object_cache.c b/sheep/object_cache.c
index fb8ff85..68251b5 100644
--- a/sheep/object_cache.c
+++ b/sheep/object_cache.c
@@ -436,6 +436,35 @@ int object_is_cached(uint64_t oid)
 		return 1; /* found it */
 }
 
+void object_cache_delete(uint32_t vid)
+{
+	struct object_cache *cache;
+
+	cache = find_object_cache(vid, 0);
+	if (cache) {
+		int h = hash(vid);
+		struct object_cache_entry *entry, *t;
+		struct strbuf buf = STRBUF_INIT;
+
+		/* Firstly we free memeory */
+		pthread_mutex_lock(&hashtable_lock[h]);
+		hlist_del(&cache->hash);
+		pthread_mutex_unlock(&hashtable_lock[h]);
+
+		list_for_each_entry_safe(entry, t, &cache->dirty_list, list) {
+			free(entry);
+		}
+		free(cache);
+
+		/* Then we free disk */
+		strbuf_addf(&buf, "%s/%06"PRIx32, cache_dir, vid);
+		rmdir_r(buf.buf);
+
+		strbuf_release(&buf);
+	}
+
+}
+
 int object_cache_init(const char *p)
 {
 	int ret = 0;
diff --git a/sheep/ops.c b/sheep/ops.c
index b09a79f..ec40986 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -93,6 +93,8 @@ static int cluster_del_vdi(const struct sd_req *req, struct sd_rsp *rsp,
 	ret = del_vdi(hdr->epoch, data, hdr->data_length, &vid,
 		      hdr->snapid, &nr_copies);
 
+	if (ret == SD_RES_SUCCESS)
+		object_cache_delete(vid);
 	vdi_rsp->vdi_id = vid;
 	vdi_rsp->copies = nr_copies;
 
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 1d3749d..f2ce87e 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -423,5 +423,6 @@ int object_cache_pull(struct object_cache *oc, uint32_t index);
 int object_cache_push(struct object_cache *oc);
 int object_cache_init(const char *p);
 int object_is_cached(uint64_t oid);
+void object_cache_delete(uint32_t vid);
 
 #endif
-- 
1.7.8.2




More information about the sheepdog mailing list