[sheepdog] [PATCH 2/2] erasure: add ec_decode_buffer() helper
Liu Yuan
namei.unix at gmail.com
Fri Oct 18 18:26:38 CEST 2013
Since there are multiple places tries to decode the whole object, it is nice to
have a helper function to do it.
Signed-off-by: Liu Yuan <namei.unix at gmail.com>
---
dog/vdi.c | 31 +++++++++++--------------------
include/fec.h | 2 ++
lib/fec.c | 16 ++++++++++++++++
sheep/recovery.c | 13 +++----------
4 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/dog/vdi.c b/dog/vdi.c
index 4362f13..e6d2bdb 100644
--- a/dog/vdi.c
+++ b/dog/vdi.c
@@ -1581,16 +1581,11 @@ static void check_erasure_object(struct vdi_check_info *info)
idx[i] = i;
for (k = 0; k < p; k++) {
- for (i = 0; i < SD_EC_NR_STRIPE_PER_OBJECT; i++) {
- const uint8_t *ds[d];
- uint8_t out[strip_size];
-
- for (j = 0; j < d; j++)
- ds[j] = info->vcw[j].buf + strip_size
- * i;
- ec_decode(ctx, ds, idx, out, d + k);
- memcpy(obj + strip_size * i, out, strip_size);
- }
+ uint8_t *ds[d];
+ for (j = 0; j < d; j++)
+ ds[j] = info->vcw[j].buf;
+ ec_decode_buffer(ctx, ds, idx, obj, d + k, strip_size,
+ SD_EC_NR_STRIPE_PER_OBJECT);
if (memcmp(obj, info->vcw[d + k].buf, len) != 0) {
/* TODO repair the inconsistency */
sd_err("object %"PRIx64" is inconsistent", oid);
@@ -1603,17 +1598,13 @@ static void check_erasure_object(struct vdi_check_info *info)
goto out;
} else {
for (k = 0; k < j; k++) {
- int m = miss_idx[k], n;
-
- for (i = 0; i < SD_EC_NR_STRIPE_PER_OBJECT; i++) {
- const uint8_t *ds[d];
- uint8_t out[strip_size];
+ int m = miss_idx[k];
+ uint8_t *ds[d];
- for (n = 0; n < d; n++)
- ds[n] = input[n] + strip_size * i;
- ec_decode(ctx, ds, input_idx, out, m);
- memcpy(obj + strip_size * i, out, strip_size);
- }
+ for (i = 0; i < d; i++)
+ ds[i] = input[i];
+ ec_decode_buffer(ctx, ds, input_idx, obj, m, strip_size,
+ SD_EC_NR_STRIPE_PER_OBJECT);
write_object_to(info->vcw[m].vnode, oid, obj, true,
info->vcw[m].ec_index);
fprintf(stdout, "fixed missing %"PRIx64", "
diff --git a/include/fec.h b/include/fec.h
index 78b3fc8..a71b315 100644
--- a/include/fec.h
+++ b/include/fec.h
@@ -196,4 +196,6 @@ static inline void ec_destroy(struct fec *ctx)
fec_free(ctx);
}
+void ec_decode_buffer(struct fec *ctx, uint8_t *input[], const int in_idx[],
+ char *buf, int idx, size_t strip_size, int nr_stripe);
#endif
diff --git a/lib/fec.c b/lib/fec.c
index 8877b68..75d6205 100644
--- a/lib/fec.c
+++ b/lib/fec.c
@@ -680,3 +680,19 @@ void ec_decode(struct fec *ctx, const uint8_t *input[], const int inidx[],
out:
memcpy(output, dp[idx], strip_size);
}
+
+void ec_decode_buffer(struct fec *ctx, uint8_t *input[], const int in_idx[],
+ char *buf, int idx, size_t strip_size, int nr_stripe)
+{
+ int i, j, d = ctx->d;
+
+ for (i = 0; i < nr_stripe; i++) {
+ const uint8_t *in[d];
+ uint8_t out[strip_size];
+
+ for (j = 0; j < d; j++)
+ in[j] = input[j] + strip_size * i;
+ ec_decode(ctx, in, in_idx, out, idx);
+ memcpy(buf + strip_size * i, out, strip_size);
+ }
+}
diff --git a/sheep/recovery.c b/sheep/recovery.c
index 790bca8..37dde3c 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -423,16 +423,9 @@ static void *rebuild_erasure_object(uint64_t oid, uint8_t idx,
}
/* Rebuild the lost replica */
- for (i = 0; i < SD_EC_NR_STRIPE_PER_OBJECT; i++) {
- const uint8_t *in[ed];
- int strip_size = SD_EC_DATA_STRIPE_SIZE / ed;
- uint8_t out[strip_size];
-
- for (j = 0; j < ed; j++)
- in[j] = bufs[j] + strip_size * i;
- ec_decode(ctx, in, idxs, out, idx);
- memcpy(lost + strip_size * i, out, strip_size);
- }
+ ec_decode_buffer(ctx, bufs, idxs, lost, idx,
+ SD_EC_DATA_STRIPE_SIZE / ed,
+ SD_EC_NR_STRIPE_PER_OBJECT);
out:
ec_destroy(ctx);
for (i = 0; i < ed; i++)
--
1.7.9.5
More information about the sheepdog
mailing list