summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Lambert <eric.lambert@seagate.com>2014-10-03 17:08:05 -0700
committerEric Lambert <eric.lambert@seagate.com>2014-10-03 17:08:05 -0700
commit62fba6ba49ab216dbb19c7b7dcbd83804fe7f66e (patch)
tree888213525b42e0efe4357a2ee2653fb73d6cfeaf
parent581afe3199dcf1171f750a96ef4d83512ea1ba66 (diff)
downloadliberasurecode-62fba6ba49ab216dbb19c7b7dcbd83804fe7f66e.tar.gz
add backend_id and backend_version to fragment metadata
-rw-r--r--include/erasurecode/erasurecode_helpers.h4
-rw-r--r--include/erasurecode/erasurecode_postprocessing.h2
-rw-r--r--include/erasurecode/erasurecode_stdinc.h1
-rw-r--r--src/erasurecode.c6
-rw-r--r--src/erasurecode_helpers.c36
-rw-r--r--src/erasurecode_postprocessing.c9
-rw-r--r--test/liberasurecode_test.c11
7 files changed, 63 insertions, 6 deletions
diff --git a/include/erasurecode/erasurecode_helpers.h b/include/erasurecode/erasurecode_helpers.h
index 0e53e63..5bef344 100644
--- a/include/erasurecode/erasurecode_helpers.h
+++ b/include/erasurecode/erasurecode_helpers.h
@@ -140,6 +140,10 @@ int set_checksum(ec_checksum_type_t ct, char *buf, int blocksize);
int get_checksum(char *buf);
int set_libec_version(char *fragment);
int get_libec_version(char *fragment, uint32_t *ver);
+int set_backend_id(char *buf, ec_backend_id_t id);
+int get_backend_id(char *buf, ec_backend_id_t *id);
+int set_backend_version(char *buf, uint32_t version);
+int get_backend_version(char *buf, uint32_t *version);
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
diff --git a/include/erasurecode/erasurecode_postprocessing.h b/include/erasurecode/erasurecode_postprocessing.h
index e57ccca..a4ab881 100644
--- a/include/erasurecode/erasurecode_postprocessing.h
+++ b/include/erasurecode/erasurecode_postprocessing.h
@@ -35,6 +35,6 @@ int finalize_fragments_after_encode(ec_backend_t instance,
void add_fragment_metadata(char *fragment,
int idx, uint64_t orig_data_size, int blocksize,
- int add_chksum);
+ ec_checksum_type_t ct, int add_chksum, ec_backend_t instance);
#endif
diff --git a/include/erasurecode/erasurecode_stdinc.h b/include/erasurecode/erasurecode_stdinc.h
index ee60ccb..80d8224 100644
--- a/include/erasurecode/erasurecode_stdinc.h
+++ b/include/erasurecode/erasurecode_stdinc.h
@@ -41,6 +41,7 @@
# include <stdlib.h>
# include <stddef.h>
# include <stdarg.h>
+# include <stdbool.h>
# include <unistd.h>
#else
# if defined(HAVE_STDLIB_H)
diff --git a/src/erasurecode.c b/src/erasurecode.c
index b3d1395..e95f28b 100644
--- a/src/erasurecode.c
+++ b/src/erasurecode.c
@@ -635,7 +635,8 @@ int liberasurecode_decode(int desc,
char *fragment_ptr = data[missing_idx];
init_fragment_header(fragment_ptr);
add_fragment_metadata(fragment_ptr, missing_idx,
- orig_data_size, blocksize, !set_chksum);
+ orig_data_size, blocksize, instance->args.uargs.ct,
+ !set_chksum, instance);
}
j++;
}
@@ -798,7 +799,8 @@ int liberasurecode_reconstruct_fragment(int desc,
}
init_fragment_header(fragment_ptr);
add_fragment_metadata(fragment_ptr, destination_idx, orig_data_size,
- blocksize, !set_chksum);
+ blocksize, instance->args.uargs.ct,
+ !set_chksum, instance);
/*
* Copy the reconstructed fragment to the output buffer
diff --git a/src/erasurecode_helpers.c b/src/erasurecode_helpers.c
index 2f97b17..21952c0 100644
--- a/src/erasurecode_helpers.c
+++ b/src/erasurecode_helpers.c
@@ -359,6 +359,42 @@ int get_libec_version(char *buf, uint32_t *ver) {
return 0;
}
+int set_backend_id(char *buf, ec_backend_id_t id) {
+ if (!is_valid_fragment(buf)) {
+ return -1;
+ }
+ fragment_header_t *header = (fragment_header_t *) buf;
+ header->meta.backend_id = (uint8_t)id;
+ return 0;
+}
+
+int get_backend_id(char *buf, ec_backend_id_t *id) {
+ if (!is_valid_fragment(buf)) {
+ return -1;
+ }
+ fragment_header_t *header = (fragment_header_t *) buf;
+ *id = header->meta.backend_id;
+ return 0;
+}
+
+int set_backend_version(char *buf, uint32_t version) {
+ if (!is_valid_fragment(buf)) {
+ return -1;
+ }
+ fragment_header_t *header = (fragment_header_t *) buf;
+ header->meta.backend_version = version;
+ return 0;
+}
+
+int get_backend_version(char *buf, uint32_t *version) {
+ if (!is_valid_fragment(buf)) {
+ return -1;
+ }
+ fragment_header_t *header = (fragment_header_t *) buf;
+ *version = header->meta.backend_version;
+ return 0;
+}
+
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
inline int set_checksum(ec_checksum_type_t ct, char *buf, int blocksize)
diff --git a/src/erasurecode_postprocessing.c b/src/erasurecode_postprocessing.c
index 682638b..2029f3d 100644
--- a/src/erasurecode_postprocessing.c
+++ b/src/erasurecode_postprocessing.c
@@ -32,12 +32,15 @@
void add_fragment_metadata(char *fragment,
int idx, uint64_t orig_data_size, int blocksize,
- ec_checksum_type_t ct, int add_chksum)
+ ec_checksum_type_t ct, int add_chksum, ec_backend_t be)
{
+ //TODO EDL we are ignoring the return codes here, fix that
set_libec_version(fragment);
set_fragment_idx(fragment, idx);
set_orig_data_size(fragment, orig_data_size);
set_fragment_payload_size(fragment, blocksize);
+ set_backend_id(fragment, be->common.id);
+ set_backend_version(fragment, be->common.ec_backend_version);
if (add_chksum) {
set_checksum(ct, fragment, blocksize);
@@ -55,7 +58,7 @@ int finalize_fragments_after_encode(ec_backend_t instance,
for (i = 0; i < k; i++) {
char *fragment = get_fragment_ptr_from_data(encoded_data[i]);
add_fragment_metadata(fragment, i, orig_data_size,
- blocksize, ct, set_chksum);
+ blocksize, ct, set_chksum, instance);
encoded_data[i] = fragment;
}
@@ -63,7 +66,7 @@ int finalize_fragments_after_encode(ec_backend_t instance,
for (i = 0; i < m; i++) {
char *fragment = get_fragment_ptr_from_data(encoded_parity[i]);
add_fragment_metadata(fragment, i + k, orig_data_size,
- blocksize, ct, set_chksum);
+ blocksize, ct, set_chksum, instance);
encoded_parity[i] = fragment;
}
diff --git a/test/liberasurecode_test.c b/test/liberasurecode_test.c
index 9ab44d7..fb69762 100644
--- a/test/liberasurecode_test.c
+++ b/test/liberasurecode_test.c
@@ -721,6 +721,9 @@ static void test_get_fragment_metadata(const ec_backend_id_t be_id, struct ec_ar
uint64_t encoded_fragment_len = 0;
fragment_metadata_t cur_frag;
fragment_metadata_t cmp_frag;
+ ec_backend_id_t rtv_be_id = -1;
+ uint32_t be_version = 0;
+ ec_backend_t be = NULL;
desc = liberasurecode_instance_create(be_id, args);
if (-EBACKENDNOTAVAIL == desc) {
@@ -728,6 +731,8 @@ static void test_get_fragment_metadata(const ec_backend_id_t be_id, struct ec_ar
return;
}
assert(desc > 0);
+ be = liberasurecode_backend_instance_get_by_desc(desc);
+ assert(be != NULL);
orig_data = create_buffer(orig_data_size, 'x');
assert(orig_data != NULL);
@@ -762,6 +767,12 @@ static void test_get_fragment_metadata(const ec_backend_id_t be_id, struct ec_ar
rc = get_libec_version(header, &ver);
assert(rc == 0);
assert(ver == LIBERASURECODE_VERSION);
+ rc = get_backend_id(header, &rtv_be_id);
+ assert(rc == 0);
+ assert(rtv_be_id == be_id);
+ rc = get_backend_version(header, &be_version);
+ assert(rc == 0);
+ assert(be_version == be->common.ec_backend_version);
}
}