From: levin li <[email protected]>
Signed-off-by: levin li <[email protected]> --- sheep/object_cache.c | 37 ++++++++++++++++++++++++++++++------- 1 files changed, 30 insertions(+), 7 deletions(-) diff --git a/sheep/object_cache.c b/sheep/object_cache.c index 3b6ecbe..ca95287 100644 --- a/sheep/object_cache.c +++ b/sheep/object_cache.c @@ -740,7 +740,8 @@ out: /* Fetch the object, cache it in success */ -static int object_cache_pull(struct object_cache *oc, uint32_t idx) +static int object_cache_pull(struct object_cache *oc, uint32_t idx, + void **buffer) { struct sd_req hdr; int ret = SD_RES_NO_MEM; @@ -776,7 +777,11 @@ static int object_cache_pull(struct object_cache *oc, uint32_t idx) else if (ret == SD_RES_OID_EXIST) ret = SD_RES_SUCCESS; } - free(buf); + + if (ret != SD_RES_SUCCESS) + free(buf); + else + *buffer = buf; out: return ret; } @@ -952,6 +957,12 @@ int bypass_object_cache(struct request *req) return 0; } +static void read_cache_buffer(void *buffer, void *data, size_t count, + off_t offset) +{ + memcpy(data, (char *)buffer + offset, count); +} + int object_cache_handle_request(struct request *req) { struct sd_req *hdr = &req->rq; @@ -961,6 +972,7 @@ int object_cache_handle_request(struct request *req) struct object_cache *cache; struct object_cache_entry *entry; int ret, create = 0; + void *data_buf = NULL; dprintf("%08"PRIx32", len %"PRIu32", off %"PRIu64"\n", idx, hdr->data_length, hdr->obj.offset); @@ -973,7 +985,7 @@ int object_cache_handle_request(struct request *req) retry: ret = object_cache_lookup(cache, idx, create); if (ret == SD_RES_NO_CACHE) { - ret = object_cache_pull(cache, idx); + ret = object_cache_pull(cache, idx, &data_buf); if (ret != SD_RES_SUCCESS) return ret; } else if (ret == SD_RES_EIO) @@ -983,6 +995,10 @@ retry: if (!entry) { dprintf("oid %"PRIx64" maybe reclaimed\n", idx_to_oid(vid, idx)); + if (data_buf) { + free(data_buf); + data_buf = NULL; + } goto retry; } @@ -994,16 +1010,23 @@ retry: update_cache_entry(cache, idx, hdr->data_length, hdr->obj.offset); } else { - ret = read_cache_object(cache->vid, idx, req->data, - hdr->data_length, hdr->obj.offset); - if (ret != SD_RES_SUCCESS) - goto err; + if (data_buf) { + read_cache_buffer(data_buf, req->data, hdr->data_length, + hdr->obj.offset); + } else { + ret = read_cache_object(cache->vid, idx, req->data, + hdr->data_length, + hdr->obj.offset); + if (ret != SD_RES_SUCCESS) + goto err; + } req->rp.data_length = hdr->data_length; cds_list_del_rcu(&entry->lru_list); cds_list_add_rcu(&entry->lru_list, &sys_cache.cache_lru_list); } err: + free(data_buf); put_cache_entry(entry); return ret; } -- 1.7.1 -- sheepdog mailing list [email protected] http://lists.wpkg.org/mailman/listinfo/sheepdog
