diff options
author | Eric Lambert <eric.lambert@seagate.com> | 2014-10-03 17:08:05 -0700 |
---|---|---|
committer | Eric Lambert <eric.lambert@seagate.com> | 2014-10-03 17:08:05 -0700 |
commit | 62fba6ba49ab216dbb19c7b7dcbd83804fe7f66e (patch) | |
tree | 888213525b42e0efe4357a2ee2653fb73d6cfeaf | |
parent | 581afe3199dcf1171f750a96ef4d83512ea1ba66 (diff) | |
download | liberasurecode-62fba6ba49ab216dbb19c7b7dcbd83804fe7f66e.tar.gz |
add backend_id and backend_version to fragment metadata
-rw-r--r-- | include/erasurecode/erasurecode_helpers.h | 4 | ||||
-rw-r--r-- | include/erasurecode/erasurecode_postprocessing.h | 2 | ||||
-rw-r--r-- | include/erasurecode/erasurecode_stdinc.h | 1 | ||||
-rw-r--r-- | src/erasurecode.c | 6 | ||||
-rw-r--r-- | src/erasurecode_helpers.c | 36 | ||||
-rw-r--r-- | src/erasurecode_postprocessing.c | 9 | ||||
-rw-r--r-- | test/liberasurecode_test.c | 11 |
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); } } |