[Sheepdog] [PATCH 2/3] sheep: refactor is_access_local()

Liu Yuan namei.unix at gmail.com
Mon Apr 30 10:53:46 CEST 2012


From: Liu Yuan <tailai.ly at taobao.com>

- let is_access_local to calculate copies itself
- fix a nasty bug in void io_op_done(), we should not pass 0
  or leave_cluster() will never be called.

Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
 sheep/sdnet.c |   15 +++++----------
 1 files changed, 5 insertions(+), 10 deletions(-)

diff --git a/sheep/sdnet.c b/sheep/sdnet.c
index d3ce3f5..bdfe003 100644
--- a/sheep/sdnet.c
+++ b/sheep/sdnet.c
@@ -36,20 +36,15 @@ void resume_pending_requests(void)
 		process_request_event_queues();
 }
 
-static int is_access_local(struct request *req, uint64_t oid, int copies)
+static int is_access_local(struct request *req, uint64_t oid)
 {
 	struct sd_vnode *v;
 	int nr_copies;
 	int i;
 
-	if (oid == 0)
-		return 0;
-
 	nr_copies = get_nr_copies(req->vnodes);
-	if (copies < nr_copies)
-		nr_copies = copies;
 
-	for (i = 0; i < copies; i++) {
+	for (i = 0; i < nr_copies; i++) {
 		v = oid_to_vnode(req->vnodes, oid, i);
 		if (vnode_is_local(v))
 			return 1;
@@ -67,11 +62,11 @@ static void setup_access_to_local_objects(struct request *req)
 		return;
 	}
 
-	if (is_access_local(req, hdr->oid, hdr->copies))
+	if (is_access_local(req, hdr->oid))
 		req->local_oid = hdr->oid;
 
 	if (hdr->cow_oid)
-		if (is_access_local(req, hdr->cow_oid, hdr->copies))
+		if (is_access_local(req, hdr->cow_oid))
 			req->local_cow_oid = hdr->cow_oid;
 }
 
@@ -129,7 +124,7 @@ static void io_op_done(struct work *work)
 			goto retry;
 		break;
 	case SD_RES_EIO:
-		if (is_access_local(req, hdr->oid, 0)) {
+		if (is_access_local(req, hdr->oid)) {
 			eprintf("leaving sheepdog cluster\n");
 			leave_cluster();
 
-- 
1.7.8.2




More information about the sheepdog mailing list