add backend_id and backend_version to fragment metadata

This commit is contained in:
Eric Lambert
2014-10-03 17:08:05 -07:00
parent 581afe3199
commit 62fba6ba49
7 changed files with 63 additions and 6 deletions

View File

@@ -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);
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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);
}
}