[Sheepdog] [PATCH 1/3] collie: make some optimization for parse_objs()
Liu Yuan
namei.unix at gmail.com
Mon Apr 16 09:39:04 CEST 2012
On 04/13/2012 04:20 PM, Li Wenpeng wrote:
> From: levin li <xingke.lwp at taobao.com>
>
> Currently, parse_objs traverse all the nodes to get the object,
> and then call the callback function, it's OK for do_print_obj(),
> but it's a waste for get_data_oid(), when the cluster gets larger
> with more nodes, it makes collie slower the get the object id.
>
> I add a return value for the callback function obj_parse_func_t,
> if the function returns 1, the loop breaks when the first time
> it succeeds, if 0, it will traverse the whole node list.
>
> Signed-off-by: levin li <xingke.lwp at taobao.com>
> ---
> collie/vdi.c | 23 ++++++++++++++++-------
> 1 files changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/collie/vdi.c b/collie/vdi.c
> index 8260eba..9675774 100644
> --- a/collie/vdi.c
> +++ b/collie/vdi.c
> @@ -188,10 +188,10 @@ static void get_oid(uint32_t vid, char *name, char *tag, uint32_t snapid,
> }
> }
>
> -typedef void (*obj_parser_func_t)(char *sheep, uint64_t oid,
> +typedef int (*obj_parser_func_t)(char *sheep, uint64_t oid,
> struct sd_obj_rsp *rsp, char *buf, void *data);
>
> -static void do_print_obj(char *sheep, uint64_t oid, struct sd_obj_rsp *rsp,
> +static int do_print_obj(char *sheep, uint64_t oid, struct sd_obj_rsp *rsp,
> char *buf, void *data)
> {
> switch (rsp->result) {
> @@ -211,6 +211,8 @@ static void do_print_obj(char *sheep, uint64_t oid, struct sd_obj_rsp *rsp,
> sheep, rsp->result);
> break;
> }
> +
> + return 0;
> }
>
> struct get_data_oid_info {
> @@ -219,7 +221,7 @@ struct get_data_oid_info {
> unsigned idx;
> };
>
> -static void get_data_oid(char *sheep, uint64_t oid, struct sd_obj_rsp *rsp,
> +static int get_data_oid(char *sheep, uint64_t oid, struct sd_obj_rsp *rsp,
> char *buf, void *data)
> {
> struct get_data_oid_info *info = data;
> @@ -230,8 +232,10 @@ static void get_data_oid(char *sheep, uint64_t oid, struct sd_obj_rsp *rsp,
> if (info->success)
> break;
> info->success = 1;
> - if (inode->data_vdi_id[info->idx])
> + if (inode->data_vdi_id[info->idx]) {
> info->data_oid = vid_to_data_oid(inode->data_vdi_id[info->idx], info->idx);
> + return 1;
> + }
> break;
> case SD_RES_NO_OBJ:
> break;
> @@ -244,12 +248,14 @@ static void get_data_oid(char *sheep, uint64_t oid, struct sd_obj_rsp *rsp,
> sheep, rsp->result);
> break;
> }
> +
> + return 0;
> }
>
> static void parse_objs(uint64_t oid, obj_parser_func_t func, void *data, unsigned size)
> {
> char name[128];
> - int i, fd, ret;
> + int i, fd, ret, cb_ret;
> char *buf;
>
> buf = zalloc(size);
> @@ -284,8 +290,11 @@ static void parse_objs(uint64_t oid, obj_parser_func_t func, void *data, unsigne
>
> if (ret)
> fprintf(stderr, "Failed to connect to %s\n", name);
> - else
> - func(name, oid, rsp, buf, data);
> + else {
> + cb_ret = func(name, oid, rsp, buf, data);
> + if (cb_ret)
> + break;
> + }
> }
>
> free(buf);
Applied, thanks
Yuan
More information about the sheepdog
mailing list