At Thu, 10 May 2012 16:49:31 +0800, yaohaiting.wujue at gmail.com wrote: > > From: HaiTing Yao <wujue.yht at taobao.com> > > When create snapshot, write inode of base VDI internally without > care of cache. Then the inode in cache may be wrong from disk > > Signed-off-by: HaiTing Yao <wujue.yht at taobao.com> > --- > sheep/store.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 49 insertions(+), 0 deletions(-) > > changes from v1 > > Rebase the v1 patch to codes now Applied, thanks. Note that this doesn't still pass the testcase I posted before: == $ qemu-img convert ~/linux.img sheepdog:linux $ collie vdi read linux 0 512 | hd | head -1 00000000 fa eb 7c 6c 62 61 4c 49 4c 4f 01 00 15 04 09 00 |..|lbaLILO......| $ qemu-img snapshot -c snap sheepdog:linux $ collie vdi read linux 0 512 | hd | head -1 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| == I guess it is because read_object() doesn't read the cached data. This is a wrong behavior as a block storage because we need to read the latest data even if it is not flushed, so I hope it would be fixed too. Thanks, Kazutaka > > diff --git a/sheep/store.c b/sheep/store.c > index f8bf404..8ca71dc 100644 > --- a/sheep/store.c > +++ b/sheep/store.c > @@ -899,6 +899,46 @@ static int write_object_local(uint64_t oid, char *data, unsigned int datalen, > > return ret; > } > + > +static int write_inode_cache(uint64_t oid, char *data, unsigned int datalen, > + uint64_t offset, uint16_t flags, int copies, > + uint32_t epoch, int create) > +{ > + int ret; > + struct request *req; > + struct sd_obj_req *hdr; > + uint32_t vid = oid_to_vid(oid); > + uint32_t idx = data_oid_to_idx(oid); > + struct object_cache *cache; > + > + idx |= 1 << CACHE_VDI_SHIFT; > + > + cache = find_object_cache(vid, 0); > + > + req = zalloc(sizeof(*req)); > + if (!req) > + return SD_RES_NO_MEM; > + hdr = (struct sd_obj_req *)&req->rq; > + > + hdr->oid = oid; > + if (create) > + hdr->opcode = SD_OP_CREATE_AND_WRITE_OBJ; > + else > + hdr->opcode = SD_OP_WRITE_OBJ; > + hdr->copies = copies; > + hdr->flags = flags | SD_FLAG_CMD_WRITE; > + hdr->offset = offset; > + hdr->data_length = datalen; > + req->data = data; > + req->op = get_sd_op(hdr->opcode); > + > + ret = object_cache_rw(cache, idx, req); > + > + free(req); > + > + return ret; > +} > + > 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_copies, int create) > @@ -908,6 +948,15 @@ int write_object(struct vnode_info *vnodes, uint32_t node_version, > int i, fd, ret; > char name[128]; > > + if (object_is_cached(oid)) { > + ret = write_inode_cache(oid, data, datalen, offset, > + flags, nr_copies, node_version, create); > + if (ret != 0) { > + eprintf("fail %"PRIx64" %"PRIx32"\n", oid, ret); > + return -1; > + } > + } > + > for (i = 0; i < nr_copies; i++) { > unsigned rlen = 0, wlen = datalen; > > -- > 1.7.1 > > -- > sheepdog mailing list > sheepdog at lists.wpkg.org > http://lists.wpkg.org/mailman/listinfo/sheepdog |