libec version is now stored in fragment header

This commit is contained in:
Eric Lambert
2014-10-02 22:31:34 -04:00
parent dbacee6f98
commit 581afe3199
5 changed files with 42 additions and 11 deletions

View File

@@ -248,6 +248,8 @@ fragment_metadata
uint8_t chksum_type; /* 1 */
uint32_t chksum[LIBERASURECODE_MAX_CHECKSUM_LEN]; /* 32 */
uint8_t chksum_mismatch; /* 1 */
uint8_t backend_id; /* 1 */
uint32_t backend_version; /* 4 */
} fragment_metadata_t;
#define FRAGSIZE_2_BLOCKSIZE(fragment_size) \

View File

@@ -45,11 +45,12 @@
typedef struct __attribute__((__packed__)) fragment_header_s
{
fragment_metadata_t meta; /* 50 bytes */
fragment_metadata_t meta; /* 55 bytes */
uint32_t magic; /* 4 bytes */
uint32_t libec_version; /* 4 bytes */
// We must be aligned to 16-byte boundaries
// So, size this array accordingly
uint8_t aligned_padding[10];
uint8_t aligned_padding[1];
} fragment_header_t;
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
@@ -137,6 +138,8 @@ int get_orig_data_size(char *buf);
int validate_fragment(char *buf);
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);
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */

View File

@@ -31,10 +31,23 @@
#include "erasurecode_backend.h"
#include "erasurecode_helpers.h"
#include "erasurecode_stdinc.h"
#include "erasurecode_version.h"
#include "erasurecode/alg_sig.h"
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
static bool is_valid_fragment(char *buf)
{
fragment_header_t *header = (fragment_header_t *) buf;
assert(NULL != header);
if (header->magic == LIBERASURECODE_FRAG_HEADER_MAGIC) {
return true;
}
return false;
}
/**
* Memory Management Methods
*
@@ -328,17 +341,21 @@ int get_orig_data_size(char *buf)
return header->meta.orig_data_size;
}
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
int validate_fragment(char *buf)
{
fragment_header_t *header = (fragment_header_t *) buf;
assert(NULL != header);
if (header->magic != LIBERASURECODE_FRAG_HEADER_MAGIC) {
return -1;
int set_libec_version(char *buf) {
if (!is_valid_fragment(buf)) {
return -1;
}
fragment_header_t *header = (fragment_header_t *) buf;
header->libec_version = (uint32_t)LIBERASURECODE_VERSION;
return 0;
}
int get_libec_version(char *buf, uint32_t *ver) {
if (!is_valid_fragment(buf)) {
return -1;
}
fragment_header_t *header = (fragment_header_t *) buf;
*ver = header->libec_version;
return 0;
}

View File

@@ -34,9 +34,11 @@ void add_fragment_metadata(char *fragment,
int idx, uint64_t orig_data_size, int blocksize,
ec_checksum_type_t ct, int add_chksum)
{
set_libec_version(fragment);
set_fragment_idx(fragment, idx);
set_orig_data_size(fragment, orig_data_size);
set_fragment_payload_size(fragment, blocksize);
if (add_chksum) {
set_checksum(ct, fragment, blocksize);
}

View File

@@ -740,13 +740,17 @@ static void test_get_fragment_metadata(const ec_backend_id_t be_id, struct ec_ar
for (i = 0; i < num_fragments; i++) {
char * data = NULL;
uint32_t ver = 0;
char *header = NULL;
memset(&cur_frag, -1, sizeof(fragment_metadata_t));
if (i < args->k) {
rc = liberasurecode_get_fragment_metadata(encoded_data[i], &cur_frag);
data = get_data_ptr_from_fragment(encoded_data[i]);
header = encoded_data[i];
} else {
rc = liberasurecode_get_fragment_metadata(encoded_parity[i - args->k], &cur_frag);
data = get_data_ptr_from_fragment(encoded_parity[i - args->k]);
header = encoded_parity[i - args->k];
}
assert(rc == 0);
assert(cur_frag.orig_data_size == orig_data_size);
@@ -755,6 +759,9 @@ static void test_get_fragment_metadata(const ec_backend_id_t be_id, struct ec_ar
validate_fragment_checksum(args, &cur_frag, data);
rc = memcmp(&cur_frag, &cmp_frag, sizeof(fragment_metadata_t));
assert(rc != 0);
rc = get_libec_version(header, &ver);
assert(rc == 0);
assert(ver == LIBERASURECODE_VERSION);
}
}