[Sheepdog] [PATCH] object cache: fix wrong usage oc->oid
Liu Yuan
namei.unix at gmail.com
Tue Apr 3 07:45:38 CEST 2012
On 04/02/2012 06:40 PM, Liu Yuan wrote:
> From: Liu Yuan <tailai.ly at taobao.com>
>
> object cache 'oc' is globally shared by all IO threads, so we cannot
> use oc->oid without lock. Actually, we don't need it at all.
>
> Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
> ---
> sheep/object_cache.c | 16 +++++++++-------
> sheep/sheep_priv.h | 1 -
> sheep/store.c | 1 -
> 3 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/sheep/object_cache.c b/sheep/object_cache.c
> index ed10b86..c1226a4 100644
> --- a/sheep/object_cache.c
> +++ b/sheep/object_cache.c
> @@ -172,11 +172,11 @@ int object_cache_lookup(struct object_cache *oc, uint32_t idx, int create)
>
> if (create) {
> unsigned data_length;
> - uint64_t oid = oc->oid;
> - if (is_vdi_obj(oid))
> + if (idx & CACHE_VDI_BIT)
> data_length = SD_INODE_SIZE;
> else
> data_length = SD_DATA_OBJ_SIZE;
> +
> ret = prealloc(fd, data_length);
> if (ret != SD_RES_SUCCESS)
> ret = -1;
> @@ -262,7 +262,7 @@ int object_cache_rw(struct object_cache *oc, uint32_t idx, struct request *req)
> struct sd_obj_rsp *rsp = (struct sd_obj_rsp *)&req->rp;
> int ret;
>
> - dprintf("%"PRIx64", len %"PRIu32", off %"PRIu64"\n", oc->oid, hdr->data_length, hdr->offset);
> + dprintf("%"PRIx32", len %"PRIu32", off %"PRIu64"\n", idx, hdr->data_length, hdr->offset);
> if (hdr->flags & SD_FLAG_CMD_WRITE) {
> ret = write_cache_object(oc->vid, idx, req->data, hdr->data_length, hdr->offset);
> if (ret != SD_RES_SUCCESS)
> @@ -314,16 +314,19 @@ int object_cache_pull(struct object_cache *oc, uint32_t idx)
> {
> int i, n = 0, fd, ret = SD_RES_NO_MEM;
> unsigned wlen = 0, rlen, data_length, read_len;
> - uint64_t oid = oc->oid;
> + uint64_t oid;
> struct sd_obj_req hdr = { 0 };
> struct sd_obj_rsp *rsp = (struct sd_obj_rsp *)&hdr;
> struct sd_vnode *vnodes = sys->vnodes;
> void *buf;
>
> - if (is_vdi_obj(oid))
> + if (idx & CACHE_VDI_BIT) {
> + oid = vid_to_vdi_oid(oc->vid);
> data_length = SD_INODE_SIZE;
> - else
> + } else {
> + oid = vid_to_data_oid(oc->vid, idx);
> data_length = SD_DATA_OBJ_SIZE;
> + }
>
> buf = valloc(data_length);
> if (buf == NULL) {
> @@ -488,7 +491,6 @@ int object_is_cached(uint64_t oid)
> if (!cache)
> return 0;
>
> - cache->oid = oid;
> if (object_cache_lookup(cache, idx, 0) < 0)
> return 0;
> else
> diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
> index b932e83..98ae0e3 100644
> --- a/sheep/sheep_priv.h
> +++ b/sheep/sheep_priv.h
> @@ -410,7 +410,6 @@ static inline int sys_can_halt(void)
>
> struct object_cache {
> uint32_t vid;
> - uint64_t oid;
> struct list_head dirty_list;
> struct hlist_node hash;
> struct rb_root dirty_rb;
> diff --git a/sheep/store.c b/sheep/store.c
> index 26b1ee3..a86b80d 100644
> --- a/sheep/store.c
> +++ b/sheep/store.c
> @@ -821,7 +821,6 @@ static int handle_gateway_request(struct request *req)
> idx |= 1 << CACHE_VDI_SHIFT;
>
> cache = find_object_cache(vid, 1);
> - cache->oid = oid;
>
> if (hdr->opcode == SD_OP_CREATE_AND_WRITE_OBJ)
> create = 1;
Applied.
Thanks,
Yuan
More information about the sheepdog
mailing list