[sheepdog] [PATCH 2/2] sheep: move read/write/remove_object to vdi.c

Yibin Shen zituan at taobao.com
Thu May 31 11:08:12 CEST 2012


On Thu, May 31, 2012 at 4:47 PM, Christoph Hellwig <hch at infradead.org> wrote:
> These helpers are only used by the VDI code to forward I/O requests, so move
> them to vdi.c instead of store.c where they are misplaced.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
>
> ---
>  sheep/sheep_priv.h |    8 ---
>  sheep/store.c      |  132 -----------------------------------------------------
>  sheep/vdi.c        |  131 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 131 insertions(+), 140 deletions(-)
>
> Index: sheepdog/sheep/sheep_priv.h
> ===================================================================
> --- sheepdog.orig/sheep/sheep_priv.h    2012-05-31 10:32:35.275894444 +0200
> +++ sheepdog/sheep/sheep_priv.h 2012-05-31 10:32:36.307894433 +0200
> @@ -291,14 +291,6 @@ int is_recoverying_oid(uint64_t oid);
>  int is_recovery_init(void);
>  int node_in_recovery(void);
>
> -int write_object(struct vnode_info *vnodes, uint32_t node_version,
> -                uint64_t oid, char *data, unsigned int datalen,
> -                uint64_t offset, uint16_t flags, int nr, int create);
> -int read_object(struct vnode_info *vnodes, uint32_t node_version,
> -               uint64_t oid, char *data, unsigned int datalen,
> -               uint64_t offset, int nr);
> -int remove_object(struct vnode_info *vnodes, uint32_t node_version,
> -                 uint64_t oid, int nr);
>  int merge_objlist(uint64_t *list1, int nr_list1, uint64_t *list2, int nr_list2);
>
>  void del_sheep_fd(int fd);
> Index: sheepdog/sheep/store.c
> ===================================================================
> --- sheepdog.orig/sheep/store.c 2012-05-31 10:32:35.279894443 +0200
> +++ sheepdog/sheep/store.c      2012-05-31 10:32:36.307894433 +0200
> @@ -533,138 +533,6 @@ int read_epoch(uint32_t *epoch, uint64_t
>        return SD_RES_SUCCESS;
>  }
>
> -/*
> - * Write data to both local object cache (if enabled) and backends
> - */
> -int write_object(struct vnode_info *vnodes, uint32_t epoch,
> -                uint64_t oid, char *data, unsigned int datalen,
> -                uint64_t offset, uint16_t flags, int nr_copies, int create)
> -{
> -       struct request write_req;
> -       struct sd_req *hdr = &write_req.rq;
> -       int ret;
> -
> -       if (sys->enable_write_cache && object_is_cached(oid)) {
> -               ret = object_cache_write(oid, data, datalen, offset,
> -                       flags, nr_copies, epoch, create);
> -               if (ret != 0) {
> -                       eprintf("write cache failed %"PRIx64" %"PRIx32"\n",
> -                               oid, ret);
> -                       return ret;
> -               }
> -       }
> -
> -       memset(&write_req, 0, sizeof(write_req));
> -       hdr->opcode = create ? SD_OP_CREATE_AND_WRITE_OBJ : SD_OP_WRITE_OBJ;
> -       hdr->flags = SD_FLAG_CMD_WRITE;
> -       hdr->data_length = datalen;
> -       hdr->epoch = epoch;
> -
> -       hdr->obj.oid = oid;
> -       hdr->obj.offset = offset;
> -       hdr->obj.copies = nr_copies;
> -
> -       write_req.data = data;
> -       write_req.op = get_sd_op(hdr->opcode);
> -       write_req.vnodes = vnodes;
> -
> -       ret = forward_write_obj_req(&write_req);
> -       if (ret != SD_RES_SUCCESS)
> -               eprintf("failed to forward write object %x\n", ret);
> -       return ret;
> -}
> -
> -/*
> - * Read data firstly from local object cache(if enabled), if fail,
> - * try read backends
> - */
> -int read_object(struct vnode_info *vnodes, uint32_t epoch,
> -               uint64_t oid, char *data, unsigned int datalen,
> -               uint64_t offset, int nr_copies)
> -{
> -       struct request read_req;
> -       struct sd_req *hdr = &read_req.rq;
> -       int ret;
> -
> -       if (sys->enable_write_cache && object_is_cached(oid)) {
> -               ret = object_cache_read(oid, data, datalen, offset,
> -                                       nr_copies, epoch);
> -               if (ret != SD_RES_SUCCESS) {
> -                       eprintf("try forward read %"PRIx64" %"PRIx32"\n",
> -                               oid, ret);
> -                       goto forward_read;
> -               }
> -               return ret;
> -       }
> -       memset(&read_req, 0, sizeof(read_req));
> -forward_read:
> -       hdr->opcode = SD_OP_READ_OBJ;
> -       hdr->data_length = datalen;
> -       hdr->epoch = epoch;
> -
> -       hdr->obj.oid = oid;
> -       hdr->obj.offset = offset;
> -       hdr->obj.copies = nr_copies;
> -
> -       read_req.data = data;
> -       read_req.op = get_sd_op(hdr->opcode);
> -       read_req.vnodes = vnodes;
> -
> -       ret = forward_read_obj_req(&read_req);
> -       if (ret != SD_RES_SUCCESS)
> -               eprintf("failed to forward read object %x\n", ret);
> -
> -       return ret;
> -}
> -
> -int remove_object(struct vnode_info *vnodes, uint32_t epoch,
> -                 uint64_t oid, int nr)
> -{
> -       struct sd_vnode *obj_vnodes[SD_MAX_COPIES];
> -       int err = 0, i = 0;
> -
> -       oid_to_vnodes(vnodes, oid, nr, obj_vnodes);
> -       for (i = 0; i < nr; i++) {
> -               struct sd_req hdr;
> -               struct sd_rsp *rsp = (struct sd_rsp *)&hdr;
> -               struct sd_vnode *v;
> -               unsigned wlen = 0, rlen = 0;
> -               char name[128];
> -               int fd, ret;
> -
> -               v = obj_vnodes[i];
> -               addr_to_str(name, sizeof(name), v->addr, 0);
> -
> -               fd = connect_to(name, v->port);
> -               if (fd < 0) {
> -                       rsp->result = SD_RES_EIO;
> -                       return -1;
> -               }
> -
> -               memset(&hdr, 0, sizeof(hdr));
> -               hdr.epoch = epoch;
> -               hdr.opcode = SD_OP_REMOVE_OBJ;
> -               hdr.flags = 0;
> -               hdr.data_length = rlen;
> -
> -               hdr.obj.oid = oid;
> -
> -               ret = exec_req(fd, &hdr, NULL, &wlen, &rlen);
> -               close(fd);
> -
> -               if (ret)
> -                       return -1;
> -
> -               if (rsp->result != SD_RES_SUCCESS)
> -                       err = 1;
> -       }
> -
> -       if (err)
> -               return -1;
> -
> -       return 0;
> -}
> -
>  int set_cluster_copies(uint8_t copies)
>  {
>        int fd, ret;
> Index: sheepdog/sheep/vdi.c
> ===================================================================
> --- sheepdog.orig/sheep/vdi.c   2012-05-31 10:32:30.871894485 +0200
> +++ sheepdog/sheep/vdi.c        2012-05-31 10:32:36.307894433 +0200
> @@ -16,6 +16,137 @@
>  #include "sheep_priv.h"
>
>
> +/*
> + * Write data to both local object cache (if enabled) and backends
> + */
> +static int write_object(struct vnode_info *vnodes, uint32_t epoch, uint64_t oid,
> +               char *data, unsigned int datalen, uint64_t offset,
> +               uint16_t flags, int nr_copies, int create)
> +{
> +       struct request write_req;
> +       struct sd_req *hdr = &write_req.rq;
> +       int ret;
> +
> +       if (sys->enable_write_cache && object_is_cached(oid)) {
> +               ret = object_cache_write(oid, data, datalen, offset,
> +                       flags, nr_copies, epoch, create);
> +               if (ret != 0) {
> +                       eprintf("write cache failed %"PRIx64" %"PRIx32"\n",
> +                               oid, ret);
> +                       return ret;
> +               }
> +       }
> +
> +       memset(&write_req, 0, sizeof(write_req));
> +       hdr->opcode = create ? SD_OP_CREATE_AND_WRITE_OBJ : SD_OP_WRITE_OBJ;
> +       hdr->flags = SD_FLAG_CMD_WRITE;
> +       hdr->data_length = datalen;
> +       hdr->epoch = epoch;
> +
> +       hdr->obj.oid = oid;
> +       hdr->obj.offset = offset;
> +       hdr->obj.copies = nr_copies;
> +
> +       write_req.data = data;
> +       write_req.op = get_sd_op(hdr->opcode);
> +       write_req.vnodes = vnodes;
> +
> +       ret = forward_write_obj_req(&write_req);
> +       if (ret != SD_RES_SUCCESS)
> +               eprintf("failed to forward write object %x\n", ret);
> +       return ret;
> +}
> +
> +/*
> + * Read data firstly from local object cache(if enabled), if fail,
> + * try read backends
> + */
> +static int read_object(struct vnode_info *vnodes, uint32_t epoch, uint64_t oid,
> +               char *data, unsigned int datalen, uint64_t offset, int nr_copies)
> +{
> +       struct request read_req;
> +       struct sd_req *hdr = &read_req.rq;
> +       int ret;
> +
> +       if (sys->enable_write_cache && object_is_cached(oid)) {
> +               ret = object_cache_read(oid, data, datalen, offset,
> +                                       nr_copies, epoch);
> +               if (ret != SD_RES_SUCCESS) {
> +                       eprintf("try forward read %"PRIx64" %"PRIx32"\n",
> +                               oid, ret);
> +                       goto forward_read;
> +               }
> +               return ret;
> +       }
> +       memset(&read_req, 0, sizeof(read_req));
> +forward_read:
> +       hdr->opcode = SD_OP_READ_OBJ;
> +       hdr->data_length = datalen;
> +       hdr->epoch = epoch;
> +
> +       hdr->obj.oid = oid;
> +       hdr->obj.offset = offset;
> +       hdr->obj.copies = nr_copies;
> +
> +       read_req.data = data;
> +       read_req.op = get_sd_op(hdr->opcode);
> +       read_req.vnodes = vnodes;
> +
> +       ret = forward_read_obj_req(&read_req);
> +       if (ret != SD_RES_SUCCESS)
> +               eprintf("failed to forward read object %x\n", ret);
> +
> +       return ret;
> +}
> +
> +static int remove_object(struct vnode_info *vnodes, uint32_t epoch,
> +               uint64_t oid, int nr)
> +{
> +       struct sd_vnode *obj_vnodes[SD_MAX_COPIES];
> +       int err = 0, i = 0;
> +
> +       oid_to_vnodes(vnodes, oid, nr, obj_vnodes);
> +       for (i = 0; i < nr; i++) {
> +               struct sd_req hdr;
> +               struct sd_rsp *rsp = (struct sd_rsp *)&hdr;
> +               struct sd_vnode *v;
> +               unsigned wlen = 0, rlen = 0;
> +               char name[128];
> +               int fd, ret;
> +
> +               v = obj_vnodes[i];
> +               addr_to_str(name, sizeof(name), v->addr, 0);
> +
> +               fd = connect_to(name, v->port);
> +               if (fd < 0) {
> +                       rsp->result = SD_RES_EIO;
here should we really need to return EIO?

anyway, every fail in connect_to() should be carefully treated,
because that may cause sheep busy retry.
> +                       return -1;
> +               }
> +
> +               memset(&hdr, 0, sizeof(hdr));
> +               hdr.epoch = epoch;
> +               hdr.opcode = SD_OP_REMOVE_OBJ;
> +               hdr.flags = 0;
> +               hdr.data_length = rlen;
> +
> +               hdr.obj.oid = oid;
> +
> +               ret = exec_req(fd, &hdr, NULL, &wlen, &rlen);
> +               close(fd);
> +
> +               if (ret)
> +                       return -1;
> +
> +               if (rsp->result != SD_RES_SUCCESS)
> +                       err = 1;
> +       }
> +
> +       if (err)
> +               return -1;
> +
> +       return 0;
> +}
> +
>  /* TODO: should be performed atomically */
>  static int create_vdi_obj(struct vnode_info *vnode_info, uint32_t epoch,
>                char *name, uint32_t new_vid, uint64_t size, uint32_t base_vid,
> --
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog

________________________________

This email (including any attachments) is confidential and may be legally privileged. If you received this email in error, please delete it immediately and do not copy it or use it for any purpose or disclose its contents to any other person. Thank you.

本电邮(包括任何附件)可能含有机密资料并受法律保护。如您不是正确的收件人,请您立即删除本邮件。请不要将本电邮进行复制并用作任何其他用途、或透露本邮件之内容。谢谢。



More information about the sheepdog mailing list