[Sheepdog] [PATCH 1/3] collie: make some optimization for parse_objs()
Li Wenpeng
levin108 at gmail.com
Fri Apr 13 10:20:00 CEST 2012
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);
--
1.7.1
More information about the sheepdog
mailing list