29#include "erasurecode_backend.h"
30#include "erasurecode_helpers.h"
31#include "erasurecode_helpers_ext.h"
32#include "erasurecode_log.h"
33#include "erasurecode_preprocessing.h"
34#include "erasurecode_stdinc.h"
37int prepare_fragments_for_encode(ec_backend_t instance,
39 const
char *orig_data, uint64_t orig_data_size,
40 char **encoded_data,
char **encoded_parity,
46 int buffer_size, payload_size = 0;
47 int metadata_size, data_offset = 0;
50 data_len = orig_data_size;
51 aligned_data_len = get_aligned_data_size(instance, orig_data_size);
52 *blocksize = payload_size = (aligned_data_len / k);
53 metadata_size = instance->common.ops->get_backend_metadata_size(
54 instance->desc.backend_desc,
56 data_offset = instance->common.ops->get_encode_offset(
57 instance->desc.backend_desc,
59 buffer_size = payload_size + metadata_size;
61 for (i = 0; i < k; i++) {
62 int copy_size = data_len > payload_size ? payload_size : data_len;
63 char *fragment = (
char *) alloc_fragment_buffer(buffer_size);
64 if (NULL == fragment) {
73 memcpy(encoded_data[i] + data_offset, orig_data, copy_size);
76 orig_data += copy_size;
77 data_len -= copy_size;
80 for (i = 0; i < m; i++) {
81 char *fragment = (
char *) alloc_fragment_buffer(buffer_size);
82 if (NULL == fragment) {
94 printf (
"ERROR in encode\n");
96 for (i = 0; i < k; i++) {
98 free_fragment_buffer(encoded_data[i]);
100 check_and_free_buffer(encoded_data);
103 if (encoded_parity) {
104 for (i = 0; i < m; i++) {
105 if (encoded_parity[i])
106 free_fragment_buffer(encoded_parity[i]);
108 check_and_free_buffer(encoded_parity);
122int prepare_fragments_for_decode(
124 char **data,
char **parity,
126 int *orig_size,
int *fragment_payload_size,
int fragment_size,
127 struct ec_bm *realloc_bm)
130 struct ec_bm missing_bm = NEW_BM;
131 int orig_data_size = -1;
132 int payload_size = -1;
134 convert_list_to_bitmap(missing_idxs, &missing_bm);
142 for (i = 0; i < k; i++) {
149 if (NULL == data[i]) {
150 data[i] = alloc_fragment_buffer(fragment_size -
sizeof(fragment_header_t));
151 if (NULL == data[i]) {
152 log_error(
"Could not allocate data buffer!");
155 bm_set_value(realloc_bm, i, 1);
156 }
else if (!is_addr_aligned((
unsigned long)data[i], 16)) {
157 char *tmp_buf = alloc_fragment_buffer(fragment_size -
sizeof(fragment_header_t));
158 if (NULL == tmp_buf) {
159 log_error(
"Could not allocate temp buffer!");
162 memcpy(tmp_buf, data[i], fragment_size);
164 bm_set_value(realloc_bm, i, 1);
168 if (!bm_get_value(&missing_bm, i) && orig_data_size < 0) {
169 orig_data_size = get_orig_data_size(data[i]);
170 if (orig_data_size < 0) {
171 log_error(
"Invalid orig_data_size in fragment header!");
174 payload_size = get_fragment_payload_size(data[i]);
175 if (payload_size < 0) {
176 log_error(
"Invalid fragment_size in fragment header!");
183 for (i = 0; i < m; i++) {
188 if (NULL == parity[i]) {
189 parity[i] = alloc_fragment_buffer(fragment_size-
sizeof(fragment_header_t));
190 if (NULL == parity[i]) {
191 log_error(
"Could not allocate parity buffer!");
194 bm_set_value(realloc_bm, k + i, 1);
195 }
else if (!is_addr_aligned((
unsigned long)parity[i], 16)) {
196 char *tmp_buf = alloc_fragment_buffer(fragment_size-
sizeof(fragment_header_t));
197 if (NULL == tmp_buf) {
198 log_error(
"Could not allocate temp buffer!");
201 memcpy(tmp_buf, parity[i], fragment_size);
203 bm_set_value(realloc_bm, k + i, 1);
207 if (!bm_get_value(&missing_bm, k + i) && orig_data_size < 0) {
208 orig_data_size = get_orig_data_size(parity[i]);
209 if (orig_data_size < 0) {
210 log_error(
"Invalid orig_data_size in fragment header!");
213 payload_size = get_fragment_payload_size(parity[i]);
214 if (payload_size < 0) {
215 log_error(
"Invalid fragment_size in fragment header!");
222 *orig_size = orig_data_size;
223 *fragment_payload_size = payload_size;
230 char **fragments,
int num_fragments,
231 char **data,
char **parity,
int *missing)
240 for (i = 0; i < k; i++) {
243 for (i = 0; i < m; i++) {
250 for (i = 0; i < num_fragments; i++) {
251 index = get_fragment_idx(fragments[i]);
252 if (index < 0 || index >= (k + m)) {
256 data[index] = fragments[i];
258 parity[index - k] = fragments[i];
265 for (i = 0; i < k; i++) {
266 if (NULL == data[i]) {
267 missing[num_missing] = i;
271 for (i = 0; i < m; i++) {
272 if (NULL == parity[i]) {
273 missing[num_missing] = i + k;
281int fragments_to_string(
int k,
int m,
282 char **fragments,
int num_fragments,
283 char **orig_payload, uint64_t *payload_len)
285 char *internal_payload = NULL;
287 int orig_data_size = -1;
295 if (num_fragments < k) {
303 data = (
char **) get_aligned_buffer16(
sizeof(
char *) * k);
306 log_error(
"Could not allocate buffer for data!!");
311 for (i = 0; i < num_fragments; i++) {
312 index = get_fragment_idx(fragments[i]);
313 data_size = get_fragment_payload_size(fragments[i]);
314 if ((index < 0) || (data_size < 0)) {
315 log_error(
"Invalid fragment header information!");
321 if (orig_data_size < 0) {
322 orig_data_size = get_orig_data_size(fragments[i]);
324 if (get_orig_data_size(fragments[i]) != orig_data_size) {
325 log_error(
"Inconsistent orig_data_size in fragment header!");
336 if (NULL == data[index]) {
337 data[index] = fragments[i];
353 internal_payload = (
char *) get_aligned_buffer16(orig_data_size);
354 if (NULL == internal_payload) {
355 log_error(
"Could not allocate buffer for decoded string!");
361 *payload_len = orig_data_size;
364 for (i = 0; i < num_data && orig_data_size > 0; i++) {
366 int fragment_size = get_fragment_payload_size(data[i]);
367 int payload_size = orig_data_size > fragment_size ? fragment_size : orig_data_size;
368 memcpy(internal_payload + string_off, fragment_data, payload_size);
369 orig_data_size -= payload_size;
370 string_off += payload_size;
381 *orig_payload = internal_payload;
char * get_data_ptr_from_fragment(char *buf)
__attribute__((visibility("internal")))
int get_fragment_partition(int k, int m, char **fragments, int num_fragments, char **data, char **parity, int *missing)