[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