[Sheepdog] [PATCH] remove object oids from object list cache when deleting a vdi
Liu Yuan
namei.unix at gmail.com
Tue Apr 17 09:22:41 CEST 2012
On 04/17/2012 02:51 PM, Li Wenpeng wrote:
> From: levin li <xingke.lwp at taobao.com>
>
> When deleting a vdi, sheep removes data objects of that vdi, in which
> case we need to remove the object ids from the object list cache for
> the good of next data recovery.
>
> Signed-off-by: levin li <xingke.lwp at taobao.com>
> ---
> sheep/store.c | 27 +++++++++++++++++++++++++++
> sheep/vdi.c | 1 +
> 2 files changed, 28 insertions(+), 0 deletions(-)
>
> diff --git a/sheep/store.c b/sheep/store.c
> index b50ce22..5b581cd 100644
> --- a/sheep/store.c
> +++ b/sheep/store.c
> @@ -85,6 +85,29 @@ static struct objlist_cache_entry *objlist_cache_rb_insert(struct rb_root *root,
> return NULL; /* insert successfully */
> }
>
> +static int objlist_cache_rb_remove(struct rb_root *root, uint64_t oid)
> +{
> + struct rb_node **p = &root->rb_node;
> + struct rb_node *parent = NULL;
> + struct objlist_cache_entry *entry;
> +
> + while (*p) {
> + parent = *p;
> + entry = rb_entry(parent, struct objlist_cache_entry, node);
> +
> + if (oid < entry->oid)
> + p = &(*p)->rb_left;
> + else if (oid > entry->oid)
> + p = &(*p)->rb_right;
> + else {
> + rb_erase(parent, root);
> + return 0;
> + }
> + }
> +
> + return -1; /* fail to remove */
> +}
> +
> static int check_and_insert_objlist_cache(uint64_t oid)
> {
> struct objlist_cache_entry *entry, *p;
> @@ -600,6 +623,10 @@ int store_remove_obj(const struct sd_req *req, struct sd_rsp *rsp, void *data)
> eprintf("%m\n");
> ret = SD_RES_EIO;
> }
> + pthread_rwlock_wrlock(&obj_list_cache.lock);
> + if (!objlist_cache_rb_remove(&obj_list_cache.root, hdr->oid))
> + obj_list_cache.cache_size--;
> + pthread_rwlock_unlock(&obj_list_cache.lock);
> out:
> strbuf_release(&buf);
> return ret;
> diff --git a/sheep/vdi.c b/sheep/vdi.c
> index 45e77fe..71912ba 100644
> --- a/sheep/vdi.c
> +++ b/sheep/vdi.c
> @@ -473,6 +473,7 @@ static void delete_one(struct work *work)
> vid_to_data_oid(inode->data_vdi_id[i], i),
> inode->nr_copies);
> }
> +
> out:
> free_ordered_sd_vnode_list(entries);
> free(inode);
Applied, thanks.
Yuan
More information about the sheepdog
mailing list