[sheepdog] [PATCH v2 1/2] sheep: read cached data if it exists in read_object()
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Wed May 16 03:54:15 CEST 2012
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
sheep/store.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 45 insertions(+), 0 deletions(-)
diff --git a/sheep/store.c b/sheep/store.c
index 0fd3a48..718fa97 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -1040,6 +1040,42 @@ static int read_object_local(uint64_t oid, char *data, unsigned int datalen,
free(req);
return ret;
}
+
+static int read_object_cache(uint64_t oid, char *data, unsigned int datalen,
+ uint64_t offset, int copies, uint32_t epoch)
+{
+ int ret;
+ struct request *req;
+ struct sd_obj_req *hdr;
+ uint32_t vid = oid_to_vid(oid);
+ uint32_t idx = data_oid_to_idx(oid);
+ struct object_cache *cache;
+
+ if (is_vdi_obj(oid))
+ idx |= 1 << CACHE_VDI_SHIFT;
+
+ cache = find_object_cache(vid, 0);
+
+ req = zalloc(sizeof(*req));
+ if (!req)
+ return SD_RES_NO_MEM;
+ hdr = (struct sd_obj_req *)&req->rq;
+
+ hdr->oid = oid;
+ hdr->opcode = SD_OP_READ_OBJ;
+ hdr->copies = copies;
+ hdr->offset = offset;
+ hdr->data_length = datalen;
+ req->data = data;
+ req->op = get_sd_op(hdr->opcode);
+
+ ret = object_cache_rw(cache, idx, req);
+
+ free(req);
+
+ return ret;
+}
+
int read_object(struct vnode_info *vnodes, uint32_t node_version,
uint64_t oid, char *data, unsigned int datalen,
uint64_t offset, int nr_copies)
@@ -1051,6 +1087,15 @@ int read_object(struct vnode_info *vnodes, uint32_t node_version,
char name[128];
int i = 0, fd, ret, last_error = SD_RES_SUCCESS;
+ if (object_is_cached(oid)) {
+ ret = read_object_cache(oid, data, datalen, offset,
+ nr_copies, node_version);
+ if (ret != SD_RES_SUCCESS)
+ eprintf("fail %"PRIx64" %"PRIx32"\n", oid, ret);
+
+ return ret;
+ }
+
/* search a local object first */
oid_to_vnodes(vnodes, oid, nr_copies, obj_vnodes);
for (i = 0; i < nr_copies; i++) {
--
1.7.2.5
More information about the sheepdog
mailing list