[sheepdog] [PATCH v2 3/5] sheep: use rbtree to manage vnodes hash ring
Hitoshi Mitake
mitake.hitoshi at gmail.com
Wed Sep 11 07:31:46 CEST 2013
At Tue, 10 Sep 2013 10:53:50 +0800,
Liu Yuan wrote:
>
> Signed-off-by: Liu Yuan <namei.unix at gmail.com>
> ---
> dog/dog.c | 6 +-
> dog/dog.h | 4 +-
> dog/vdi.c | 20 ++---
> include/internal_proto.h | 1 -
> include/sheep.h | 199 +++++++++++++++-------------------------------
> sheep/gateway.c | 8 +-
> sheep/group.c | 12 ++-
> sheep/plain_store.c | 3 +-
> sheep/recovery.c | 7 +-
> sheep/request.c | 6 +-
> 10 files changed, 98 insertions(+), 168 deletions(-)
>
> diff --git a/dog/dog.c b/dog/dog.c
> index 9ec41c1..0009c92 100644
> --- a/dog/dog.c
> +++ b/dog/dog.c
> @@ -49,8 +49,8 @@ static void usage(const struct command *commands, int status);
> uint32_t sd_epoch;
>
> struct sd_node sd_nodes[SD_MAX_NODES];
> -struct sd_vnode sd_vnodes[SD_MAX_VNODES];
> -int sd_nodes_nr, sd_vnodes_nr;
> +int sd_nodes_nr;
> +struct rb_root sd_vroot = RB_ROOT;
>
> int update_node_list(int max_nodes)
> {
> @@ -92,7 +92,7 @@ int update_node_list(int max_nodes)
> }
>
> memcpy(sd_nodes, buf, size);
> - sd_vnodes_nr = nodes_to_vnodes(sd_nodes, sd_nodes_nr, sd_vnodes);
> + nodes_to_vnodes(sd_nodes, sd_nodes_nr, &sd_vroot);
> sd_epoch = hdr.epoch;
> out:
> if (buf)
> diff --git a/dog/dog.h b/dog/dog.h
> index e1c499e..9b17eb7 100644
> --- a/dog/dog.h
> +++ b/dog/dog.h
> @@ -56,8 +56,8 @@ extern bool verbose;
>
> extern uint32_t sd_epoch;
> extern struct sd_node sd_nodes[SD_MAX_NODES];
> -extern struct sd_vnode sd_vnodes[SD_MAX_VNODES];
> -extern int sd_nodes_nr, sd_vnodes_nr;
> +extern struct rb_root sd_vroot;
> +extern int sd_nodes_nr;
>
> bool is_current(const struct sd_inode *i);
> char *strnumber(uint64_t _size);
> diff --git a/dog/vdi.c b/dog/vdi.c
> index 82821ac..c99d0ae 100644
> --- a/dog/vdi.c
> +++ b/dog/vdi.c
> @@ -904,14 +904,12 @@ static int do_track_object(uint64_t oid, uint8_t nr_copies)
> int i, j, ret;
> struct sd_req hdr;
> struct sd_rsp *rsp = (struct sd_rsp *)&hdr;
> - struct sd_vnode *vnodes;
> const struct sd_vnode *vnode_buf[SD_MAX_COPIES];
> struct epoch_log *logs;
> - int vnodes_nr, nr_logs, log_length;
> + int nr_logs, log_length;
>
> log_length = sd_epoch * sizeof(struct epoch_log);
> logs = xmalloc(log_length);
> - vnodes = xmalloc(sizeof(*vnodes) * SD_MAX_VNODES);
>
> sd_init_req(&hdr, SD_OP_STAT_CLUSTER);
> hdr.data_length = log_length;
> @@ -927,6 +925,9 @@ static int do_track_object(uint64_t oid, uint8_t nr_copies)
>
> nr_logs = rsp->data_length / sizeof(struct epoch_log);
> for (i = nr_logs - 1; i >= 0; i--) {
> + struct rb_root vroot;
This patch cannot pass the test 048. You need to declare the above vroot like this:
struct rb_root vroot = RB_ROOT;
Thanks,
Hitoshi
More information about the sheepdog
mailing list