[Sheepdog] [PATCH v2 1/2] journel: move data commiting out of jrnl_perform()
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Thu Nov 17 05:08:53 CET 2011
At Wed, 16 Nov 2011 20:59:19 +0800,
Liu Yuan wrote:
>
> From: Liu Yuan <tailai.ly at taobao.com>
>
> Let jrnl_perform just concentrate on journeling stuff, not intrude in store IO.
> This would make store IO interface abstracting easier and cleaner.
>
> Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
> ---
> sheep/journal.c | 24 +----------------
> sheep/sheep_priv.h | 2 +-
> sheep/store.c | 72 ++++++++++++++++++++++++++++++++++------------------
> 3 files changed, 49 insertions(+), 49 deletions(-)
>
> diff --git a/sheep/journal.c b/sheep/journal.c
> index beff25c..3fb93f8 100644
> --- a/sheep/journal.c
> +++ b/sheep/journal.c
> @@ -189,34 +189,16 @@ static int jrnl_apply_to_target_object(struct jrnl_descriptor *jd)
> return res;
> }
>
> -static int jrnl_commit_data(struct jrnl_descriptor *jd)
> -{
> - int ret = 0;
> - ssize_t retsize;
> - struct jrnl_head *head = (struct jrnl_head *) &jd->head;
> -
> - retsize = pwrite64(jd->target_fd, jd->data, head->size, head->offset);
> - if (retsize != head->size) {
> - if (errno == ENOSPC)
> - ret = SD_RES_NO_SPACE;
> - else
> - ret = SD_RES_EIO;
> - }
> -
> - return ret;
> -}
> -
> /*
> * We cannot use this function for concurrent write operations
> */
> -int jrnl_perform(int fd, void *buf, size_t count, off_t offset,
> +int jrnl_perform(void *buf, size_t count, off_t offset,
> const char *path, const char *jrnl_dir)
> {
> int ret;
> struct jrnl_descriptor jd;
>
> memset(&jd, 0, sizeof(jd));
> - jd.target_fd = fd;
>
> jd.head.offset = offset;
> jd.head.size = count;
> @@ -240,10 +222,6 @@ int jrnl_perform(int fd, void *buf, size_t count, off_t offset,
> if (ret)
> goto out;
>
> - ret = jrnl_commit_data(&jd);
> - if (ret)
> - goto out;
> -
> ret = jrnl_close(&jd);
> if (ret)
> goto out;
> diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
> index 56bcbd1..ee4deb4 100644
> --- a/sheep/sheep_priv.h
> +++ b/sheep/sheep_priv.h
> @@ -260,7 +260,7 @@ int do_process_main(struct sd_op_template *op, const struct sd_req *req,
> struct sd_rsp *rsp, void *data);
>
> /* Journal */
> -int jrnl_perform(int fd, void *buf, size_t count, off_t offset,
> +int jrnl_perform(void *buf, size_t count, off_t offset,
> const char *path, const char *jrnl_dir);
> int jrnl_recover(const char *jrnl_dir);
>
> diff --git a/sheep/store.c b/sheep/store.c
> index b04228e..3a04c34 100644
> --- a/sheep/store.c
> +++ b/sheep/store.c
> @@ -638,18 +638,17 @@ static int store_write_obj_fd(int fd, struct request *req, uint32_t epoch)
>
> snprintf(path, sizeof(path), "%s%08u/%016" PRIx64, obj_path,
> epoch, oid);
> - ret = jrnl_perform(fd, req->data, hdr->data_length,
> + ret = jrnl_perform(req->data, hdr->data_length,
> hdr->offset, path, jrnl_path);
> if (ret)
> return ret;
> - } else {
> - ret = pwrite64(fd, req->data, hdr->data_length, hdr->offset);
> - if (ret != hdr->data_length) {
> - if (errno == ENOSPC)
> - return SD_RES_NO_SPACE;
> - eprintf("%m\n");
> - return SD_RES_EIO;
> - }
> + }
> + ret = pwrite64(fd, req->data, hdr->data_length, hdr->offset);
> + if (ret != hdr->data_length) {
> + if (errno == ENOSPC)
> + return SD_RES_NO_SPACE;
> + eprintf("%m\n");
> + return SD_RES_EIO;
> }
>
> return SD_RES_SUCCESS;
> @@ -1093,17 +1092,24 @@ int set_cluster_ctime(uint64_t ct)
>
> fd = open(config_path, O_DSYNC | O_WRONLY);
> if (fd < 0)
> - return -1;
> + return SD_RES_EIO;
>
> - ret = jrnl_perform(fd, &ct, sizeof(ct),
> + ret = jrnl_perform(&ct, sizeof(ct),
> offsetof(struct sheepdog_config, ctime),
> config_path, jrnl_path);
> + if (ret) {
> + ret = SD_RES_EIO;
> + goto err;
> + }
> + ret = pwrite64(fd, &ct, sizeof(ct), offsetof(struct sheepdog_config, ctime));
> + if (ret != sizeof(ct)) {
> + ret = SD_RES_EIO;
> + goto err;
> + }
> + ret = SD_RES_SUCCESS;
> +err:
> close(fd);
> -
> - if (ret)
> - return -1;
> -
> - return 0;
> + return ret;
> }
>
> uint64_t get_cluster_ctime(void)
> @@ -2130,15 +2136,23 @@ int set_cluster_copies(uint8_t copies)
> if (fd < 0)
> return SD_RES_EIO;
>
> - ret = jrnl_perform(fd, &copies, sizeof(copies),
> + ret = jrnl_perform(&copies, sizeof(copies),
> offsetof(struct sheepdog_config, copies),
> config_path, jrnl_path);
> - close(fd);
> -
> - if (ret != 0)
> - return SD_RES_EIO;
> + if (ret != 0) {
> + ret = SD_RES_EIO;
> + goto err;
> + }
>
> - return SD_RES_SUCCESS;
> + ret = pwrite64(fd, &copies, sizeof(copies), offsetof(struct sheepdog_config, copies));
> + if (ret != sizeof(copies)) {
> + ret = SD_RES_EIO;
> + goto err;
> + }
> + ret = SD_RES_SUCCESS;
> +err:
> + close(fd);
> + return ret;
> }
>
> int get_cluster_copies(uint8_t *copies)
> @@ -2167,12 +2181,20 @@ int set_cluster_flags(uint16_t flags)
> if (fd < 0)
> goto out;
>
> - ret = jrnl_perform(fd, &flags, sizeof(flags),
> + ret = jrnl_perform(&flags, sizeof(flags),
> offsetof(struct sheepdog_config, flags),
> config_path, jrnl_path);
> - if (ret != 0)
> + if (ret != 0) {
> ret = SD_RES_EIO;
> -
> + goto err;
> + }
> + ret = pwrite64(fd, &flags, sizeof(flags), offsetof(struct sheepdog_config, flags));
jrnl_remove() is called in jrnl_perform(), so it seems that the
journal is removed before writing data. I think we need to split
jrnl_perform() into two parts, writing journal and cleaning up.
Thanks,
Kazutaka
> + if (ret != sizeof(flags)) {
> + ret = SD_RES_EIO;
> + goto err;
> + }
> + ret = SD_RES_SUCCESS;
> +err:
> close(fd);
> out:
> return ret;
> --
> 1.7.6.1
>
> --
> sheepdog mailing list
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog
More information about the sheepdog
mailing list