372 | 372 |
static int create_fake_frags_no_meta(char ***array, int num_frags,
|
373 | 373 |
const char *data, int data_len)
|
374 | 374 |
{
|
|
375 |
// N.B. The difference from creat_frags_arry is to creat new
|
|
376 |
// memory allocation and set a copy of data/parity there. The
|
|
377 |
// allocated memory should be maintained by the caller.
|
375 | 378 |
int _num_frags = 0;
|
376 | 379 |
int i = 0;
|
377 | 380 |
char **ptr = NULL;
|
|
400 | 403 |
struct ec_args *args,
|
401 | 404 |
int *skips)
|
402 | 405 |
{
|
|
406 |
// N.B. this function sets pointer reference to the ***array
|
|
407 |
// from **data and **parity so DO NOT free each value of
|
|
408 |
// the array independently because the data and parity will
|
|
409 |
// be expected to be cleanup via liberasurecode_encode_cleanup
|
403 | 410 |
int num_frags = 0;
|
404 | 411 |
int i = 0;
|
405 | 412 |
char **ptr = NULL;
|
|
430 | 437 |
return num_frags;
|
431 | 438 |
}
|
432 | 439 |
|
|
440 |
static void cleanup_avail_frags(char **avail_frags,
|
|
441 |
int num_frags)
|
|
442 |
{
|
|
443 |
while(num_frags > 0) free(avail_frags[--num_frags]);
|
|
444 |
free(avail_frags);
|
|
445 |
}
|
433 | 446 |
static int encode_failure_stub(void *desc, char **data,
|
434 | 447 |
char **parity, int blocksize)
|
435 | 448 |
{
|
|
581 | 594 |
assert(rc < 0);
|
582 | 595 |
instance->common.ops->encode = orig_encode_func;
|
583 | 596 |
|
|
597 |
liberasurecode_instance_destroy(desc);
|
584 | 598 |
free(orig_data);
|
585 | 599 |
}
|
586 | 600 |
|
|
612 | 626 |
|
613 | 627 |
rc = liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
|
614 | 628 |
assert(rc == 0);
|
|
629 |
liberasurecode_instance_destroy(desc);
|
615 | 630 |
free(orig_data);
|
616 | 631 |
}
|
617 | 632 |
|
|
628 | 643 |
int *skips = create_skips_array(&null_args, -1);
|
629 | 644 |
char *decoded_data = NULL;
|
630 | 645 |
uint64_t decoded_data_len = 0;
|
631 | |
const char *fake_data = " ";
|
|
646 |
// fake_data len should be bigger than fragment_header_t for
|
|
647 |
// the verifications
|
|
648 |
int fake_data_len = 1024;
|
|
649 |
char *fake_data = create_buffer(fake_data_len, 'y');
|
632 | 650 |
|
633 | 651 |
desc = liberasurecode_instance_create(EC_BACKEND_NULL, &null_args);
|
634 | 652 |
if (-EBACKENDNOTAVAIL == desc) {
|
|
640 | 658 |
// test with invalid fragments (no metadata headers)
|
641 | 659 |
num_avail_frags = create_fake_frags_no_meta(&avail_frags, (null_args.k +
|
642 | 660 |
null_args.m),
|
643 | |
fake_data, strlen(fake_data));
|
|
661 |
fake_data, fake_data_len);
|
644 | 662 |
assert(num_avail_frags > 0);
|
|
663 |
free(fake_data);
|
645 | 664 |
|
646 | 665 |
rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
|
647 | |
strlen(fake_data), 1,
|
|
666 |
fake_data_len, 1,
|
648 | 667 |
&decoded_data, &decoded_data_len);
|
649 | 668 |
// no metadata headers w/ force_metadata_checks results in EBADHEADER
|
650 | 669 |
assert(rc == -EBADHEADER);
|
651 | 670 |
|
652 | 671 |
rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
|
653 | |
strlen(fake_data), 0,
|
|
672 |
fake_data_len, 0,
|
654 | 673 |
&decoded_data, &decoded_data_len);
|
655 | 674 |
// no metadata headers w/o force_metadata_checks also results in EBADHEADER
|
656 | 675 |
assert(rc == -EBADHEADER);
|
|
676 |
|
|
677 |
// encoded_fragment_len is too small
|
|
678 |
rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
|
|
679 |
1, 1, &decoded_data, &decoded_data_len);
|
|
680 |
assert(rc == -EBADHEADER);
|
|
681 |
|
|
682 |
cleanup_avail_frags(avail_frags, num_avail_frags);
|
657 | 683 |
|
658 | 684 |
// test with num_fragments < (k)
|
659 | 685 |
num_avail_frags = create_fake_frags_no_meta(&avail_frags, (null_args.k - 1),
|
660 | 686 |
" ", 1);
|
661 | 687 |
assert(num_avail_frags > 0);
|
662 | 688 |
rc = liberasurecode_decode(desc, avail_frags, num_avail_frags,
|
663 | |
strlen(fake_data), 1,
|
|
689 |
fake_data_len, 1,
|
664 | 690 |
&decoded_data, &decoded_data_len);
|
665 | 691 |
assert(rc == -EINSUFFFRAGS);
|
|
692 |
|
|
693 |
cleanup_avail_frags(avail_frags, num_avail_frags);
|
666 | 694 |
|
667 | 695 |
rc = liberasurecode_encode(desc, orig_data, orig_data_size,
|
668 | 696 |
&encoded_data, &encoded_parity, &encoded_fragment_len);
|
|
691 | 719 |
encoded_fragment_len, 1,
|
692 | 720 |
&decoded_data, NULL);
|
693 | 721 |
assert(rc < 0);
|
|
722 |
|
694 | 723 |
free(skips);
|
695 | 724 |
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
|
|
725 |
liberasurecode_instance_destroy(desc);
|
|
726 |
// N.B. create_frags_array sets pointer reference of either encoded_data
|
|
727 |
// or encoded_parity and they are cleaned up via
|
|
728 |
// liberasurecode_encode_cleanup
|
696 | 729 |
free(avail_frags);
|
697 | 730 |
free(orig_data);
|
698 | |
|
699 | 731 |
}
|
700 | 732 |
|
701 | 733 |
static void test_decode_cleanup_invalid_args()
|
|
716 | 748 |
|
717 | 749 |
rc = liberasurecode_decode_cleanup(desc, NULL);
|
718 | 750 |
assert(rc == 0);
|
719 | |
|
|
751 |
liberasurecode_instance_destroy(desc);
|
720 | 752 |
free(orig_data);
|
721 | 753 |
}
|
722 | 754 |
|
|
752 | 784 |
assert(rc < 0);
|
753 | 785 |
|
754 | 786 |
free(out_frag);
|
|
787 |
free(avail_frags);
|
755 | 788 |
|
756 | 789 |
// Test for EINSUFFFRAGS
|
757 | 790 |
// we have to call encode to get fragments which have valid header.
|
|
765 | 798 |
rc = liberasurecode_reconstruct_fragment(desc, encoded_data, 1, encoded_fragment_len, 1, out_frag);
|
766 | 799 |
|
767 | 800 |
assert(rc == -EINSUFFFRAGS);
|
|
801 |
free(orig_data);
|
768 | 802 |
free(out_frag);
|
769 | |
free(avail_frags);
|
770 | 803 |
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
|
|
804 |
liberasurecode_instance_destroy(desc);
|
771 | 805 |
}
|
772 | 806 |
|
773 | 807 |
static void test_fragments_needed_invalid_args()
|
|
796 | 830 |
|
797 | 831 |
rc = liberasurecode_fragments_needed(desc, &frags_to_recon, &frags_to_exclude, NULL);
|
798 | 832 |
assert(rc < 0);
|
|
833 |
liberasurecode_instance_destroy(desc);
|
799 | 834 |
}
|
800 | 835 |
|
801 | 836 |
static void test_get_fragment_metadata_invalid_args() {
|
|
846 | 881 |
|
847 | 882 |
rc = liberasurecode_verify_stripe_metadata(desc, frags, 0);
|
848 | 883 |
assert(rc == -EINVALIDPARAMS);
|
849 | |
|
|
884 |
liberasurecode_instance_destroy(desc);
|
|
885 |
free(frags);
|
850 | 886 |
}
|
851 | 887 |
|
852 | 888 |
static void test_get_fragment_partition()
|
|
866 | 902 |
desc = liberasurecode_instance_create(EC_BACKEND_NULL, &null_args);
|
867 | 903 |
if (-EBACKENDNOTAVAIL == desc) {
|
868 | 904 |
fprintf (stderr, "Backend library not available!\n");
|
|
905 |
free(orig_data);
|
|
906 |
free(skips);
|
869 | 907 |
return;
|
870 | 908 |
}
|
871 | 909 |
assert(desc > 0);
|
|
875 | 913 |
|
876 | 914 |
missing = alloc_and_set_buffer(sizeof(char*) * null_args.k, -1);
|
877 | 915 |
|
878 | |
for(i = 0; i < null_args.m; i++) skips[i] = 1;
|
|
916 |
for(i = 0; i < null_args.m; i++) {
|
|
917 |
skips[i] = 1;
|
|
918 |
/* get_fragment_partition is going to NULL all the entries in
|
|
919 |
* encoded_data and encoded_parity before populating them again
|
|
920 |
* from avail_frags. Since we're explicitly *not* including these
|
|
921 |
* data frags in avail_frags, free them now.
|
|
922 |
*/
|
|
923 |
if (i < null_args.k) {
|
|
924 |
free(encoded_data[i]);
|
|
925 |
} else {
|
|
926 |
free(encoded_parity[i - null_args.k]);
|
|
927 |
}
|
|
928 |
}
|
879 | 929 |
num_avail_frags = create_frags_array(&avail_frags, encoded_data,
|
880 | 930 |
encoded_parity, &null_args, skips);
|
881 | 931 |
|
|
884 | 934 |
assert(0 == rc);
|
885 | 935 |
|
886 | 936 |
for(i = 0; i < null_args.m; i++) assert(missing[i] == i);
|
887 | |
assert(missing[++i] == -1);
|
888 | |
|
|
937 |
// Loop already pushed us one past
|
|
938 |
assert(missing[i] == -1);
|
|
939 |
|
|
940 |
free(avail_frags);
|
889 | 941 |
free(missing);
|
890 | 942 |
|
891 | |
for(i = 0; i < null_args.m + 1; i++) skips[i] = 1;
|
|
943 |
skips[i] = 1;
|
|
944 |
if (i < null_args.k) {
|
|
945 |
free(encoded_data[i]);
|
|
946 |
} else {
|
|
947 |
free(encoded_parity[i - null_args.k]);
|
|
948 |
}
|
|
949 |
|
892 | 950 |
num_avail_frags = create_frags_array(&avail_frags, encoded_data,
|
893 | 951 |
encoded_parity, &null_args, skips);
|
894 | 952 |
|
|
904 | 962 |
free(missing);
|
905 | 963 |
free(skips);
|
906 | 964 |
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
|
|
965 |
liberasurecode_instance_destroy(desc);
|
907 | 966 |
free(avail_frags);
|
908 | 967 |
free(orig_data);
|
909 | 968 |
}
|
|
999 | 1058 |
rc = liberasurecode_decode_cleanup(desc, decoded_data);
|
1000 | 1059 |
assert(rc == 0);
|
1001 | 1060 |
|
1002 | |
if (desc) {
|
1003 | |
assert(0 == liberasurecode_instance_destroy(desc));
|
1004 | |
}
|
1005 | |
|
|
1061 |
assert(0 == liberasurecode_instance_destroy(desc));
|
1006 | 1062 |
free(orig_data);
|
1007 | 1063 |
free(avail_frags);
|
1008 | 1064 |
}
|
|
1074 | 1130 |
rc = liberasurecode_reconstruct_fragment(desc, avail_frags, num_avail_frags, encoded_fragment_len, i, out);
|
1075 | 1131 |
assert(rc == 0);
|
1076 | 1132 |
assert(memcmp(out, cmp, encoded_fragment_len) == 0);
|
|
1133 |
free(avail_frags);
|
1077 | 1134 |
}
|
1078 | 1135 |
free(orig_data);
|
1079 | 1136 |
free(out);
|
1080 | |
free(avail_frags);
|
1081 | 1137 |
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
|
|
1138 |
liberasurecode_instance_destroy(desc);
|
1082 | 1139 |
}
|
1083 | 1140 |
|
1084 | 1141 |
static void test_fragments_needed_impl(const ec_backend_id_t be_id,
|
|
1202 | 1259 |
assert(is_valid_fragment == 1);
|
1203 | 1260 |
i++;
|
1204 | 1261 |
}
|
|
1262 |
liberasurecode_instance_destroy(desc);
|
1205 | 1263 |
free(fragments_to_reconstruct);
|
1206 | 1264 |
free(fragments_to_exclude);
|
1207 | 1265 |
free(fragments_needed);
|
|
1274 | 1332 |
assert(be_version == be->common.ec_backend_version);
|
1275 | 1333 |
}
|
1276 | 1334 |
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
|
|
1335 |
liberasurecode_instance_destroy(desc);
|
1277 | 1336 |
free(orig_data);
|
1278 | 1337 |
}
|
1279 | 1338 |
|
|
1386 | 1445 |
EC_BACKEND_ISA_L_RS_VAND, &specific_1010_args);
|
1387 | 1446 |
if (-EBACKENDNOTAVAIL == desc) {
|
1388 | 1447 |
fprintf (stderr, "Backend library not available!\n");
|
|
1448 |
free(orig_data);
|
|
1449 |
free(skips);
|
1389 | 1450 |
return;
|
1390 | 1451 |
}
|
1391 | 1452 |
assert(desc > 0);
|
|
1435 | 1496 |
assert(rc == 0);
|
1436 | 1497 |
|
1437 | 1498 |
free(out_frag);
|
|
1499 |
free(avail_frags);
|
1438 | 1500 |
|
1439 | 1501 |
// cleanup all
|
1440 | 1502 |
rc = liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
|
|
1443 | 1505 |
rc = liberasurecode_decode_cleanup(desc, decoded_data);
|
1444 | 1506 |
assert(rc == 0);
|
1445 | 1507 |
|
1446 | |
if (desc) {
|
1447 | |
assert(0 == liberasurecode_instance_destroy(desc));
|
1448 | |
}
|
1449 | |
|
|
1508 |
assert(0 == liberasurecode_instance_destroy(desc));
|
1450 | 1509 |
free(orig_data);
|
1451 | |
free(avail_frags);
|
1452 | 1510 |
free(skips);
|
1453 | 1511 |
}
|
1454 | 1512 |
|
|
1509 | 1567 |
|
1510 | 1568 |
if (-EBACKENDNOTAVAIL == desc) {
|
1511 | 1569 |
fprintf (stderr, "Backend library not available!\n");
|
|
1570 |
free(orig_data);
|
|
1571 |
free(skip);
|
1512 | 1572 |
return;
|
1513 | 1573 |
}
|
1514 | 1574 |
assert(desc > 0);
|
|
1526 | 1586 |
assert(0 == rc);
|
1527 | 1587 |
|
1528 | 1588 |
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
|
|
1589 |
liberasurecode_instance_destroy(desc);
|
1529 | 1590 |
free(orig_data);
|
1530 | 1591 |
free(skip);
|
|
1592 |
free(avail_frags);
|
1531 | 1593 |
}
|
1532 | 1594 |
|
1533 | 1595 |
static void verify_fragment_metadata_mismatch_impl(const ec_backend_id_t be_id, struct ec_args *args,
|
|
1550 | 1612 |
|
1551 | 1613 |
if (-EBACKENDNOTAVAIL == desc) {
|
1552 | 1614 |
fprintf (stderr, "Backend library not available!\n");
|
|
1615 |
free(orig_data);
|
|
1616 |
free(skip);
|
1553 | 1617 |
return;
|
1554 | 1618 |
}
|
1555 | 1619 |
assert(desc > 0);
|
|
1614 | 1678 |
}
|
1615 | 1679 |
}
|
1616 | 1680 |
liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);
|
|
1681 |
liberasurecode_instance_destroy(desc);
|
|
1682 |
free(avail_frags);
|
1617 | 1683 |
free(orig_data);
|
1618 | 1684 |
free(skip);
|
1619 | 1685 |
}
|