[Sheepdog] [PATCH] collie: fix object read from the local node

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Fri Apr 9 07:46:32 CEST 2010


Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 collie/store.c |   29 ++++++++++++++++++++++-------
 1 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/collie/store.c b/collie/store.c
index c62cb5b..7bb0f48 100644
--- a/collie/store.c
+++ b/collie/store.c
@@ -206,6 +206,8 @@ out:
 	return res;
 }
 
+static int ob_open(uint32_t epoch, uint64_t oid, int aflags, int *ret);
+
 static int read_from_one(uint64_t oid,
 			 unsigned *ori_rlen, void *buf, uint64_t offset)
 {
@@ -225,9 +227,18 @@ again:
 
 		addr_to_str(name, sizeof(name), e[n].addr, 0);
 
-		/* FIXME: do like store_queue_request_local() */
-		if (is_myself(&e[n]))
-			continue;
+		if (is_myself(&e[n])) {
+			fd = ob_open(sys->epoch, oid, 0, &ret);
+			if (fd < 0 || ret != 0)
+				continue;
+
+			ret = pread64(fd, buf, *ori_rlen, offset);
+			if (ret < 0)
+				continue;
+			*ori_rlen = ret;
+			ret = 0;
+			goto out;
+		}
 
 		fd = connect_to(name, e[n].port);
 		if (fd < 0)
@@ -254,7 +265,8 @@ again:
 		switch (rsp->result) {
 		case SD_RES_SUCCESS:
 			*ori_rlen = rlen;
-			return 0;
+			ret = 0;
+			goto out;
 		case SD_RES_OLD_NODE_VER:
 		case SD_RES_NEW_NODE_VER:
 			/* waits for the node list timer */
@@ -266,9 +278,11 @@ again:
 		}
 	}
 
+	ret = -1;
+out:
 	free(e);
 
-	return -1;
+	return ret;
 }
 
 static int read_from_other_sheeps(uint64_t oid, char *buf, int copies)
@@ -467,12 +481,13 @@ static int store_queue_request_local(struct request *req, char *buf, uint32_t ep
 		}
 
 		if (hdr->flags & SD_FLAG_CMD_COW) {
-			dprintf("%" PRIu64 "\n", hdr->cow_oid);
+			dprintf("%" PRIx64 "\n", hdr->cow_oid);
 
 			ret = read_from_other_sheeps(hdr->cow_oid, buf,
 						     hdr->copies);
 			if (ret) {
-				ret = 1;
+				eprintf("failed to read old object\n");
+				ret = SD_RES_EIO;
 				goto out;
 			}
 		} else {
-- 
1.5.6.5




More information about the sheepdog mailing list