[sheepdog] [PATCH] http: refactor do_kv_create_object
Robin Dong
robin.k.dong at gmail.com
Fri Nov 29 06:47:19 CET 2013
Reviewed-by: Robin Dong <sanbai at taobao.com>
2013/11/26 Liu Yuan <namei.unix at gmail.com>
> - add comment to it
>
> Signed-off-by: Liu Yuan <namei.unix at gmail.com>
> ---
> 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
> sheepdog at lists.wpkg.org
> http://lists.wpkg.org/mailman/listinfo/sheepdog
>
--
--
Best Regard
Robin Dong
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.wpkg.org/pipermail/sheepdog/attachments/20131129/68cfc537/attachment-0004.html>
More information about the sheepdog
mailing list