[sheepdog] [PATCH 2/3] sheep: move oid scheduling code into a helper function

Liu Yuan namei.unix at gmail.com
Sun Jun 3 08:47:24 CEST 2012


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

- rename is_recoverying_oid() -> oid_in_recovery()

Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
 sheep/recovery.c   |   68 +++++++++++++++++++++++++++++-----------------------
 sheep/sdnet.c      |    4 ++--
 sheep/sheep_priv.h |    2 +-
 3 files changed, 41 insertions(+), 33 deletions(-)

diff --git a/sheep/recovery.c b/sheep/recovery.c
index 7c36af4..c3d1d4d 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -271,59 +271,67 @@ int is_recovery_init(void)
 	return rw->state == RW_INIT;
 }
 
-int is_recoverying_oid(uint64_t oid)
+static inline bool schedule_oid(uint64_t oid)
 {
-	uint64_t hval = fnv_64a_buf(&oid, sizeof(uint64_t), FNV1A_64_INIT);
-	uint64_t min_hval;
-	struct recovery_work *rw = recovering_work;
+	uint64_t hval, min_hval;
 	int i;
+	struct recovery_work *rw = recovering_work;
 
-	if (oid == 0)
-		return 0;
-
-	if (!rw)
-		return 0; /* there is no thread working for object recovery */
-
-	min_hval = fnv_64a_buf(&rw->oids[rw->done + rw->nr_blocking], sizeof(uint64_t), FNV1A_64_INIT);
-
-	if (before(rw->epoch, sys->epoch))
-		return 1;
-
-	if (sd_store->exist(oid)) {
-		dprintf("the object %" PRIx64 " is already recoverd\n", oid);
-		return 0;
-	}
-
-	if (rw->state == RW_INIT)
-		return 1;
-
-	/* the first 'rw->nr_blocking' objects were already scheduled to be done earlier */
+	/* Check if the oid is already scheduled in front */
 	for (i = 0; i < rw->nr_blocking; i++)
 		if (rw->oids[rw->done + i] == oid)
-			return 1;
+			return true;
+
+	min_hval = fnv_64a_buf(&rw->oids[rw->done + rw->nr_blocking],
+			       sizeof(uint64_t), FNV1A_64_INIT);
+	hval = fnv_64a_buf(&oid, sizeof(uint64_t), FNV1A_64_INIT);
 
 	if (min_hval <= hval) {
 		uint64_t *p;
 		p = bsearch(&oid, rw->oids + rw->done + rw->nr_blocking,
-			    rw->count - rw->done - rw->nr_blocking, sizeof(oid), obj_cmp);
+			    rw->count - rw->done - rw->nr_blocking, sizeof(oid),
+			    obj_cmp);
 		if (p) {
 			dprintf("recover the object %" PRIx64 " first\n", oid);
+			/* The first oid may be processed now */
 			if (rw->nr_blocking == 0)
-				rw->nr_blocking = 1; /* the first oid may be processed now */
+				rw->nr_blocking = 1;
+			/* This oid should be recovered first */
 			if (p > rw->oids + rw->done + rw->nr_blocking) {
-				/* this object should be recovered earlier */
 				memmove(rw->oids + rw->done + rw->nr_blocking + 1,
 					rw->oids + rw->done + rw->nr_blocking,
 					sizeof(uint64_t) * (p - (rw->oids + rw->done + rw->nr_blocking)));
 				rw->oids[rw->done + rw->nr_blocking] = oid;
 				rw->nr_blocking++;
 			}
-			return 1;
+			return true;
 		}
 	}
 
 	dprintf("the object %" PRIx64 " is not found\n", oid);
-	return 0;
+	return false;
+}
+
+bool oid_in_recovery(uint64_t oid)
+{
+	struct recovery_work *rw = recovering_work;
+
+	if (!node_in_recovery())
+		return false;
+
+	if (sd_store->exist(oid)) {
+		dprintf("the object %" PRIx64 " is already recoverd\n", oid);
+		return false;
+	}
+
+	if (before(rw->epoch, sys->epoch))
+		return true;
+
+	/* If we are in preparation of object list, oid is not recovered yet */
+	if (rw->state == RW_INIT)
+		return true;
+
+	return schedule_oid(oid);
 }
 
 static void free_recovery_work(struct recovery_work *rw)
diff --git a/sheep/sdnet.c b/sheep/sdnet.c
index 4eca5f7..6323ee3 100644
--- a/sheep/sdnet.c
+++ b/sheep/sdnet.c
@@ -216,10 +216,10 @@ static bool request_in_recovery(struct request *req)
 {
 	/*
 	 * Request from recovery should go down the Farm even if
-	 * is_recoverying_oid() returns true because we should also try snap
+	 * oid_in_recovery() returns true because we should also try snap
 	 * cache of the Farm and return the error code back if not found.
 	 */
-	if (is_recoverying_oid(req->local_oid) &&
+	if (oid_in_recovery(req->local_oid) &&
 	    !(req->rq.flags & SD_FLAG_CMD_RECOVERY)) {
 		/*
 		 * Put request on wait queues of local node
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 143b893..60432c7 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -286,7 +286,7 @@ int get_obj_list(const struct sd_list_req *, struct sd_list_rsp *, void *);
 int start_recovery(struct vnode_info *cur_vnodes,
 	struct vnode_info *old_vnodes);
 void resume_recovery_work(void);
-int is_recoverying_oid(uint64_t oid);
+bool oid_in_recovery(uint64_t oid);
 int is_recovery_init(void);
 int node_in_recovery(void);
 
-- 
1.7.10.2




More information about the sheepdog mailing list