|
|
|
@ -18,107 +18,7 @@ void test9(); |
|
|
|
|
void test10(); |
|
|
|
|
void test11(); |
|
|
|
|
void test12(); |
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
|
|
|
|
|
Cases: |
|
|
|
|
|
|
|
|
|
1. split(offset=128K-4K, len=8K) |
|
|
|
|
= [ [ 128K-4K, 128K ], [ 0, 4K ], [ 0, 0 ] ] |
|
|
|
|
|
|
|
|
|
2. read(offset=128K-4K, len=8K, osd_set=[1,0,3]) |
|
|
|
|
= { read: [ [ 0, 128K ], [ 0, 4K ], [ 0, 4K ] ] } |
|
|
|
|
|
|
|
|
|
3. cover_read(0, 128K, { req: [ 128K-4K, 4K ] }) |
|
|
|
|
= { read: [ 0, 128K-4K ] } |
|
|
|
|
|
|
|
|
|
4. write(offset=128K-4K, len=8K, osd_set=[1,0,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 128K ], [ 4K, 128K ], [ 4K, 128K ] ], |
|
|
|
|
write: [ [ 128K-4K, 128K ], [ 0, 4K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2, read0, read1, read2 ], |
|
|
|
|
} |
|
|
|
|
+ check write2 buffer |
|
|
|
|
|
|
|
|
|
5. write(offset=0, len=128K+64K, osd_set=[1,0,3]) |
|
|
|
|
= { |
|
|
|
|
req: [ [ 0, 128K ], [ 0, 64K ], [ 0, 0 ] ], |
|
|
|
|
read: [ [ 64K, 128K ], [ 64K, 128K ], [ 64K, 128K ] ], |
|
|
|
|
write: [ [ 0, 128K ], [ 0, 64K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2, read0, read1, read2 ], |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
6. write(offset=0, len=128K+64K, osd_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
req: [ [ 0, 128K ], [ 0, 64K ], [ 0, 0 ] ], |
|
|
|
|
read: [ [ 0, 0 ], [ 64K, 128K ], [ 0, 0 ] ], |
|
|
|
|
write: [ [ 0, 128K ], [ 0, 64K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2, read1 ], |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
7. calc_rmw(offset=128K-4K, len=8K, osd_set=[1,0,3], write_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 128K ], [ 0, 128K ], [ 0, 128K ] ], |
|
|
|
|
write: [ [ 128K-4K, 128K ], [ 0, 4K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2, read0, read1, read2 ], |
|
|
|
|
} |
|
|
|
|
then, after calc_rmw_parity_xor(): { |
|
|
|
|
write: [ [ 128K-4K, 128K ], [ 0, 128K ], [ 0, 128K ] ], |
|
|
|
|
write1==read1, |
|
|
|
|
} |
|
|
|
|
+ check write1 buffer |
|
|
|
|
+ check write2 buffer |
|
|
|
|
|
|
|
|
|
8. calc_rmw(offset=0, len=128K+4K, osd_set=[0,2,3], write_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 0 ], [ 4K, 128K ], [ 0, 0 ] ], |
|
|
|
|
write: [ [ 0, 128K ], [ 0, 4K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2, read1 ], |
|
|
|
|
} |
|
|
|
|
+ check write2 buffer |
|
|
|
|
|
|
|
|
|
9. object recovery case: |
|
|
|
|
calc_rmw(offset=0, len=0, read_osd_set=[0,2,3], write_osd_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 128K ], [ 0, 128K ], [ 0, 128K ] ], |
|
|
|
|
write: [ [ 0, 0 ], [ 0, 0 ], [ 0, 0 ] ], |
|
|
|
|
input buffer: NULL, |
|
|
|
|
rmw buffer: [ read0, read1, read2 ], |
|
|
|
|
} |
|
|
|
|
then, after calc_rmw_parity_xor(): { |
|
|
|
|
write: [ [ 0, 128K ], [ 0, 0 ], [ 0, 0 ] ], |
|
|
|
|
write0==read0, |
|
|
|
|
} |
|
|
|
|
+ check write0 buffer |
|
|
|
|
|
|
|
|
|
10. full overwrite/recovery case: |
|
|
|
|
calc_rmw(offset=0, len=256K, read_osd_set=[1,0,0], write_osd_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 0 ], [ 0, 0 ], [ 0, 0 ] ], |
|
|
|
|
write: [ [ 0, 128K ], [ 0, 128K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2 ], |
|
|
|
|
} |
|
|
|
|
then, after calc_rmw_parity_xor(): all the same |
|
|
|
|
+ check write2 buffer |
|
|
|
|
|
|
|
|
|
10. partial recovery case: |
|
|
|
|
calc_rmw(offset=128K, len=128K, read_osd_set=[1,0,0], write_osd_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 128K ], [ 0, 0 ], [ 0, 0 ] ], |
|
|
|
|
write: [ [ 0, 0 ], [ 0, 128K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write1 ], |
|
|
|
|
rmw buffer: [ write2, read0 ], |
|
|
|
|
} |
|
|
|
|
then, after calc_rmw_parity_xor(): all the same |
|
|
|
|
+ check write2 buffer |
|
|
|
|
|
|
|
|
|
***/ |
|
|
|
|
void test13(); |
|
|
|
|
|
|
|
|
|
int main(int narg, char *args[]) |
|
|
|
|
{ |
|
|
|
@ -142,6 +42,8 @@ int main(int narg, char *args[]) |
|
|
|
|
test11(); |
|
|
|
|
// Test 12
|
|
|
|
|
test12(); |
|
|
|
|
// Test 13
|
|
|
|
|
test13(); |
|
|
|
|
// End
|
|
|
|
|
printf("all ok\n"); |
|
|
|
|
return 0; |
|
|
|
@ -169,6 +71,19 @@ void dump_stripes(osd_rmw_stripe_t *stripes, int pg_size) |
|
|
|
|
printf("\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
|
|
|
|
|
1. split(offset=128K-4K, len=8K) |
|
|
|
|
= [ [ 128K-4K, 128K ], [ 0, 4K ], [ 0, 0 ] ] |
|
|
|
|
|
|
|
|
|
read(offset=128K-4K, len=8K, osd_set=[1,0,3]) |
|
|
|
|
= { read: [ [ 0, 128K ], [ 0, 4K ], [ 0, 4K ] ] } |
|
|
|
|
|
|
|
|
|
cover_read(0, 128K, { req: [ 128K-4K, 4K ] }) |
|
|
|
|
= { read: [ 0, 128K-4K ] } |
|
|
|
|
|
|
|
|
|
***/ |
|
|
|
|
|
|
|
|
|
void test1() |
|
|
|
|
{ |
|
|
|
|
osd_num_t osd_set[3] = { 1, 0, 3 }; |
|
|
|
@ -193,6 +108,19 @@ void test1() |
|
|
|
|
assert(stripes[0].read_start == 0 && stripes[0].read_end == 128*1024-4096); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
|
|
|
|
|
4. write(offset=128K-4K, len=8K, osd_set=[1,0,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 128K ], [ 4K, 128K ], [ 4K, 128K ] ], |
|
|
|
|
write: [ [ 128K-4K, 128K ], [ 0, 4K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2, read0, read1, read2 ], |
|
|
|
|
} |
|
|
|
|
+ check write2 buffer |
|
|
|
|
|
|
|
|
|
***/ |
|
|
|
|
|
|
|
|
|
void test4() |
|
|
|
|
{ |
|
|
|
|
osd_num_t osd_set[3] = { 1, 0, 3 }; |
|
|
|
@ -226,6 +154,19 @@ void test4() |
|
|
|
|
free(write_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
|
|
|
|
|
5. write(offset=0, len=128K+64K, osd_set=[1,0,3]) |
|
|
|
|
= { |
|
|
|
|
req: [ [ 0, 128K ], [ 0, 64K ], [ 0, 0 ] ], |
|
|
|
|
read: [ [ 64K, 128K ], [ 64K, 128K ], [ 64K, 128K ] ], |
|
|
|
|
write: [ [ 0, 128K ], [ 0, 64K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2, read0, read1, read2 ], |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
***/ |
|
|
|
|
|
|
|
|
|
void test5() |
|
|
|
|
{ |
|
|
|
|
osd_num_t osd_set[3] = { 1, 0, 3 }; |
|
|
|
@ -254,6 +195,19 @@ void test5() |
|
|
|
|
free(write_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
|
|
|
|
|
6. write(offset=0, len=128K+64K, osd_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
req: [ [ 0, 128K ], [ 0, 64K ], [ 0, 0 ] ], |
|
|
|
|
read: [ [ 0, 0 ], [ 64K, 128K ], [ 0, 0 ] ], |
|
|
|
|
write: [ [ 0, 128K ], [ 0, 64K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2, read1 ], |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
***/ |
|
|
|
|
|
|
|
|
|
void test6() |
|
|
|
|
{ |
|
|
|
|
osd_num_t osd_set[3] = { 1, 2, 3 }; |
|
|
|
@ -278,6 +232,24 @@ void test6() |
|
|
|
|
free(write_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
|
|
|
|
|
7. calc_rmw(offset=128K-4K, len=8K, osd_set=[1,0,3], write_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 128K ], [ 0, 128K ], [ 0, 128K ] ], |
|
|
|
|
write: [ [ 128K-4K, 128K ], [ 0, 4K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2, read0, read1, read2 ], |
|
|
|
|
} |
|
|
|
|
then, after calc_rmw_parity_xor(): { |
|
|
|
|
write: [ [ 128K-4K, 128K ], [ 0, 128K ], [ 0, 128K ] ], |
|
|
|
|
write1==read1, |
|
|
|
|
} |
|
|
|
|
+ check write1 buffer |
|
|
|
|
+ check write2 buffer |
|
|
|
|
|
|
|
|
|
***/ |
|
|
|
|
|
|
|
|
|
void test7() |
|
|
|
|
{ |
|
|
|
|
osd_num_t osd_set[3] = { 1, 0, 3 }; |
|
|
|
@ -318,6 +290,19 @@ void test7() |
|
|
|
|
free(write_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
|
|
|
|
|
8. calc_rmw(offset=0, len=128K+4K, osd_set=[0,2,3], write_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 0 ], [ 4K, 128K ], [ 0, 0 ] ], |
|
|
|
|
write: [ [ 0, 128K ], [ 0, 4K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2, read1 ], |
|
|
|
|
} |
|
|
|
|
+ check write2 buffer |
|
|
|
|
|
|
|
|
|
***/ |
|
|
|
|
|
|
|
|
|
void test8() |
|
|
|
|
{ |
|
|
|
|
osd_num_t osd_set[3] = { 0, 2, 3 }; |
|
|
|
@ -355,6 +340,24 @@ void test8() |
|
|
|
|
free(write_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
|
|
|
|
|
9. object recovery case: |
|
|
|
|
calc_rmw(offset=0, len=0, read_osd_set=[0,2,3], write_osd_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 128K ], [ 0, 128K ], [ 0, 128K ] ], |
|
|
|
|
write: [ [ 0, 0 ], [ 0, 0 ], [ 0, 0 ] ], |
|
|
|
|
input buffer: NULL, |
|
|
|
|
rmw buffer: [ read0, read1, read2 ], |
|
|
|
|
} |
|
|
|
|
then, after calc_rmw_parity_xor(): { |
|
|
|
|
write: [ [ 0, 128K ], [ 0, 0 ], [ 0, 0 ] ], |
|
|
|
|
write0==read0, |
|
|
|
|
} |
|
|
|
|
+ check write0 buffer |
|
|
|
|
|
|
|
|
|
***/ |
|
|
|
|
|
|
|
|
|
void test9() |
|
|
|
|
{ |
|
|
|
|
osd_num_t osd_set[3] = { 0, 2, 3 }; |
|
|
|
@ -395,6 +398,21 @@ void test9() |
|
|
|
|
free(rmw_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/***
|
|
|
|
|
|
|
|
|
|
10. full overwrite/recovery case: |
|
|
|
|
calc_rmw(offset=0, len=256K, read_osd_set=[1,0,0], write_osd_set=[1,2,3]) |
|
|
|
|
= { |
|
|
|
|
read: [ [ 0, 0 ], [ 0, 0 ], [ 0, 0 ] ], |
|
|
|
|
write: [ [ 0, 128K ], [ 0, 128K ], [ 0, 128K ] ], |
|
|
|
|
input buffer: [ write0, write1 ], |
|
|
|
|
rmw buffer: [ write2 ], |
|
|
|
|
} |
|
|
|
|
then, after calc_rmw_parity_xor(): all the same |
|
|
|
|
+ check write2 buffer |
|
|
|
|
|
|
|
|
|
***/ |
|
|
|
|
|
|
|
|
|
void test10() |
|
|
|
|
{ |
|
|
|
|
osd_num_t osd_set[3] = { 1, 0, 0 }; |
|
|
|
@ -436,6 +454,21 @@ void test10() |
|
|
|
|
free(write_buf); |
|
|
|
|
} |