[sheepdog] [PATCH v2] http: use hyper volume for bucket
MORITA Kazutaka
morita.kazutaka at gmail.com
Fri Nov 22 19:19:03 CET 2013
At Wed, 20 Nov 2013 19:36:10 +0800,
Liu Yuan wrote:
>
> - use sd_inode helper to update inode correctly
> - pass system copy_policy when creating bucket
>
> Signed-off-by: Liu Yuan <namei.unix at gmail.com>
> ---
> -set 'direct' as false for sd_inode_write_vid()
>
> sheep/http/kv.c | 20 ++++++++++++++++----
> 1 file changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/sheep/http/kv.c b/sheep/http/kv.c
> index 39fb294..1cd8885 100644
> --- a/sheep/http/kv.c
> +++ b/sheep/http/kv.c
> @@ -60,6 +60,8 @@ int kv_create_bucket(struct http_request *req, const char *bucket)
>
> hdr.vdi.vdi_size = SD_MAX_VDI_SIZE;
> hdr.vdi.copies = sys->cinfo.nr_copies;
> + hdr.vdi.copy_policy = sys->cinfo.copy_policy;
> + hdr.vdi.store_policy = 1;
>
> ret = exec_local_req(&hdr, buf);
> switch (ret) {
> @@ -221,10 +223,20 @@ static int do_kv_create_object(struct http_request *req, const char *obj_name,
>
> if (memcmp(&hdr, &obj->hdr, sizeof(hdr)) == 0) {
> /* update inode object */
> - uint64_t offset = offsetof(struct sd_inode, data_vdi_id)
> - + idx * sizeof(vid);
> - ret = write_object(vid_to_vdi_oid(vid), (char *)&vid,
> - sizeof(vid), offset, false);
> + struct sd_inode *inode = xmalloc(sizeof(struct sd_inode));
> +
> + ret = read_object(vid_to_vdi_oid(vid), (char *)inode,
> + sizeof(*inode), 0);
> + if (ret != SD_RES_SUCCESS) {
> + sd_err("failed to read inode, %" PRIx64,
> + vid_to_vdi_oid(vid));
> + free(inode);
> + 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));
Applied, thanks.
However, reading whole inode object for each create operation is too
expensive. I think we really need optimization here in future.
Kazutaka
More information about the sheepdog
mailing list