[sheepdog] [PATCH 2/3] sheep: allow operating when nr_zones >= nr_data_strip

Liu Yuan namei.unix at gmail.com
Wed Oct 23 09:59:12 CEST 2013


For erasure coding with x:y scheme, we can still promise the data reliability
with x nodes alive and provide services. There is no reason we don't do it in
sheepdog.

Signed-off-by: Liu Yuan <namei.unix at gmail.com>
---
 sheep/plain_store.c |   13 -------------
 sheep/recovery.c    |   19 ++++++-------------
 2 files changed, 6 insertions(+), 26 deletions(-)

diff --git a/sheep/plain_store.c b/sheep/plain_store.c
index fde7c9f..02db25e 100644
--- a/sheep/plain_store.c
+++ b/sheep/plain_store.c
@@ -463,19 +463,6 @@ static bool oid_stale(uint64_t oid)
 	const struct sd_vnode *obj_vnodes[SD_MAX_COPIES];
 	vinfo = get_vnode_info();
 
-	/*
-	 * If vinfo->nr_zones < SD_EC_DP, we might not get the idx, so we don't
-	 * know it is stale or not. In this case, we keep it stay in the working
-	 * directory in order to recover it when we get enough zones
-	 */
-	if (is_erasure_oid(oid)) {
-		uint8_t policy = get_vdi_copy_policy(oid_to_vid(oid));
-		int edp = ec_policy_to_dp(policy, NULL, NULL);
-
-		if (unlikely(vinfo->nr_zones < edp))
-			return false;
-	}
-
 	nr_copies = get_obj_copy_number(oid, vinfo->nr_zones);
 	oid_to_vnodes(oid, &vinfo->vroot, nr_copies, obj_vnodes);
 	for (i = 0; i < nr_copies; i++) {
diff --git a/sheep/recovery.c b/sheep/recovery.c
index 39ca2b1..3c59756 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -431,17 +431,15 @@ out:
 	return lost;
 }
 
-static uint8_t local_node_copy_index(struct rb_root *vroot, uint64_t oid)
+static uint8_t local_node_copy_index(struct vnode_info *vinfo, uint64_t oid)
 {
-	const struct sd_node *target_nodes[SD_MAX_NODES];
-	uint8_t policy = get_vdi_copy_policy(oid_to_vid(oid));
 	uint8_t idx;
-	int edp = ec_policy_to_dp(policy, NULL, NULL);
 
-	oid_to_nodes(oid, vroot, edp, target_nodes);
-	for (idx = 0; idx < edp; idx++)
-		if (node_is_local(target_nodes[idx]))
+	for (idx = 0; idx < vinfo->nr_zones; idx++) {
+		const struct sd_node *n = oid_to_node(oid, &vinfo->vroot, idx);
+		if (node_is_local(n))
 			return idx;
+	}
 	panic("can't get valid index for %"PRIx64, oid);
 }
 
@@ -470,13 +468,8 @@ static int recover_erasure_object(struct recovery_obj_work *row)
 	void *buf = NULL;
 	uint8_t idx;
 	int ret = -1;
-	uint8_t policy = get_vdi_copy_policy(oid_to_vid(oid));
-	int edp = ec_policy_to_dp(policy, NULL, NULL);
-
-	if (cur->nr_zones < edp)
-		return -1;
 
-	idx = local_node_copy_index(&cur->vroot, oid);
+	idx = local_node_copy_index(cur, oid);
 	buf = read_erasure_object(oid, idx, rw);
 	if (!buf)
 		buf = rebuild_erasure_object(oid, idx, rw);
-- 
1.7.9.5




More information about the sheepdog mailing list