summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Greenan <kmgreen2@gmail.com>2014-07-21 08:53:59 -0700
committerKevin Greenan <kmgreen2@gmail.com>2014-07-21 09:10:33 -0700
commitbf219bde4f8decf64de52f46cc9af3eae513edf6 (patch)
treefce65906811b30ed22395832b771c29e411e408e
parent19cd7d3b4960b8f28258e36fe2a42e8301b3c358 (diff)
downloadliberasurecode-bf219bde4f8decf64de52f46cc9af3eae513edf6.tar.gz
Added functionality needed to support the get_segment_info() API in PyECLib.
-rw-r--r--include/erasurecode/erasurecode.h15
-rw-r--r--include/erasurecode/erasurecode_backend.h2
-rw-r--r--src/backends/jerasure/jerasure_rs_vand.c18
-rw-r--r--src/backends/xor/flat_xor_hd.c14
-rw-r--r--src/erasurecode.c41
5 files changed, 89 insertions, 1 deletions
diff --git a/include/erasurecode/erasurecode.h b/include/erasurecode/erasurecode.h
index 38c50d3..c92c9e4 100644
--- a/include/erasurecode/erasurecode.h
+++ b/include/erasurecode/erasurecode.h
@@ -194,6 +194,21 @@ int liberasurecode_get_fragment_metadata(char *fragment);
*/
int liberasurecode_verify_stripe_metadata(char **fragments);
+/**
+ * This computes the aligned size of a buffer passed into
+ * the encode function. The encode function must pad fragments
+ * to be algined with the word size (w) and the last fragment also
+ * needs to be aligned. This computes the sum of the algined fragment
+ * sizes for a given buffer to encode.
+ */
+int liberasurecode_get_aligned_data_size(int desc, int data_len);
+
+/**
+ * This will return the minumum encode size, which is the minimum
+ * buffer size that can be encoded.
+ */
+int liberasurecode_get_minimum_encode_size(int desc);
+
/* ==~=*=~===~=*=~==~=*=~== liberasurecode Error codes =~=*=~==~=~=*=~==~== */
diff --git a/include/erasurecode/erasurecode_backend.h b/include/erasurecode/erasurecode_backend.h
index bf35e0d..c5ead2a 100644
--- a/include/erasurecode/erasurecode_backend.h
+++ b/include/erasurecode/erasurecode_backend.h
@@ -58,6 +58,7 @@ struct ec_backend_args {
#define DECODE decode
#define FRAGSNEEDED fragments_needed
#define RECONSTRUCT reconstruct
+#define ELEMENTSIZE element_size
#define FN_NAME(s) str(s)
#define str(s) #s
@@ -82,6 +83,7 @@ struct ec_backend_op_stubs {
int (*RECONSTRUCT)(void *desc,
char **data, char **parity, int *missing_idxs, int destination_idx,
int blocksize);
+ int (*ELEMENTSIZE)(void *desc);
};
/* ==~=*=~==~=*=~==~=*=~= backend struct definitions =~=*=~==~=*=~==~=*==~== */
diff --git a/src/backends/jerasure/jerasure_rs_vand.c b/src/backends/jerasure/jerasure_rs_vand.c
index 78a67c7..8680b62 100644
--- a/src/backends/jerasure/jerasure_rs_vand.c
+++ b/src/backends/jerasure/jerasure_rs_vand.c
@@ -245,6 +245,23 @@ error:
return NULL;
}
+/**
+ * Return the element-size, which is the number of bits stored
+ * on a given device, per codeword. For Vandermonde, this is
+ * 'w'. For somthing like cauchy, this is packetsize * w.
+ *
+ * Returns the size in bits!
+ */
+static int
+jerasure_rs_vand_element_size(void* desc)
+{
+ struct jerasure_rs_vand_descriptor *jerasure_desc =
+ (struct jerasure_rs_vand_descriptor*)desc;
+
+ /* Note that cauchy will return pyeclib_handle->w * PYECC_CAUCHY_PACKETSIZE * 8 */
+ return jerasure_desc->w;
+}
+
static int jerasure_rs_vand_exit(void *desc)
{
struct jerasure_rs_vand_descriptor *jerasure_desc =
@@ -262,6 +279,7 @@ struct ec_backend_op_stubs jerasure_rs_vand_op_stubs = {
.DECODE = jerasure_rs_vand_decode,
.FRAGSNEEDED = jerasure_rs_vand_min_fragments,
.RECONSTRUCT = jerasure_rs_vand_reconstruct,
+ .ELEMENTSIZE = jerasure_rs_vand_element_size,
};
struct ec_backend_common backend_jerasure_rs_vand = {
diff --git a/src/backends/xor/flat_xor_hd.c b/src/backends/xor/flat_xor_hd.c
index 4e1f29b..c30cdaa 100644
--- a/src/backends/xor/flat_xor_hd.c
+++ b/src/backends/xor/flat_xor_hd.c
@@ -49,6 +49,8 @@ struct flat_xor_hd_descriptor {
int *fragments_needed);
};
+#define DEFAULT_W 32
+
static int flat_xor_hd_encode(void *desc,
char **data, char **parity, int blocksize)
{
@@ -79,7 +81,16 @@ static int flat_xor_hd_min_fragments(void *desc,
xor_desc->fragments_needed(xor_desc, missing_idxs, fragments_needed);
}
-#define DEFAULT_W 32
+/**
+ * Return the element-size, which is the number of bits stored
+ * on a given device, per codeword. This is usually just 'w'.
+ */
+static int
+flar_xor_hd_element_size(void* desc)
+{
+ return DEFAULT_W;
+}
+
static void * flat_xor_hd_init(struct ec_backend_args *args, void *sohandle)
{
int k = args->uargs.k;
@@ -126,6 +137,7 @@ struct ec_backend_op_stubs flat_xor_hd_op_stubs = {
.DECODE = flat_xor_hd_decode,
.FRAGSNEEDED = flat_xor_hd_min_fragments,
.RECONSTRUCT = flat_xor_hd_reconstruct,
+ .ELEMENTSIZE = flar_xor_hd_element_size,
};
struct ec_backend_common backend_flat_xor_hd = {
diff --git a/src/erasurecode.c b/src/erasurecode.c
index 8eaf324..a559d5d 100644
--- a/src/erasurecode.c
+++ b/src/erasurecode.c
@@ -698,6 +698,47 @@ int liberasurecode_fragments_needed(int desc, int *missing_idxs,
out_error:
return ret;
}
+
+/**
+ * This computes the aligned size of a buffer passed into
+ * the encode function. The encode function must pad fragments
+ * to be algined with the word size (w) and the last fragment also
+ * needs to be aligned. This computes the sum of the algined fragment
+ * sizes for a given buffer to encode.
+ */
+int liberasurecode_get_aligned_data_size(int desc, int data_len)
+{
+ int word_size;
+ int alignment_multiple;
+ int ret = 0;
+ int k;
+ ec_backend_t instance = liberasurecode_backend_instance_get_by_desc(desc);
+
+ k = instance->args.uargs.k;
+
+ if (NULL == instance) {
+ ret = -EBACKENDNOTAVAIL;
+ goto out;
+ }
+
+ word_size = instance->common.ops->element_size(instance->desc.backend_desc) / 8;
+
+ alignment_multiple = k * word_size;
+
+ ret = (int)ceill((double)data_len / alignment_multiple) * alignment_multiple;
+
+out:
+ return ret;
+}
+
+/**
+ * This will return the minumum encode size, which is the minimum
+ * buffer size that can be encoded.
+ */
+int liberasurecode_get_minimum_encode_size(int desc)
+{
+ return liberasurecode_get_aligned_data_size(desc, 1);
+}
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=* misc *=~==~=*=~==~=*=~==~=*=~==~=*=~== */