libec version is now stored in fragment header
This commit is contained in:
@@ -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) \
|
||||
|
||||
@@ -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);
|
||||
|
||||
/* ==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~==~=*=~== */
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user