Reviewed-by: Robin Dong <[email protected]>
2013/11/26 Liu Yuan <[email protected]> > - add comment to it > > Signed-off-by: Liu Yuan <[email protected]> > --- > sheep/http/kv.c | 78 > +++++++++++++++++++++++++++---------------------------- > 1 file changed, 38 insertions(+), 40 deletions(-) > > diff --git a/sheep/http/kv.c b/sheep/http/kv.c > index 3770fdb..d30a6a1 100644 > --- a/sheep/http/kv.c > +++ b/sheep/http/kv.c > @@ -190,74 +190,72 @@ struct kv_object { > uint8_t data[SD_DATA_OBJ_SIZE - sizeof(struct kv_object_hdr)]; > }; > > +/* > + * Create the object if the index isn't taken. Overwrite the object if it > exists > + * Return 0 if the index is taken by other object. > + */ > static int do_kv_create_object(struct http_request *req, const char > *obj_name, > struct kv_object *obj, uint32_t vid, > uint32_t idx) > { > uint64_t oid = vid_to_data_oid(vid, idx); > + uint32_t tmp_vid; > struct kv_object_hdr hdr; > + struct sd_inode *inode = xmalloc(sizeof(struct sd_inode)); > int ret; > > - ret = write_object(oid, (char *)obj, sizeof(obj->hdr) + > obj->hdr.size, > - 0, true); > - if (ret != SD_RES_SUCCESS) { > - sd_err("failed to create object, %" PRIx64, oid); > - goto err; > - } > - > - /* > - * XXX: SD_OP_CREATE_AND_WRITE_OBJ returns success even if the > object > - * alreay exists. We need to confirm that the stored object is > actually > - * what we wrote. > - */ > - ret = read_object(oid, (char *)&hdr, sizeof(hdr), 0); > + ret = read_object(vid_to_vdi_oid(vid), (char *)inode, > + sizeof(*inode), 0); > if (ret != SD_RES_SUCCESS) { > - sd_err("failed to read object, %" PRIx64, oid); > + sd_err("failed to read inode, %" PRIx64, > + vid_to_vdi_oid(vid)); > goto err; > } > + tmp_vid = INODE_GET_VID(inode, idx); > + if (tmp_vid) { > + ret = read_object(oid, (char *)&hdr, sizeof(hdr), 0); > + if (ret != SD_RES_SUCCESS) { > + sd_err("failed to read object, %" PRIx64, oid); > + goto err; > + } > > - if (hdr.name[0] != '\0' && strcmp(hdr.name, obj->hdr.name) != 0) { > - sd_debug("index %d is already used", idx); > - return 0; > - } > - > - if (memcmp(&hdr, &obj->hdr, sizeof(hdr)) == 0) { > - /* update inode object */ > - struct sd_inode *inode = xmalloc(sizeof(struct sd_inode)); > - > - ret = read_object(vid_to_vdi_oid(vid), (char *)inode, > - sizeof(*inode), 0); > + if (hdr.name[0] != '\0' && > + strcmp(hdr.name, obj->hdr.name) != 0){ > + sd_debug("index %d is already used", idx); > + goto out; > + } > + sd_info("overwrite object %s", obj_name); > + ret = write_object(oid, (char *)obj, > + sizeof(obj->hdr) + obj->hdr.size, > + 0, false); > if (ret != SD_RES_SUCCESS) { > - sd_err("failed to read inode, %" PRIx64, > - vid_to_vdi_oid(vid)); > - free(inode); > + sd_err("failed to write object, %" PRIx64, oid); > + goto err; > + } > + } else { > + ret = write_object(oid, (char *)obj, > + sizeof(obj->hdr) + obj->hdr.size, > + 0, true); > + if (ret != SD_RES_SUCCESS) { > + sd_err("failed to create object, %" PRIx64, oid); > goto err; > } > INODE_SET_VID(inode, idx, vid); > ret = sd_inode_write_vid(sheep_bnode_writer, inode, idx, > vid, vid, 0, false, false); > - free(inode); > if (ret != SD_RES_SUCCESS) { > sd_err("failed to update inode, %" PRIx64, > vid_to_vdi_oid(vid)); > goto err; > } > - } else { > - sd_info("object %s already exists", obj_name); > - > - /* write again without a create option */ > - ret = write_object(oid, (char *)obj, > - sizeof(obj->hdr) + obj->hdr.size, 0, > false); > - if (ret != SD_RES_SUCCESS) { > - sd_err("failed to update object, %"PRIx64, oid); > - goto err; > - } > } > - > http_response_header(req, CREATED); > +out: > + free(inode); > return 0; > err: > http_response_header(req, INTERNAL_SERVER_ERROR); > + free(inode); > return -1; > } > > -- > 1.7.9.5 > > -- > sheepdog mailing list > [email protected] > http://lists.wpkg.org/mailman/listinfo/sheepdog > -- -- Best Regard Robin Dong
-- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
