summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Lambert <eric.lambert@seagate.com>2014-10-02 11:25:28 -0400
committerEric Lambert <eric.lambert@seagate.com>2014-10-02 11:25:28 -0400
commitdbacee6f986ddf475bbca1a02d33875bfae7f2c7 (patch)
tree7c2696c35be1fa4c667720e77f0bdbd3fc52d1e1
parent22b17d139a4fe6deb18c1852625b8d0ad5bebe61 (diff)
downloadliberasurecode-dbacee6f986ddf475bbca1a02d33875bfae7f2c7.tar.gz
backends now support verion checks
-rw-r--r--include/erasurecode/erasurecode_backend.h8
-rw-r--r--src/backends/isa-l/isa_l_vand.c34
-rw-r--r--src/backends/jerasure/jerasure_rs_cauchy.c36
-rw-r--r--src/backends/jerasure/jerasure_rs_vand.c34
-rw-r--r--src/backends/null/null.c27
-rw-r--r--src/backends/xor/flat_xor_hd.c37
6 files changed, 138 insertions, 38 deletions
diff --git a/include/erasurecode/erasurecode_backend.h b/include/erasurecode/erasurecode_backend.h
index 956b2f1..66e858b 100644
--- a/include/erasurecode/erasurecode_backend.h
+++ b/include/erasurecode/erasurecode_backend.h
@@ -63,6 +63,7 @@ struct ec_backend_args {
#define FRAGSNEEDED fragments_needed
#define RECONSTRUCT reconstruct
#define ELEMENTSIZE element_size
+#define ISCOMPATIBLEWITH is_compatible_with
#define FN_NAME(s) str(s)
#define str(s) #s
@@ -88,6 +89,8 @@ struct ec_backend_op_stubs {
char **data, char **parity, int *missing_idxs, int destination_idx,
int blocksize);
int (*ELEMENTSIZE)(void *desc);
+
+ bool (*ISCOMPATIBLEWITH) (uint32_t version);
};
/* ==~=*=~==~=*=~==~=*=~= backend struct definitions =~=*=~==~=*=~==~=*==~== */
@@ -110,6 +113,11 @@ struct ec_backend_common {
* metadata_adder bytes are added to
* the fragment size when allocating
* data/parity fragment buffers */
+ uint32_t ec_backend_version; /* The revision number of this back
+ * end. Is used to determine whether
+ * a specific instance of this backend
+ * accepts fragments generated by
+ * another version */
};
/* EC backend definition */
diff --git a/src/backends/isa-l/isa_l_vand.c b/src/backends/isa-l/isa_l_vand.c
index e7a575e..27a1a99 100644
--- a/src/backends/isa-l/isa_l_vand.c
+++ b/src/backends/isa-l/isa_l_vand.c
@@ -33,9 +33,21 @@
#include "erasurecode_backend.h"
#include "erasurecode_helpers.h"
+#define ISA_L_RS_VAND_LIB_MAJOR 2
+#define ISA_L_RS_VAND_LIB_MINOR 0
+#define ISA_L_RS_VAND_LIB_REV 0
+#define ISA_L_RS_VAND_LIB_VER_STR "2.0"
+#define ISA_L_RS_VAND_LIB_NAME "isa_l_rs_vand"
+#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
+#define ISA_L_RS_VAND_SO_NAME "isa-l.dylib"
+#else
+#define ISA_L_RS_VAND_SO_NAME "isa-l.so"
+#endif
+
/* Forward declarations */
struct ec_backend_op_stubs isa_l_rs_vand_ops;
struct ec_backend isa_l_rs_vand;
+struct ec_backend_common backend_isa_l_rs_vand;
typedef void (*ec_encode_data_func)(int, int, int, unsigned char*, unsigned char **, unsigned char **);
typedef void (*ec_init_tables_func)(int, int, unsigned char*, unsigned char *);
@@ -568,6 +580,14 @@ static int isa_l_rs_vand_exit(void *desc)
return 0;
}
+/*
+ * For the time being, we only claim compatibility with versions that
+ * match exactly
+ */
+static bool isa_l_rs_vand_is_compatible_with(uint32_t version) {
+ return version == backend_isa_l_rs_vand.ec_backend_version;
+}
+
struct ec_backend_op_stubs isa_l_rs_vand_op_stubs = {
.INIT = isa_l_rs_vand_init,
.EXIT = isa_l_rs_vand_exit,
@@ -576,17 +596,17 @@ struct ec_backend_op_stubs isa_l_rs_vand_op_stubs = {
.FRAGSNEEDED = isa_l_rs_vand_min_fragments,
.RECONSTRUCT = isa_l_rs_vand_reconstruct,
.ELEMENTSIZE = isa_l_rs_vand_element_size,
+ .ISCOMPATIBLEWITH = isa_l_rs_vand_is_compatible_with,
};
struct ec_backend_common backend_isa_l_rs_vand = {
.id = EC_BACKEND_ISA_L_RS_VAND,
- .name = "isa_l_rs_vand",
-#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
- .soname = "isa-l.dylib",
-#else
- .soname = "isa-l.so",
-#endif
- .soversion = "2.0",
+ .name = ISA_L_RS_VAND_LIB_NAME,
+ .soname = ISA_L_RS_VAND_SO_NAME,
+ .soversion = ISA_L_RS_VAND_LIB_VER_STR,
.ops = &isa_l_rs_vand_op_stubs,
.metadata_adder = 0,
+ .ec_backend_version = _VERSION(ISA_L_RS_VAND_LIB_MAJOR,
+ ISA_L_RS_VAND_LIB_MINOR,
+ ISA_L_RS_VAND_LIB_REV),
};
diff --git a/src/backends/jerasure/jerasure_rs_cauchy.c b/src/backends/jerasure/jerasure_rs_cauchy.c
index 9d8466a..09e7d5c 100644
--- a/src/backends/jerasure/jerasure_rs_cauchy.c
+++ b/src/backends/jerasure/jerasure_rs_cauchy.c
@@ -33,9 +33,21 @@
#include "erasurecode_backend.h"
#include "erasurecode_helpers.h"
+#define JERASURE_RS_CAUCHY_LIB_MAJOR 2
+#define JERASURE_RS_CAUCHY_LIB_MINOR 0
+#define JERASURE_RS_CAUCHY_LIB_REV 0
+#define JERASURE_RS_CAUCHY_LIB_VER_STR "2.0"
+#define JERASURE_RS_CAUCHY_LIB_NAME "jerasure_rs_cauchy"
+#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
+#define JERASURE_RS_CAUCHY_SO_NAME "libJerasure.dylib"
+#else
+#define JERASURE_RS_CAUCHY_SO_NAME "libJerasure.so"
+#endif
+
/* Forward declarations */
struct ec_backend_op_stubs jerasure_rs_cauchy_ops;
struct ec_backend jerasure_rs_cauchy;
+struct ec_backend_common backend_jerasure_rs_cauchy;
typedef int* (*cauchy_original_coding_matrix_func)(int, int, int);
typedef int* (*jerasure_matrix_to_bitmatrix_func)(int, int, int, int *);
@@ -364,6 +376,15 @@ static int jerasure_rs_cauchy_exit(void *desc)
return 0;
}
+/*
+ * For the time being, we only claim compatibility with versions that
+ * match exactly
+ */
+static bool jerasure_rs_cauchy_is_compatible_with(uint32_t version) {
+ return version == backend_jerasure_rs_cauchy.ec_backend_version;
+}
+
+
struct ec_backend_op_stubs jerasure_rs_cauchy_op_stubs = {
.INIT = jerasure_rs_cauchy_init,
.EXIT = jerasure_rs_cauchy_exit,
@@ -372,17 +393,18 @@ struct ec_backend_op_stubs jerasure_rs_cauchy_op_stubs = {
.FRAGSNEEDED = jerasure_rs_cauchy_min_fragments,
.RECONSTRUCT = jerasure_rs_cauchy_reconstruct,
.ELEMENTSIZE = jerasure_rs_cauchy_element_size,
+ .ISCOMPATIBLEWITH = jerasure_rs_cauchy_is_compatible_with,
+
};
struct ec_backend_common backend_jerasure_rs_cauchy = {
.id = EC_BACKEND_JERASURE_RS_CAUCHY,
- .name = "jerasure_rs_cauchy",
-#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
- .soname = "libJerasure.dylib",
-#else
- .soname = "libJerasure.so",
-#endif
- .soversion = "2.0",
+ .name = JERASURE_RS_CAUCHY_LIB_NAME,
+ .soname = JERASURE_RS_CAUCHY_SO_NAME,
+ .soversion = JERASURE_RS_CAUCHY_LIB_VER_STR,
.ops = &jerasure_rs_cauchy_op_stubs,
.metadata_adder = 0,
+ .ec_backend_version = _VERSION(JERASURE_RS_CAUCHY_LIB_MAJOR,
+ JERASURE_RS_CAUCHY_LIB_MINOR,
+ JERASURE_RS_CAUCHY_LIB_REV),
};
diff --git a/src/backends/jerasure/jerasure_rs_vand.c b/src/backends/jerasure/jerasure_rs_vand.c
index a8a8257..ed0956e 100644
--- a/src/backends/jerasure/jerasure_rs_vand.c
+++ b/src/backends/jerasure/jerasure_rs_vand.c
@@ -33,9 +33,21 @@
#include "erasurecode_backend.h"
#include "erasurecode_helpers.h"
+#define JERASURE_RS_VAND_LIB_MAJOR 2
+#define JERASURE_RS_VAND_LIB_MINOR 0
+#define JERASURE_RS_VAND_LIB_REV 0
+#define JERASURE_RS_VAND_LIB_VER_STR "2.0"
+#define JERASURE_RS_VAND_LIB_NAME "jerasure_rs_vand"
+#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
+#define JERASURE_RS_VAND_SO_NAME "libJerasure.dylib"
+#else
+#define JERASURE_RS_VAND_SO_NAME "libJerasure.so"
+#endif
+
/* Forward declarations */
struct ec_backend_op_stubs jerasure_rs_vand_ops;
struct ec_backend jerasure_rs_vand;
+struct ec_backend_common backend_jerasure_rs_vand;
typedef int* (*reed_sol_vandermonde_coding_matrix_func)(int, int, int);
typedef void (*jerasure_matrix_encode_func)(int, int, int, int*, char **, char **, int);
@@ -305,6 +317,14 @@ static int jerasure_rs_vand_exit(void *desc)
return 0;
}
+/*
+ * For the time being, we only claim compatibility with versions that
+ * match exactly
+ */
+static bool jerasure_rs_vand_is_compatible_with(uint32_t version) {
+ return version == backend_jerasure_rs_vand.ec_backend_version;
+}
+
struct ec_backend_op_stubs jerasure_rs_vand_op_stubs = {
.INIT = jerasure_rs_vand_init,
.EXIT = jerasure_rs_vand_exit,
@@ -313,17 +333,17 @@ struct ec_backend_op_stubs jerasure_rs_vand_op_stubs = {
.FRAGSNEEDED = jerasure_rs_vand_min_fragments,
.RECONSTRUCT = jerasure_rs_vand_reconstruct,
.ELEMENTSIZE = jerasure_rs_vand_element_size,
+ .ISCOMPATIBLEWITH = jerasure_rs_vand_is_compatible_with,
};
struct ec_backend_common backend_jerasure_rs_vand = {
.id = EC_BACKEND_JERASURE_RS_VAND,
- .name = "jerasure_rs_vand",
-#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
- .soname = "libJerasure.dylib",
-#else
- .soname = "libJerasure.so",
-#endif
- .soversion = "2.0",
+ .name = JERASURE_RS_VAND_LIB_NAME,
+ .soname = JERASURE_RS_VAND_SO_NAME,
+ .soversion = JERASURE_RS_VAND_LIB_VER_STR,
.ops = &jerasure_rs_vand_op_stubs,
.metadata_adder = 0,
+ .ec_backend_version = _VERSION(JERASURE_RS_VAND_LIB_MAJOR,
+ JERASURE_RS_VAND_LIB_MINOR,
+ JERASURE_RS_VAND_LIB_REV),
};
diff --git a/src/backends/null/null.c b/src/backends/null/null.c
index 6ca5c98..294a990 100644
--- a/src/backends/null/null.c
+++ b/src/backends/null/null.c
@@ -31,7 +31,16 @@
#include "erasurecode.h"
#include "erasurecode_backend.h"
-
+#define NULL_LIB_MAJOR 1
+#define NULL_LIB_MINOR 0
+#define NULL_LIB_REV 0
+#define NULL_LIB_VER_STR "1.0"
+#define NULL_LIB_NAME "null"
+#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
+#define NULL_SO_NAME "libnullcode.dylib"
+#else
+#define NULL_SO_NAME "libnullcode.so"
+#endif
/* Forward declarations */
struct ec_backend null;
struct ec_backend_op_stubs null_ops;
@@ -203,6 +212,9 @@ static int null_exit(void *desc)
return 0;
}
+static bool null_is_compatible_with(uint32_t version) {
+ return true;
+}
struct ec_backend_op_stubs null_op_stubs = {
.INIT = null_init,
.EXIT = null_exit,
@@ -211,18 +223,17 @@ struct ec_backend_op_stubs null_op_stubs = {
.FRAGSNEEDED = null_min_fragments,
.RECONSTRUCT = null_reconstruct,
.ELEMENTSIZE = null_element_size,
+ .ISCOMPATIBLEWITH = null_is_compatible_with,
};
struct ec_backend_common backend_null = {
.id = EC_BACKEND_NULL,
- .name = "null",
-#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
- .soname = "libnullcode.dylib",
-#else
- .soname = "libnullcode.so",
-#endif
- .soversion = "1.0",
+ .name = NULL_LIB_NAME,
+ .soname = NULL_SO_NAME,
+ .soversion = NULL_LIB_VER_STR,
.ops = &null_op_stubs,
.metadata_adder = 0,
+ .ec_backend_version = _VERSION(NULL_LIB_MAJOR, NULL_LIB_MINOR,
+ NULL_LIB_REV),
};
diff --git a/src/backends/xor/flat_xor_hd.c b/src/backends/xor/flat_xor_hd.c
index 0979b30..67a54ae 100644
--- a/src/backends/xor/flat_xor_hd.c
+++ b/src/backends/xor/flat_xor_hd.c
@@ -33,9 +33,22 @@
#include "erasurecode.h"
#include "erasurecode_backend.h"
+#define FLAT_XOR_LIB_MAJOR 1
+#define FLAT_XOR_LIB_MINOR 0
+#define FLAT_XOR_LIB_REV 0
+#define FLAT_XOR_LIB_VER_STR "1.0"
+#define FLAT_XOR_LIB_NAME "flat_xor_hd"
+#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
+#define FLAT_XOR_SO_NAME "libXorcode.dylib"
+#else
+#define FLAT_XOR_SO_NAME "libXorcode.so"
+#endif
+#define DEFAULT_W 32
+
/* Forward declarations */
struct ec_backend_op_stubs flat_xor_hd_ops;
struct ec_backend flat_xor_hd;
+struct ec_backend_common backend_flat_xor_hd;
typedef xor_code_t* (*init_xor_hd_code_func)(int, int, int);
typedef void (*xor_code_encode_func)(xor_code_t *, char **, char **, int);
@@ -50,8 +63,6 @@ struct flat_xor_hd_descriptor {
xor_hd_fragments_needed_func xor_hd_fragments_needed;
};
-#define DEFAULT_W 32
-
static int flat_xor_hd_encode(void *desc,
char **data, char **parity, int blocksize)
{
@@ -150,6 +161,14 @@ static int flat_xor_hd_exit(void *desc)
return 0;
}
+/*
+ * For the time being, we only claim compatibility with versions that
+ * match exactly
+ */
+static bool flat_xor_is_compatible_with(uint32_t version) {
+ return version == backend_flat_xor_hd.ec_backend_version;
+}
+
struct ec_backend_op_stubs flat_xor_hd_op_stubs = {
.INIT = flat_xor_hd_init,
.EXIT = flat_xor_hd_exit,
@@ -158,18 +177,18 @@ struct ec_backend_op_stubs flat_xor_hd_op_stubs = {
.FRAGSNEEDED = flat_xor_hd_min_fragments,
.RECONSTRUCT = flat_xor_hd_reconstruct,
.ELEMENTSIZE = flar_xor_hd_element_size,
+ .ISCOMPATIBLEWITH = flat_xor_is_compatible_with,
};
struct ec_backend_common backend_flat_xor_hd = {
.id = EC_BACKEND_FLAT_XOR_HD,
- .name = "flat_xor_hd",
-#if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
- .soname = "libXorcode.dylib",
-#else
- .soname = "libXorcode.so",
-#endif
- .soversion = "1.0",
+ .name = FLAT_XOR_LIB_NAME,
+ .soname = FLAT_XOR_SO_NAME,
+ .soversion = FLAT_XOR_LIB_VER_STR,
.ops = &flat_xor_hd_op_stubs,
.metadata_adder = 0,
+ .ec_backend_version = _VERSION(FLAT_XOR_LIB_MAJOR,
+ FLAT_XOR_LIB_MINOR,
+ FLAT_XOR_LIB_REV),
};