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 |