[Sheepdog] [PATCH 2/2] remove oids from object list cache when deleting a vdi

Liu Yuan namei.unix at gmail.com
Thu Apr 26 05:22:53 CEST 2012


On 04/26/2012 10:45 AM, Li Wenpeng wrote:

> From: levin li <xingke.lwp at taobao.com>
> 
> when deleting data objects, we need to remove their oid
> from all the nodes' objlist cache, so we record which objects
> are deleted, and notify a deletion list to all the nodes,
> every node removes the oids in the list from its cache.
> 
> Signed-off-by: levin li <xingke.lwp at taobao.com>
> ---
>  include/sheep.h    |    1 +
>  sheep/ops.c        |   17 +++++++++++++++++
>  sheep/sheep_priv.h |    1 +
>  sheep/store.c      |   16 ++++++++++++++++
>  sheep/vdi.c        |   50 ++++++++++++++++++++++++++++++++++++++++++++++----
>  5 files changed, 81 insertions(+), 4 deletions(-)
> 
> diff --git a/include/sheep.h b/include/sheep.h
> index fc2ac58..b80bc01 100644
> --- a/include/sheep.h
> +++ b/include/sheep.h
> @@ -45,6 +45,7 @@
>  #define SD_OP_CLEANUP        0x94
>  #define SD_OP_TRACE          0x95
>  #define SD_OP_TRACE_CAT      0x96
> +#define SD_OP_NOTIFY_VDI_DEL 0x97
>  
>  #define SD_FLAG_CMD_IO_LOCAL   0x0010
>  #define SD_FLAG_CMD_RECOVERY 0x0020
> diff --git a/sheep/ops.c b/sheep/ops.c
> index 54e866c..b90c16b 100644
> --- a/sheep/ops.c
> +++ b/sheep/ops.c
> @@ -452,6 +452,17 @@ static int cluster_cleanup(const struct sd_req *req, struct sd_rsp *rsp,
>  	return ret;
>  }
>  
> +static int cluster_notify_vdi_deletion(const struct sd_req *req, struct sd_rsp *rsp,
> +				void *data)
> +{
> +	int count = req->data_length / sizeof(uint64_t);
> +	uint64_t *oids = data;
> +
> +	del_vdi_from_objlist_cache(oids, count);
> +
> +	return SD_RES_SUCCESS;
> +}
> +
>  static int cluster_restore(const struct sd_req *req, struct sd_rsp *rsp,
>  			   void *data)
>  {
> @@ -607,6 +618,12 @@ static struct sd_op_template sd_ops[] = {
>  		.process_main = cluster_cleanup,
>  	},
>  
> +	[SD_OP_NOTIFY_VDI_DEL] = {
> +		.type = SD_OP_TYPE_CLUSTER,
> +		.force = 1,
> +		.process_main = cluster_notify_vdi_deletion,
> +	},
> +
>  	/* local operations */
>  	[SD_OP_GET_STORE_LIST] = {
>  		.type = SD_OP_TYPE_LOCAL,
> diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
> index 1c27808..4330a62 100644
> --- a/sheep/sheep_priv.h
> +++ b/sheep/sheep_priv.h
> @@ -292,6 +292,7 @@ void resume_recovery_work(void);
>  int is_recoverying_oid(uint64_t oid);
>  int node_in_recovery(void);
>  
> +int del_vdi_from_objlist_cache(uint64_t *oids, int count);
>  int write_object(struct sd_vnode *e,
>  		 int vnodes, int zones, uint32_t node_version,
>  		 uint64_t oid, char *data, unsigned int datalen,
> diff --git a/sheep/store.c b/sheep/store.c
> index dac0bff..350c5af 100644
> --- a/sheep/store.c
> +++ b/sheep/store.c
> @@ -133,6 +133,22 @@ static int check_and_insert_objlist_cache(uint64_t oid)
>  	return 0;
>  }
>  
> +int del_vdi_from_objlist_cache(uint64_t *oids, int count)
> +{
> +	int i;
> +	dprintf("%d\n", count);
> +
> +	for (i = 0; i < count; i++) {
> +		dprintf("remove oid %" PRIx64 " from objlist cache\n", oids[i]);
> +		pthread_rwlock_wrlock(&obj_list_cache.lock);
> +		if (!objlist_cache_rb_remove(&obj_list_cache.root, oids[i]))
> +			obj_list_cache.cache_size--;
> +		pthread_rwlock_unlock(&obj_list_cache.lock);
> +	}
> +
> +	return 0;
> +}
> +


We shouldn't call it in main thread, we'd better put it in notify worker
thread.

And I guess you have to write down in the commit why you need this
operation.

Thanks,
Yuan



More information about the sheepdog mailing list