)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"246d995adce671419efc8ec5296ae0ff62b21447","unresolved":true,"context_lines":[{"line_number":13,"context_line":"l \u003d local parities"},{"line_number":14,"context_line":"It adds g global parities and group origin data into l groups and"},{"line_number":15,"context_line":"generate one local parity per group."},{"line_number":16,"context_line":"Order of data is following pattern, where Dix is original data group i"},{"line_number":17,"context_line":"D00 D01 D02   D10 D11 D12 D20 D21 D22 D23   G1 G2 G(g)  P1 P2 .. P(l)"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I2884cda24ba72d4025b175f4357ccd7ffbb48c63"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"e75425e5_636d80fb","line":17,"range":{"start_line":16,"start_character":0,"end_line":17,"end_character":69},"updated":"2025-10-21 16:54:09.000000000","message":"I need a little help making sense of this, \u0027cause I think it\u0027s going to be important that I understand it. Maybe breaking it out into a few different examples would help? Like, given\n\n- `k\u003d8, m\u003d6, l\u003d2`\n- `k\u003d8, m\u003d16, l\u003d4`\n- `k\u003d12, m\u003d12, l\u003d3`\n\nhow would the frags get grouped for each region? (Do those even seem like reasonable parameters? I\u0027m still trying to figure out where the right balance will be with storage overhead -- which should still look something like `1 + m/k`, right?)","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"1fffc181e9bd20e892ba765945801632309fbd30","unresolved":true,"context_lines":[{"line_number":13,"context_line":"l \u003d local parities"},{"line_number":14,"context_line":"It adds g global parities and group origin data into l groups and"},{"line_number":15,"context_line":"generate one local parity per group."},{"line_number":16,"context_line":"Order of data is following pattern, where Dix is original data group i"},{"line_number":17,"context_line":"D00 D01 D02   D10 D11 D12 D20 D21 D22 D23   G1 G2 G(g)  P1 P2 .. P(l)"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I2884cda24ba72d4025b175f4357ccd7ffbb48c63"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9b0612d7_91684d5a","line":17,"range":{"start_line":16,"start_character":0,"end_line":17,"end_character":69},"in_reply_to":"e75425e5_636d80fb","updated":"2025-10-23 16:17:03.000000000","message":"Current meaning of parameters:\nk : data , m is total parity m\u003d g + l , I reused same parameter instead of defining g parameter\nl : local parity.\nCurrently we divide k data (d(0), ..., d(k-1))into l groups, the last group can hold more data, for each group we generate single local parity.\nAnd we generate g global parities for data chunks.\nFor multi region we can distribute data in order to have a data group with its parity in the same region.\nConfigs like azure LRC(6, 4, 2) is adapted for mono region. \nFor overhead it is the same (1 + m/k) but power of correction is better in RS as each local parity can be used only for its associated data group.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"467ec9b5f53669bc663ade3f46fe6ec968b89b93","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"2d4cb432_4df813df","updated":"2025-09-03 07:29:18.000000000","message":"This is first step, need to do:\n1) code to clean and factorize\n2) some leaks malloc not freed\n3) Optimise reconstruction by using only some chunks","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"54924d4cbde71401571cbae9b0d3e75de72a0114","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c14b9a5f_18e6ef98","in_reply_to":"2d4cb432_4df813df","updated":"2025-09-12 16:33:49.000000000","message":"1) still to do\n2) done\n3) done","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"88b9790260ae631437440da49051a07ac80b5adb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"bb6a8a47_1c7fb172","in_reply_to":"722235ff_367c56b9","updated":"2025-09-19 07:09:17.000000000","message":"Done","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"3eb008badff9866c42cb030e428540a6d02269da","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"722235ff_367c56b9","in_reply_to":"c14b9a5f_18e6ef98","updated":"2025-09-15 07:55:58.000000000","message":"I need  to detail some choices here, I used to write some similar functions in order to avoid any regression on other backends.\nSome technical choices I need to document:\n1) Encoding: We start with general systematic enconding matrix and change last lines to have partial parities.\nAs we start from (k+m, k) matrix that has the following property: Each subset of k lines are independent. We do some transformation on this matrix by multipling by (I - \u0026(i,j) Matrix to obtain new matrix. Multiplciation saves determinant properties.\nI choose to devide k parities into (l\u003dlocal parity) groups.\nThe last group can have more elements.\nLocal parity parameter is added and we deduce global parity from that: g \u003d m- l\nFormat of matrix: \n(I 0 0 0 0 0)\ng1                             \u003c- global parity coefs\ng2\ng3\n1 1 0 0  0 0 0 \u003c- local parity 1 that uses first chunks\n0 0 1  1\n0 0 0 0  1 1 1)\n\n2) Decoding\nAn LRC(k,m, l) can decode up to (g+1) errors where g \u003d  m-l in a systematic way and can decode 80% of g+2 errors.\nAs we decode we need to get data so we will read all data chunks to have object.\nSo decoding will use existing chunks + existing global parities and in last uses local parities.\nReconstruction is a little different as the objective is to reconstruct some missing chunks and in that case.\n a) If missing chunks are \u003e 1 we use some schema as decoding \n b) if missing chunk \u003d\u003d 1 and is data or local parity we will use only needed chunks to rebuild.","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"dc2df0959bd1df6f35e59b6be29b092c62bf2235","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"67cc716d_573cf6e2","updated":"2025-09-19 16:07:29.000000000","message":"Current version seems working as tested for LRC(7,5,2). I will add tests but need some feedback on code:\n1) factorise current functions with risk of regrssion\n2) Enhance code but save different functions for LRC","commit_id":"3cf6af201904cc02ac572acfa9d3e69dfc909097"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"c4d27b1534722697434ccad5b4dc2f7dbddc50c2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e36c8fbe_77347f88","updated":"2025-10-08 12:57:17.000000000","message":"If possible to give this backend a chance, There is no emergency but it would be nice to show show bandwidth saving when reconstructing objects with single failure","commit_id":"8e6a669021009fab648a0dd0fb1795c2d7d0211d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"246d995adce671419efc8ec5296ae0ff62b21447","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"a31c03c5_97f4a582","updated":"2025-10-21 16:54:09.000000000","message":"OK, I\u0027m still poking around the periphery, haven\u0027t dived into the guts of it in `src/backends/isa-l/` yet, but I\u0027ve got some questions.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5f4eac3c9ed65c726288e25f9ee9e0cfef28f540","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"755756de_bc727868","updated":"2025-10-26 03:05:21.000000000","message":"OK, I\u0027m getting there. I think I still need to spend some time thinking about the linear algebra coming in at the end of the LRC `gen_encoding_matrix`, but I\u0027m getting closer to really feeling like I grok it.","commit_id":"8ef1bf2f284f2804a2605891866447780760dbf3"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"7c50040b34670f0af0d136b82e3eee96979abbe6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3a832dd1_2e7fb6a1","updated":"2025-11-03 09:52:55.000000000","message":"Thanks for reviewing the encoding part. some important changes are also on reconstruct side. and we need to discuss some rebuild capacity beyond g (global parity) errors.","commit_id":"8ef1bf2f284f2804a2605891866447780760dbf3"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"7c50040b34670f0af0d136b82e3eee96979abbe6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"4a814326_a2dd4443","in_reply_to":"755756de_bc727868","updated":"2025-11-03 09:52:55.000000000","message":"sounds good, there is an adaption of encoding matrix, I still need to prove some correction capacity beyond g errors.","commit_id":"8ef1bf2f284f2804a2605891866447780760dbf3"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"3dfdf33229c5536d322b0108b04ad645563a894d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"9d796dca_8ab9cba2","updated":"2025-11-10 11:40:20.000000000","message":"Thank your for reviewing and reporting these points. I will use your propositions.\nFor information also:\nI tested several configs of LRC parameters and some configs with small k, m comes with up to g+1 systematic error corrections.\nsome other configs and in general when k\u003e\u003d11 and m \u003e\u003d5, we can ensure only systematically up to g errors.\nFor each of these last configurations, I am confident to find some specific encoding matrix to bring up to g+1 error correction. This proof could be based on density of invertible matrix\u0027s... this  is a direction of conduction some research...","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"d32444ad_a2eff8c4","updated":"2025-11-27 18:45:05.000000000","message":"I took a stab at addressing some of this in a few follow-ons:\n\n- https://review.opendev.org/c/openstack/liberasurecode/+/968742\n- https://review.opendev.org/c/openstack/liberasurecode/+/968743\n- https://review.opendev.org/c/openstack/liberasurecode/+/968744\n\nFeel free to squash in some/all of them if you like. By the last one, we\u0027re using local-only matrices for reconstruction in more circumstances, but I still haven\u0027t added tests to demonstrate that passing a *minimal* set of local-only frags results in successful reconstruction -- and I don\u0027t think they would pass just yet if I had.","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"041757128a8a0b44603fd45abe1cbf0030bd4fbb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"699b9f8d_b4815314","in_reply_to":"d32444ad_a2eff8c4","updated":"2025-12-04 08:43:55.000000000","message":"This is good, ok for local reconstruction. \nNote that currently we specify only one destination_idx but we could do some parallel reconstruction","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"27adfa920a4ce43dac0b576d5ec9eb2553b92be8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"d2876043_8d7e4aa3","updated":"2025-12-05 08:22:11.000000000","message":"some stress tests to show decoding errors when having g + 1 errors, g stands fro global parity\nasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 12 8 4 1000\nskip\ni\u003d 0 val\u003d1 i\u003d 2 val\u003d1 i\u003d 6 val\u003d1 i\u003d 11 val\u003d1 i\u003d 13 val\u003d1 skip\ni\u003d 0 val\u003d1 i\u003d 1 val\u003d1 i\u003d 5 val\u003d1 i\u003d 7 val\u003d1 i\u003d 13 val\u003d1 total decoding errors 2\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 13 8 4 1000\nskip\ni\u003d 0 val\u003d1 i\u003d 2 val\u003d1 i\u003d 4 val\u003d1 i\u003d 11 val\u003d1 i\u003d 12 val\u003d1 skip\ni\u003d 2 val\u003d1 i\u003d 3 val\u003d1 i\u003d 6 val\u003d1 i\u003d 7 val\u003d1 i\u003d 13 val\u003d1 total decoding errors 2\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 14 8 4 1000\nskip\ni\u003d 0 val\u003d1 i\u003d 1 val\u003d1 i\u003d 4 val\u003d1 i\u003d 5 val\u003d1 i\u003d 12 val\u003d1 total decoding errors 1\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 14 7 4 1000\ntotal decoding errors 0\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 14 8 4 1000\nskip\ni\u003d 0 val\u003d1 i\u003d 1 val\u003d1 i\u003d 4 val\u003d1 i\u003d 5 val\u003d1 i\u003d 12 val\u003d1 total decoding errors 1\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 14 8 5 1000\ntotal decoding errors 0\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 14 8 4 1000\nskip\ni\u003d 0 val\u003d1 i\u003d 1 val\u003d1 i\u003d 4 val\u003d1 i\u003d 5 val\u003d1 i\u003d 12 val\u003d1 total decoding errors 1\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 14 8 4 2000\nskip\ni\u003d 0 val\u003d1 i\u003d 1 val\u003d1 i\u003d 4 val\u003d1 i\u003d 5 val\u003d1 i\u003d 12 val\u003d1 total decoding errors 1\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 14 8 4 2000\nskip\ni\u003d 0 val\u003d1 i\u003d 1 val\u003d1 i\u003d 4 val\u003d1 i\u003d 5 val\u003d1 i\u003d 12 val\u003d1 total decoding errors 1\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 14 8 4 2000\nskip\ni\u003d 0 val\u003d1 i\u003d 1 val\u003d1 i\u003d 4 val\u003d1 i\u003d 5 val\u003d1 i\u003d 12 val\u003d1 total decoding errors 1\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 14 8 4 2000\nskip\ni\u003d 0 val\u003d1 i\u003d 1 val\u003d1 i\u003d 4 val\u003d1 i\u003d 5 val\u003d1 i\u003d 12 val\u003d1 total decoding errors 1\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 14 8 4 2500\nskip\ni\u003d 0 val\u003d1 i\u003d 1 val\u003d1 i\u003d 4 val\u003d1 i\u003d 5 val\u003d1 i\u003d 12 val\u003d1 total decoding errors 1\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 8 6 3 2500\ntotal decoding errors 0\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ ./test/.libs/liberasurecode_rs_isal_stress_test 10 8 6 3 2500\ntotal decoding errors 0","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"e44e0af7f35d973b9ca239f30a480ccc786b94fb","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":13,"id":"5b40fd37_d239d733","in_reply_to":"3322d3e3_c42b48a9","updated":"2025-12-05 16:40:13.000000000","message":"hope early: tests with cauchy based LRC shoes same limitation\nbut I stay convinced that for given config (k, m, l) we can find matrix that allow systematic g+1 errors.\nI tested earlier some configs and adapted matrix manually to bring such asumption , but it is difficult to bring some generic case:\nSee here the doc from azure some exmaple for LRC(12, 2, 2) page(23):\nhttps://www.usenix.org/sites/default/files/conference/protected-files/huang_atc12_slides_0.pdf\nAnd our result for 3 errors:\nlaitasso@laptop1352154:~/code/erasure/liberasurecode$ gdb --args ./test/.libs/liberasurecode_rs_isal_stress_test 10 12 2 2 2500\n\ntotal decoding errors 0\n[Inferior 1 (process 287688) exited normally]","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"eab84c50b0ac6b71ce90ad1ebe6ae0dab56460a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"3322d3e3_c42b48a9","in_reply_to":"41eb83bc_eee5241b","updated":"2025-12-05 10:23:28.000000000","message":"I also have some other projects:\n1) Create some clay code in liberasure, Stuedid some papers and implementation seems accessible\n2) study some locally decodable codes , (see  Sergey yekhanin https://people.csail.mit.edu/dmoshkov/courses/codes/LDC_now.pdf)\n3) Study using LDPC combined with some hash ....","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"f7719fd2_a77ebd54","in_reply_to":"5b40fd37_d239d733","updated":"2026-02-24 21:20:37.000000000","message":"I think we can resolve this thread now that we can reliably correct g+1 errors. Your other projects sound interesting, though; I can see I\u0027ve got some reading to do :-)","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"384f241243297044d82332dfaeb83f8492c09883","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"41eb83bc_eee5241b","in_reply_to":"d2876043_8d7e4aa3","updated":"2025-12-05 09:18:42.000000000","message":"For that I tested LRC based on cauchy matrix and it corrects up to g+1 (systematically )  errors where LRC based on vand_inv fails.","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"300525482d74624736886942ca9430b86a372718","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"b0fdb16e_bf2cf6be","in_reply_to":"f7719fd2_a77ebd54","updated":"2026-02-25 13:29:48.000000000","message":"I will inform you if I start new backend :-). in my opinion we should test in our side once merged at high level (swift / oio-sds )  with new backend and check read /write latencies.\nUse data path for reading , test throughput with simple reconstruction. etc etc","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d597f7ca6108379fb58d66a00a6164e057e3a7dd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"be21663d_c8b759aa","updated":"2026-01-17 03:50:52.000000000","message":"Sorry, between holidays and medical issues, it took me longer than I\u0027d meant to come back around to this. Good news is that the time gave us a chance for some related patches to merge -- see what you think of https://review.opendev.org/c/openstack/liberasurecode/+/973688 to take advantage of the new `ISSYSTEMATIC` and `CHECKRECONSTRUCTFRAGMENTS` fields for the op stubs. I tried to keep this patch as-is as much as I could for now, but if you like the follow-up, feel free to squash it in.\n\n(IMHO I rather like how it removes the need to modify `src/erasurecode_preprocessing.c` and `liberasurecode.sym` at all, and most of the need to modify `src/erasurecode.c` -- even if the complexities of my `isa_l_rs_lrc_check_reconstruct_fragments` *did* mean that the net line count didn\u0027t move much.)","commit_id":"2fde6b21c9e8263f2dce2d2d4092fe5b0a5fa383"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"3a7b1994cd7da81709b852c91d2a0b8145d1c97a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"2e6e11dc_79547fbb","in_reply_to":"be21663d_c8b759aa","updated":"2026-01-20 09:59:51.000000000","message":"Hope you are well, I was a little busy also, vacation , familly etc.\nThis sounds good, I am ok with idea. I will look.","commit_id":"2fde6b21c9e8263f2dce2d2d4092fe5b0a5fa383"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"f55b5c61_fb150922","updated":"2026-01-31 18:04:27.000000000","message":"I wonder if we ought to move the LRC-specific functions from `isa_l_common.c` to `isa_l_rs_lrc.c` ...\n\nI also want to double-check that we\u0027ve got some test coverage specifically for local-only reconstruction -- the sort of thing that this scheme can do but `isa_l_rs_vand_inv` *can\u0027t*.\n\nI think we\u0027re getting close though!","commit_id":"45cf399d0b6ad86131659a8695eb0d8c43ddf3fd"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0073e465e011a64a1a9a70a63d086df007103d47","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"3bc718ce_c39ddf81","updated":"2026-02-05 00:31:40.000000000","message":"This is looking really good, amazing work!\n\nIs there a reason why most the LRC functions are defined in isa_l.common? and unless they\u0027re generic enough shouldn\u0027t they live in the LRC c file?\n\nIf there is a good reason then happy to change my vote.","commit_id":"c8c2faa1b6ee65be21d670fc351a845bcd1e4b07"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"598fe59cb13a1d0d33f31be278631af382544e24","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":19,"id":"4256b534_a89ea12a","updated":"2026-02-09 08:42:31.000000000","message":"I explored some ideas to garantee g+1 (g global parities), and this wasn\u0027t obvious.\nIt works for some values of (k,m) but fails for some cases when k and m are higher:\nWe can see here an example of error test/.libs/liberasurecode_rs_isal_stress_test 10 15 5 2  with 4 errors ( g\u003d 3)\ni\u003d 1 val\u003d1 i\u003d 6 val\u003d1 i\u003d 8 val\u003d1 i\u003d 12 val\u003d1 total decoding errors 1\nI cam with idea that will work for all cases and I will propose a modification for encoding matrix.\n\nEncoding matrix will still similar, I will just change coeffs  for local parities. with this modification can be provable to correct up to g + 1 errors.\nThe main idea is that local coeffs for l local parities are generated from only one global parity.\nNo impact on current work, just offer the possibility to recover from g+1 errors","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9f7f11bf4aa1755f27193e0c0a5705887039360","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":19,"id":"d2059880_c0d40777","in_reply_to":"4256b534_a89ea12a","updated":"2026-02-20 04:03:50.000000000","message":"\u003e The main idea is that local coeffs for l local parities are generated from only one global parity.\n\u003e No impact on current work, just offer the possibility to recover from g+1 errors\n\nI think I see the argument: as long as we\u0027ve got all the local parities, we should be able to combine them to create an extra global parity. I like it!\n\nWe\u0027re **not** implementing that yet, though, yeah? Just changing the encoding matrix so we give ourselves the opportunity for future improvement (without needing to add yet another backend for the new matrix-generation algo).\n\nFWIW, I [made an attempt at it](https://review.opendev.org/c/openstack/liberasurecode/+/977398) but seem to have only made things worse :-/","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"5b0516ec_aeed0027","in_reply_to":"95f1229b_5b80735b","updated":"2026-02-24 21:20:37.000000000","message":"Done","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"ec44162dbb3ceef4f51bee8a35c8897a555dcb08","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":19,"id":"95f1229b_5b80735b","in_reply_to":"972dcf75_d963b104","updated":"2026-02-23 10:44:19.000000000","message":"It is good, just some minor change but I see you combined lines in matrix and local parity as data . tested and was good!, I added a minor change to use this in case of g+1 errors only","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"7b775073ae1f1557bb21939dd1bfa4a877476f4f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":19,"id":"972dcf75_d963b104","in_reply_to":"d2059880_c0d40777","updated":"2026-02-23 08:47:32.000000000","message":"Right, this is the idea, and I think we could use this combination only when getting g+1 errors.\nIn order to work we need to combine coeffs to get one line and add local parity (xor them). But I think you got the idea.\n\nIt is not implemented it yet as we need to manage as particular case ( g+1 errors and local parity is not missing)\nYour implementation should work but it needs to read local parity fragments and xor them","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"8ee2a272aedc3f5572bbaec6f9b6c563ecf85bec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"d9df1f5c_67915563","updated":"2026-02-23 16:57:20.000000000","message":"I included your attempt and shows good result:\nhere without fix with g+1 errors:\n(gdb) run\nStarting program: /home/laitasso/code/erasure/liberasurecode/test/.libs/liberasurecode_rs_isal_stress_test 10 20 7 3 1000\n\ni\u003d 1 val\u003d1 i\u003d 5 val\u003d1 i\u003d 16 val\u003d1 i\u003d 20 val\u003d1 i\u003d 22 val\u003d1 skip\ni\u003d 4 val\u003d1 i\u003d 5 val\u003d1 i\u003d 6 val\u003d1 i\u003d 10 val\u003d1 i\u003d 12 val\u003d1 total decoding errors 2\n[Inferior 1 (process 42130) exited normally]\n\nWith your fix adapted:\nStarting program: /home/laitasso/code/erasure/liberasurecode/test/.libs/liberasurecode_rs_isal_stress_test 10 20 7 3 1000                               \nEnable debuginfod for this session? (y or [n]) total decoding errors 0\n[Inferior 1 (process 39031) exited normally]\n(gdb) q","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":24,"id":"f5279773_ef94db0b","in_reply_to":"6f740aa9_56aafa72","updated":"2026-02-24 21:20:37.000000000","message":"OK, latest patch seems much better -- no more corruption!\n\nI\u0027m liking your 20+7 (l\u003d3) case more and more. With this patch, I\u0027m seeing\n```\nUsing 20 data + 7 parity (of which 3 may be local) with 5 unavailable frags\nisa_l_rs_lrc combinations\u003d80730\nUsing 20 data + 7 parity (of which 3 may be local) with 6 unavailable frags\nisa_l_rs_lrc combinations\u003d296010, failures\u003d3036\nUsing 20 data + 7 parity (of which 3 may be local) with 7 unavailable frags\nisa_l_rs_lrc combinations\u003d888030, failures\u003d178522\n```\nwhich seems not bad. If I ditch the `total_missing` check (so, combine local parities whenever possible), looks like we can reduce decode failures by ~4% at 6 errors, though:\n```\nUsing 20 data + 7 parity (of which 3 may be local) with 5 unavailable frags\nisa_l_rs_lrc combinations\u003d80730\nUsing 20 data + 7 parity (of which 3 may be local) with 6 unavailable frags\nisa_l_rs_lrc combinations\u003d296010, failures\u003d2897\nUsing 20 data + 7 parity (of which 3 may be local) with 7 unavailable frags\nisa_l_rs_lrc combinations\u003d888030, failures\u003d178522\n```\nNot sure if that\u0027s worth the performance hit, though. I need to quantify that hit...","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"40c185ae10fa257cf244a095c23f2fcc02a0a703","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"f5a958da_81c68594","in_reply_to":"d9df1f5c_67915563","updated":"2026-02-23 19:03:12.000000000","message":"20 + 7! That\u0027s a good many frags! With patchset 2 of https://review.opendev.org/c/openstack/liberasurecode/+/977398 though, I\u0027m not seeing any failures:\n```\n$ pyeclib-backend verify --ec-type isa_l_rs_lrc -k 20 -m 7 -l 3 --unavailable 5\nUsing 20 data + 7 parity (of which 3 may be local) with 5 unavailable frags\nisa_l_rs_lrc combinations\u003d80730\n$ pyeclib-backend verify --ec-type isa_l_rs_lrc -k 20 -m 7 -l 3 --unavailable 5 --reconstruct\nUsing 20 data + 7 parity (of which 3 may be local) with 5 unavailable frags\nisa_l_rs_lrc combinations\u003d403650\n```\n(Though I *am* seeing some corruption (!!) in addition to some necessary failures:\n```\n$ pyeclib-backend verify --ec-type isa_l_rs_lrc -k 20 -m 7 -l 3 --unavailable 6\nUsing 20 data + 7 parity (of which 3 may be local) with 6 unavailable frags\nisa_l_rs_lrc combinations\u003d296010, failures\u003d1731, corrupt\u003d42414\n$ pyeclib-backend verify --ec-type isa_l_rs_lrc -k 20 -m 7 -l 3 --unavailable 6 --reconstruct\nUsing 20 data + 7 parity (of which 3 may be local) with 6 unavailable frags\nisa_l_rs_lrc combinations\u003d1776060, failures\u003d17015, corrupt\u003d632157\n```\n)\n\nPatchset 24 here, though, has *even more* failures **and** corruption:\n```\n$ pyeclib-backend verify --ec-type isa_l_rs_lrc -k 20 -m 7 -l 3 --unavailable 6\nUsing 20 data + 7 parity (of which 3 may be local) with 6 unavailable frags\nisa_l_rs_lrc combinations\u003d296010, failures\u003d1870, corrupt\u003d175410\n$ pyeclib-backend verify --ec-type isa_l_rs_lrc -k 20 -m 7 -l 3 --unavailable 6 --reconstruct\nUsing 20 data + 7 parity (of which 3 may be local) with 6 unavailable frags\nisa_l_rs_lrc combinations\u003d1776060, failures\u003d17682, corrupt\u003d1292506\n```\nbut is just as good when there\u0027s only the `g + 1` failures:\n```\n$ pyeclib-backend verify --ec-type isa_l_rs_lrc -k 20 -m 7 -l 3 --unavailable 5\nUsing 20 data + 7 parity (of which 3 may be local) with 5 unavailable frags\nisa_l_rs_lrc combinations\u003d80730\n$ pyeclib-backend verify --ec-type isa_l_rs_lrc -k 20 -m 7 -l 3 --unavailable 5 --reconstruct\nUsing 20 data + 7 parity (of which 3 may be local) with 5 unavailable frags\nisa_l_rs_lrc combinations\u003d403650\n```","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"300525482d74624736886942ca9430b86a372718","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":24,"id":"124bca52_3b1ecbf4","in_reply_to":"f5279773_ef94db0b","updated":"2026-02-25 13:29:48.000000000","message":"Acknowledged","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"b7b61a7726e7ae66fad331843d9372aba3bebfa1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":24,"id":"6f740aa9_56aafa72","in_reply_to":"f5a958da_81c68594","updated":"2026-02-24 09:49:09.000000000","message":"Your patch is great, thanks for implementation it is what I have in mind.\nI did tests with and without your patch to check that it is ok for g+1 errors .\nSo your patch is fine, failures I show is before inserting combination of local parities where for some configs we were unable to decode in case of g + 1 errors.\n\nWe should promise g + 1 errors but with such perf drawback.\nAn application is for example an LRC(60, 3, 3)  with 1.1 overhead, 4 errors correction capabilities and reconstruction using only 1/3 data in case of one failure.","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"78d54815_030def57","updated":"2026-02-24 21:20:37.000000000","message":"Mostly resolving some comments, but this is looking better and better. I think I might be happy merging this at this point, though?\n\nWhile I\u0027m mulling it over a little more, WDYT about enforcing code style? I [put up a patch](https://review.opendev.org/c/openstack/liberasurecode/+/977488), but\n\n1. it seems like `clang-format` output varies pretty frequently from version to version, and\n2. it [required a **lot** of churn](https://review.opendev.org/c/openstack/liberasurecode/+/977487).\n\nI tried to make sure that any [failures would make it fairly obvious what should change](https://zuul.opendev.org/t/openstack/build/41f7c28a63a34ffd9ea98089df654ab6), though.","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"69756579fd094fa11fcb801b1b34547cea29e0bc","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":25,"id":"29cdd957_259a806d","updated":"2026-02-24 16:23:30.000000000","message":"This PR should be updated https://review.opendev.org/c/openstack/liberasurecode/+/635604 to handle more fragments","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"300525482d74624736886942ca9430b86a372718","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":25,"id":"a4d914ad_52706eaa","in_reply_to":"157045e9_18704023","updated":"2026-02-25 13:29:48.000000000","message":"I had in mind some high values :\nLRC(30,6,3) with overhead ration 1.2  to begin then \nLRC(60,6,3) has an overhead of 1.1\nThen if number of connections allow it to go beyond LRC(120,6,3) with ratio 1.05","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":25,"id":"157045e9_18704023","in_reply_to":"29cdd957_259a806d","updated":"2026-02-24 21:20:37.000000000","message":"How many fragments are you looking to be able to handle? I think we could move to an `EC_MAX_FRAGMENTS` of 64 relatively easily, but if you\u0027re interested in more than that... maybe it\u0027s better we take that on sooner rather than later.\n\nAt the same time, managing hundreds of connections seems like a lot... I remember that was one of my big concerns about the quadiron patches...","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e4571f0afd744abadcb6017305aa782ad8a7aede","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"b2609257_5097d227","in_reply_to":"3117fdd1_f6def259","updated":"2026-03-02 23:59:24.000000000","message":"I think you already saw, but https://review.opendev.org/c/openstack/liberasurecode/+/978142 seems promising to support more frags. Should leave us in a reasonable spot to go even higher than 256 total frags if we want.","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"5356363a97d79840ef2bcc3598c3e50fd5802a29","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":25,"id":"932a2154_592570e4","in_reply_to":"3117fdd1_f6def259","updated":"2026-02-28 11:48:52.000000000","message":"for example apple store uses LRC(20, 4, 2)","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"300525482d74624736886942ca9430b86a372718","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"ee00499e_83cd305e","in_reply_to":"78d54815_030def57","updated":"2026-02-25 13:29:48.000000000","message":"Thanks for supporting ,challenging this. hope pushing for some industry usage for this.","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b796f0edf55a9235bb69093ea7fe49b07d24bfb2","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":25,"id":"3117fdd1_f6def259","in_reply_to":"a4d914ad_52706eaa","updated":"2026-02-27 05:40:30.000000000","message":"*All* of which we can\u0027t currently support, got it. ;-)","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e4571f0afd744abadcb6017305aa782ad8a7aede","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"ad6728c0_3eca5502","updated":"2026-03-02 23:59:24.000000000","message":"I\u0027ve got an idea for a fresh commit message; see what you think.","commit_id":"39b55ecd7e21156cdd067d9ff25a4fe8530dda96"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"a7e1a5fae3f5b242deb6f28733cc12ab750aac8a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"3092e595_a9d0a662","in_reply_to":"ad6728c0_3eca5502","updated":"2026-03-03 08:24:32.000000000","message":"Good, it is better in commit message\nSome months we will forget the order and which parity is associated to which  group","commit_id":"39b55ecd7e21156cdd067d9ff25a4fe8530dda96"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c7acb29fcf6253aacb08305d96068eb3c2bbeccf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"ca9e4617_f1cd9537","updated":"2026-03-05 20:49:09.000000000","message":"I\u0027ll see if I can nerd-snipe someone else into taking a look at this, too, but LGTM. Great work!","commit_id":"48c05f9da102f13e72aa882601579319b9248549"}],"doc/erasure_coding.md":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b796f0edf55a9235bb69093ea7fe49b07d24bfb2","unresolved":true,"context_lines":[{"line_number":110,"context_line":""},{"line_number":111,"context_line":"  Uses the Reed-Solomon functions provided by isa-l with an encoding matrix"},{"line_number":112,"context_line":"  provided by liberasurecode.  Similar to `isa_l_rs_vand_inv`, but adds a new"},{"line_number":113,"context_line":"  parameter `l` for the number of \"local parities\". To construct the encoding"},{"line_number":114,"context_line":"  matrix, start with an `isa_l_rs_vand_inv` encoding matrix. The first `m - l`"},{"line_number":115,"context_line":"  parity columns are left as \"global parities\". The last `l` columns are each"},{"line_number":116,"context_line":"  assigned a group of `⌊k / l⌋` or `⌈k / l⌉` data fragments; within each"},{"line_number":117,"context_line":"  column, the rows corresponding to those data fragments are retained and all"}],"source_content_type":"text/x-markdown","patch_set":25,"id":"e3246ec2_1881b7cd","line":114,"range":{"start_line":113,"start_character":52,"end_line":114,"end_character":8},"updated":"2026-02-27 05:40:30.000000000","message":"We should maybe update this to clarify that the local parities are all crafted from the \"next\" global parity...","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"}],"include/erasurecode/erasurecode.h":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"296c590038959427c4d8f826cc4ef62acfb39d4e","unresolved":true,"context_lines":[{"line_number":74,"context_line":"struct ec_args {"},{"line_number":75,"context_line":"    int k;                  /* number of data fragments */"},{"line_number":76,"context_line":"    int m;                  /* number of parity fragments */"},{"line_number":77,"context_line":"    int l;                  /* number of local parities */"},{"line_number":78,"context_line":"    int w;                  /* word size, in bits (optional) */"},{"line_number":79,"context_line":"    int hd;                 /* hamming distance (\u003dm for Reed-Solomon) */"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":1,"id":"b363ddaa_9b06e6bf","line":77,"updated":"2025-09-03 19:37:02.000000000","message":"Hmm... so today, one could compile the PyECLib C extension against liberasurecode 1.5.0, but then *run* it with liberasurecode 1.7.1 and most everything would work, right?\n\nBut with this change, you\u0027d need to recompile the C extension or else the flat-xor codes won\u0027t work, since they\u0027ll have an outdated offset for `ec_args.hd` -- and of course, we can\u0027t expect to be able to build against this but run with something older... sounds like a pretty solid compatibility break.\n\nI wonder if we could use `priv_args1`; maybe update it to something like\n```\n    union {\n        struct {\n            uint64_t arg1;  /* sample arg */\n        } null_args;        /* args specific to the null codes */\n        struct {\n            int l;          /* number of local parities */\n        } lrc_args;        /* args specific to locally recoverable codes */\n        struct {\n            uint64_t x, y;  /* reserved for future expansion */\n            uint64_t z, a;  /* reserved for future expansion */\n        } reserved;\n    } priv_args1;\n```\n?","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"e0ecf85209ee7f70949c36ffbf2bae1a72f88301","unresolved":false,"context_lines":[{"line_number":74,"context_line":"struct ec_args {"},{"line_number":75,"context_line":"    int k;                  /* number of data fragments */"},{"line_number":76,"context_line":"    int m;                  /* number of parity fragments */"},{"line_number":77,"context_line":"    int l;                  /* number of local parities */"},{"line_number":78,"context_line":"    int w;                  /* word size, in bits (optional) */"},{"line_number":79,"context_line":"    int hd;                 /* hamming distance (\u003dm for Reed-Solomon) */"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":1,"id":"f3296341_8f260a52","line":77,"in_reply_to":"068368be_094e9a8e","updated":"2025-09-10 15:43:22.000000000","message":"Done","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"1079b97211b781a5779c7e51255f757bc538f34e","unresolved":true,"context_lines":[{"line_number":74,"context_line":"struct ec_args {"},{"line_number":75,"context_line":"    int k;                  /* number of data fragments */"},{"line_number":76,"context_line":"    int m;                  /* number of parity fragments */"},{"line_number":77,"context_line":"    int l;                  /* number of local parities */"},{"line_number":78,"context_line":"    int w;                  /* word size, in bits (optional) */"},{"line_number":79,"context_line":"    int hd;                 /* hamming distance (\u003dm for Reed-Solomon) */"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":1,"id":"068368be_094e9a8e","line":77,"in_reply_to":"b363ddaa_9b06e6bf","updated":"2025-09-10 08:29:53.000000000","message":"Ok I will do, right I should use some other struct for local_parity\nI am preparing a new version where we use less data to decode from local parity.\nfirst target is somthing that works then we organise code better etc","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"}],"include/erasurecode/erasurecode_preprocessing.h":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"246d995adce671419efc8ec5296ae0ff62b21447","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        int *orig_size, int *fragment_payload_size, int fragment_size,"},{"line_number":46,"context_line":"        uint64_t *realloc_bm);"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"int get_fragment_partition("},{"line_number":49,"context_line":"        int k, int m, int local_parity,"},{"line_number":50,"context_line":"        char **fragments, int num_fragments,"},{"line_number":51,"context_line":"        char **data, char **parity,"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"58ce4f5d_3d453ef3","line":48,"updated":"2025-10-21 16:54:09.000000000","message":"I\u0027m worried about us changing this signature since it\u0027s an exported symbol... I\u0027m also trying to remember the extent to which it *needs* to be an exported symbol, though.\n\nWhat does `local_parity` end up meaning for this non-LRC version? Will it always be zero?","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        int *orig_size, int *fragment_payload_size, int fragment_size,"},{"line_number":46,"context_line":"        uint64_t *realloc_bm);"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"int get_fragment_partition("},{"line_number":49,"context_line":"        int k, int m, int local_parity,"},{"line_number":50,"context_line":"        char **fragments, int num_fragments,"},{"line_number":51,"context_line":"        char **data, char **parity,"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"fb837456_4ccf9c57","line":48,"in_reply_to":"58ce4f5d_3d453ef3","updated":"2025-11-05 23:12:44.000000000","message":"Backed out.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b7bd2f79ea10b60d88715b26e090ca6dcd9d1147","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        int *orig_size, int *fragment_payload_size, int fragment_size,"},{"line_number":46,"context_line":"        uint64_t *realloc_bm);"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"int get_fragment_partition("},{"line_number":49,"context_line":"        int k, int m, int local_parity,"},{"line_number":50,"context_line":"        char **fragments, int num_fragments,"},{"line_number":51,"context_line":"        char **data, char **parity,"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"691e22d5_ea981351","line":48,"in_reply_to":"fb837456_4ccf9c57","updated":"2025-11-28 03:13:56.000000000","message":"\u003e I\u0027m also trying to remember the extent to which it *needs* to be an exported symbol, though.\n\nSeems like it\u0027s only needed for tests. Put up https://review.opendev.org/c/openstack/liberasurecode/+/968760 as an idea; I think with that, most of the erasurecode.c and all of the erasurecode_preprocessing.c changes will be unnecessary -- until we fix up reconstruct, anyway.\n\nNow I kinda want to follow that up to address the TODO that it references. That should leave us with an obvious new function to implement when we want to relax the rules on whether a given set of frags is sufficient to reconstruct....","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"}],"include/isa_l/isa_l_common.h":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"296c590038959427c4d8f826cc4ef62acfb39d4e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    unsigned char *encode_tables;"},{"line_number":56,"context_line":"    int k;"},{"line_number":57,"context_line":"    int m;"},{"line_number":58,"context_line":"    int l; //local parities"},{"line_number":59,"context_line":"    int w;"},{"line_number":60,"context_line":"} isa_l_descriptor;"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":1,"id":"893fe10a_22eb26af","line":58,"updated":"2025-09-03 19:37:02.000000000","message":"I\u0027m less worried about this; this shouldn\u0027t really get referenced outside of liberasurecode.","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"}],"src/backends/isa-l/isa_l_common.c":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"296c590038959427c4d8f826cc4ef62acfb39d4e","unresolved":true,"context_lines":[{"line_number":91,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"},{"line_number":92,"context_line":"    int global_parity \u003d m - local_parity; "},{"line_number":93,"context_line":"    int group_size \u003d (int)(k / local_parity);"},{"line_number":94,"context_line":"    int *use_parity \u003d calloc(local_parity, sizeof(int) );"},{"line_number":95,"context_line":"    printf(\"\\n\");"},{"line_number":96,"context_line":"    for (int u \u003d0; u \u003c k; u++) {"},{"line_number":97,"context_line":"        uint64_t pos \u003d ((1 \u003c\u003c u) \u0026 missing_bm);"}],"source_content_type":"text/x-csrc","patch_set":1,"id":"ec8a4326_67ea2037","line":94,"updated":"2025-09-03 19:37:02.000000000","message":"Never freed (nor checked to ensure it succeeded)","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"e0ecf85209ee7f70949c36ffbf2bae1a72f88301","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"},{"line_number":92,"context_line":"    int global_parity \u003d m - local_parity; "},{"line_number":93,"context_line":"    int group_size \u003d (int)(k / local_parity);"},{"line_number":94,"context_line":"    int *use_parity \u003d calloc(local_parity, sizeof(int) );"},{"line_number":95,"context_line":"    printf(\"\\n\");"},{"line_number":96,"context_line":"    for (int u \u003d0; u \u003c k; u++) {"},{"line_number":97,"context_line":"        uint64_t pos \u003d ((1 \u003c\u003c u) \u0026 missing_bm);"}],"source_content_type":"text/x-csrc","patch_set":1,"id":"3fe22452_3cb26200","line":94,"in_reply_to":"d40387e0_5e728ddf","updated":"2025-09-10 15:43:22.000000000","message":"Done","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"1079b97211b781a5779c7e51255f757bc538f34e","unresolved":true,"context_lines":[{"line_number":91,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"},{"line_number":92,"context_line":"    int global_parity \u003d m - local_parity; "},{"line_number":93,"context_line":"    int group_size \u003d (int)(k / local_parity);"},{"line_number":94,"context_line":"    int *use_parity \u003d calloc(local_parity, sizeof(int) );"},{"line_number":95,"context_line":"    printf(\"\\n\");"},{"line_number":96,"context_line":"    for (int u \u003d0; u \u003c k; u++) {"},{"line_number":97,"context_line":"        uint64_t pos \u003d ((1 \u003c\u003c u) \u0026 missing_bm);"}],"source_content_type":"text/x-csrc","patch_set":1,"id":"d40387e0_5e728ddf","line":94,"in_reply_to":"ec8a4326_67ea2037","updated":"2025-09-10 08:29:53.000000000","message":"Yes ,some allocated not freed but was I aware of some cleaning to do","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"296c590038959427c4d8f826cc4ef62acfb39d4e","unresolved":true,"context_lines":[{"line_number":445,"context_line":"    int num_missing_elements \u003d get_num_missing_elements(missing_idxs);"},{"line_number":446,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"    int *used_idxs \u003d calloc(n, sizeof(int));"},{"line_number":449,"context_line":"    decode_matrix \u003d isa_l_lrc_get_decode_matrix(k, m, local_parity, isa_l_desc-\u003ematrix, missing_idxs, used_idxs);"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    if (NULL \u003d\u003d decode_matrix) {"}],"source_content_type":"text/x-csrc","patch_set":1,"id":"da331ccf_6c46d9da","line":448,"updated":"2025-09-03 19:37:02.000000000","message":"Never freed (nor checked to ensure it succeeded)","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"88b9790260ae631437440da49051a07ac80b5adb","unresolved":false,"context_lines":[{"line_number":445,"context_line":"    int num_missing_elements \u003d get_num_missing_elements(missing_idxs);"},{"line_number":446,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"},{"line_number":447,"context_line":""},{"line_number":448,"context_line":"    int *used_idxs \u003d calloc(n, sizeof(int));"},{"line_number":449,"context_line":"    decode_matrix \u003d isa_l_lrc_get_decode_matrix(k, m, local_parity, isa_l_desc-\u003ematrix, missing_idxs, used_idxs);"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    if (NULL \u003d\u003d decode_matrix) {"}],"source_content_type":"text/x-csrc","patch_set":1,"id":"525f4bb7_50ff2dc3","line":448,"in_reply_to":"da331ccf_6c46d9da","updated":"2025-09-19 07:09:17.000000000","message":"Done","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"296c590038959427c4d8f826cc4ef62acfb39d4e","unresolved":true,"context_lines":[{"line_number":674,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"},{"line_number":675,"context_line":"    int inverse_row \u003d -1;"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"    int *used_idxs \u003d calloc(n, sizeof(int));"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"    /**"},{"line_number":680,"context_line":"     * Get available elements and compute the inverse of their"}],"source_content_type":"text/x-csrc","patch_set":1,"id":"2677544a_693a8e03","line":677,"updated":"2025-09-03 19:37:02.000000000","message":"Also never freed nor checked.","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"88b9790260ae631437440da49051a07ac80b5adb","unresolved":false,"context_lines":[{"line_number":674,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"},{"line_number":675,"context_line":"    int inverse_row \u003d -1;"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"    int *used_idxs \u003d calloc(n, sizeof(int));"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"    /**"},{"line_number":680,"context_line":"     * Get available elements and compute the inverse of their"}],"source_content_type":"text/x-csrc","patch_set":1,"id":"cf29bfd0_5a4f1f51","line":677,"in_reply_to":"2677544a_693a8e03","updated":"2025-09-19 07:09:17.000000000","message":"Done","commit_id":"cd253f6c1a4e3c050286e8788b07ad07c49d0aa2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"78a0823f1143da45aef5b42e1cab0e2f816eb95d","unresolved":true,"context_lines":[{"line_number":157,"context_line":"        }"},{"line_number":158,"context_line":"    }"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    if (total_missed \u003d\u003d 1 \u0026\u0026 (missed_pos \u003c k  ||missed_pos \u003e\u003d  k + global_parity)) {"},{"line_number":161,"context_line":"        if (missed_pos \u003c k) {"},{"line_number":162,"context_line":"            for(int u \u003d 0; u \u003c local_parity; u++) {"},{"line_number":163,"context_line":"                if (count_parity[u]) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"01f1502f_0d9b5afa","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":29},"updated":"2025-11-06 01:13:41.000000000","message":"So if `destination_idx` is one of the data, but we have its local parity and all other local data, but *don\u0027t* have any global parity (or, for that matter, any of the non-local data), we miss the optimization?","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"3dfdf33229c5536d322b0108b04ad645563a894d","unresolved":true,"context_lines":[{"line_number":157,"context_line":"        }"},{"line_number":158,"context_line":"    }"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    if (total_missed \u003d\u003d 1 \u0026\u0026 (missed_pos \u003c k  ||missed_pos \u003e\u003d  k + global_parity)) {"},{"line_number":161,"context_line":"        if (missed_pos \u003c k) {"},{"line_number":162,"context_line":"            for(int u \u003d 0; u \u003c local_parity; u++) {"},{"line_number":163,"context_line":"                if (count_parity[u]) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"20390b48_d5a814fb","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":29},"in_reply_to":"01f1502f_0d9b5afa","updated":"2025-11-10 11:40:20.000000000","message":"Need some optmisation here, I went to simple case to how idea but good catch. we can optimise this. \n.","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":157,"context_line":"        }"},{"line_number":158,"context_line":"    }"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    if (total_missed \u003d\u003d 1 \u0026\u0026 (missed_pos \u003c k  ||missed_pos \u003e\u003d  k + global_parity)) {"},{"line_number":161,"context_line":"        if (missed_pos \u003c k) {"},{"line_number":162,"context_line":"            for(int u \u003d 0; u \u003c local_parity; u++) {"},{"line_number":163,"context_line":"                if (count_parity[u]) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"cbeebf18_00970788","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":29},"in_reply_to":"048298ed_24673935","updated":"2025-11-27 18:45:05.000000000","message":"I think we can always do it in one step, for both decode and reconstruct. Logic looks kinda like:\n\n### Decode\nWe always need `k` frags no matter what -- but, we might have `k` frags without all of them being *useful*. Fortunately the utility is only a question for local parities. So:\n\n* Start by including as much data as possible. If all `k` data present, we\u0027re done.\n* Continue to include as many global parity as possible until we get to `k` frags. If we get there, we\u0027re done.\n* Finally, start considering available local parities. For each, check whether we\u0027re missing *exactly one* data frag from the local group. If so, include it -- otherwise, it\u0027s either repeating information from the other data frags (which are all present), or doesn\u0027t provide enough information to counter the loss of data frags (of which there were multiple). Again, once we get to `k` we\u0027re done.\n* If we get through all that and still don\u0027t have `k` frags, we can\u0027t decode -- `EINSUFFFRAGS`\n\n### Reconstruct\nNow there\u0027s a chance we can get away with just `k / l` (or possibly `k / l + 1`) frags instead of `k`. So:\n\n* If we\u0027re reconstructing a data frag or a local parity frag *and* it\u0027s the one and only frag missing in the local group, go for the local rebuild.\n* Otherwise, we need `k` fragments again; pick them like we did for decode.","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"5b31fd6cb526b93b06ef4f511d90cbadf0c4b071","unresolved":true,"context_lines":[{"line_number":157,"context_line":"        }"},{"line_number":158,"context_line":"    }"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    if (total_missed \u003d\u003d 1 \u0026\u0026 (missed_pos \u003c k  ||missed_pos \u003e\u003d  k + global_parity)) {"},{"line_number":161,"context_line":"        if (missed_pos \u003c k) {"},{"line_number":162,"context_line":"            for(int u \u003d 0; u \u003c local_parity; u++) {"},{"line_number":163,"context_line":"                if (count_parity[u]) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"048298ed_24673935","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":29},"in_reply_to":"20390b48_d5a814fb","updated":"2025-11-18 14:40:24.000000000","message":"I made the assumption that reconstruction could be done in several steps, at high level we will know if one local data is missing...\nBut we could build some generic reconstruction.\n\nOne possible scenarios I need to handle : one missing data in first group and more in second group.\nHere we could reconstruct in one step( reconstruct all) or in 2 steps ( first reconstruct for first group  then apply reconstruction for second group)","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        }"},{"line_number":158,"context_line":"    }"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    if (total_missed \u003d\u003d 1 \u0026\u0026 (missed_pos \u003c k  ||missed_pos \u003e\u003d  k + global_parity)) {"},{"line_number":161,"context_line":"        if (missed_pos \u003c k) {"},{"line_number":162,"context_line":"            for(int u \u003d 0; u \u003c local_parity; u++) {"},{"line_number":163,"context_line":"                if (count_parity[u]) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"62a69dd7_30435d63","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":29},"in_reply_to":"c2f8ee1f_098e7ae7","updated":"2026-02-24 21:20:37.000000000","message":"I think we can mark this resolved now.","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"041757128a8a0b44603fd45abe1cbf0030bd4fbb","unresolved":true,"context_lines":[{"line_number":157,"context_line":"        }"},{"line_number":158,"context_line":"    }"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    if (total_missed \u003d\u003d 1 \u0026\u0026 (missed_pos \u003c k  ||missed_pos \u003e\u003d  k + global_parity)) {"},{"line_number":161,"context_line":"        if (missed_pos \u003c k) {"},{"line_number":162,"context_line":"            for(int u \u003d 0; u \u003c local_parity; u++) {"},{"line_number":163,"context_line":"                if (count_parity[u]) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"c2f8ee1f_098e7ae7","line":160,"range":{"start_line":160,"start_character":8,"end_line":160,"end_character":29},"in_reply_to":"cbeebf18_00970788","updated":"2025-12-04 08:43:55.000000000","message":"Ok I agree, for decoding this is what id done, I am a lillte lazy sometiemes","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ce3e24148befcb10a99a4b28c20a5bbdcdfd2e6b","unresolved":true,"context_lines":[{"line_number":209,"context_line":"            matrix_size \u003d max_range - min_range;"},{"line_number":210,"context_line":"            decode_matrix \u003d malloc(sizeof(unsigned char) * matrix_size * matrix_size);"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"            for (int id \u003d min_range; id \u003c max_range; id++) {"},{"line_number":213,"context_line":"                for (j \u003d min_range; j \u003c max_range; j++) {"},{"line_number":214,"context_line":"                    decode_matrix[(matrix_size * i) + j-min_range] \u003d encode_matrix[(k * id) + j];"},{"line_number":215,"context_line":"                }"}],"source_content_type":"text/x-csrc","patch_set":9,"id":"6dd9f6d8_00ebb97e","line":212,"updated":"2025-11-13 17:24:51.000000000","message":"Here we\u0027re always creating the identity matrix, right? Would it be better as just\n```\n            memset(decode_matrix, 0, matrix_size * matrix_size);\n            for (i \u003d 0; i \u003c matrix_size; i++) {\n                decode_matrix[matrix_size * i + i] \u003d 1;\n                used_idxs[min_range + i] \u003d 1;\n            }\n```\n?","commit_id":"642dac1086f0ccf9c05775c45e61b4a3f34dbc34"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":false,"context_lines":[{"line_number":209,"context_line":"            matrix_size \u003d max_range - min_range;"},{"line_number":210,"context_line":"            decode_matrix \u003d malloc(sizeof(unsigned char) * matrix_size * matrix_size);"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"            for (int id \u003d min_range; id \u003c max_range; id++) {"},{"line_number":213,"context_line":"                for (j \u003d min_range; j \u003c max_range; j++) {"},{"line_number":214,"context_line":"                    decode_matrix[(matrix_size * i) + j-min_range] \u003d encode_matrix[(k * id) + j];"},{"line_number":215,"context_line":"                }"}],"source_content_type":"text/x-csrc","patch_set":9,"id":"c2df60a1_0caa6639","line":212,"in_reply_to":"6dd9f6d8_00ebb97e","updated":"2026-01-31 18:04:27.000000000","message":"Acknowledged","commit_id":"642dac1086f0ccf9c05775c45e61b4a3f34dbc34"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ce3e24148befcb10a99a4b28c20a5bbdcdfd2e6b","unresolved":true,"context_lines":[{"line_number":248,"context_line":"    *max_col \u003d max_range;"},{"line_number":249,"context_line":"    *mx_size \u003d matrix_size;"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    if (i !\u003d matrix_size) {"},{"line_number":252,"context_line":"        free(decode_matrix);"},{"line_number":253,"context_line":"        decode_matrix \u003d NULL;"},{"line_number":254,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":9,"id":"6054c042_07e70957","line":251,"updated":"2025-11-13 17:24:51.000000000","message":"This check feels a little funny to me -- when would we ever hit it?\n\nFWIW, *I\u0027ve* mainly hit it when trying to rewrite things and not realizing that `i` is a significant variable later...","commit_id":"642dac1086f0ccf9c05775c45e61b4a3f34dbc34"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":false,"context_lines":[{"line_number":248,"context_line":"    *max_col \u003d max_range;"},{"line_number":249,"context_line":"    *mx_size \u003d matrix_size;"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"    if (i !\u003d matrix_size) {"},{"line_number":252,"context_line":"        free(decode_matrix);"},{"line_number":253,"context_line":"        decode_matrix \u003d NULL;"},{"line_number":254,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":9,"id":"62e90bc9_1a8f65df","line":251,"in_reply_to":"6054c042_07e70957","updated":"2026-01-31 18:04:27.000000000","message":"Acknowledged","commit_id":"642dac1086f0ccf9c05775c45e61b4a3f34dbc34"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":206,"context_line":"        while (i \u003c k \u0026\u0026 locate \u003c n) {"},{"line_number":207,"context_line":"            if (((1 \u003c\u003c locate) \u0026 missing_bm) \u003d\u003d 0) {"},{"line_number":208,"context_line":"                if (locate \u003e\u003d (k +global_parity)) {"},{"line_number":209,"context_line":"                    if (count_parity[locate-k -global_parity]) {"},{"line_number":210,"context_line":"                        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":211,"context_line":"                            decode_matrix[(k * i) + j] \u003d encode_matrix[(k * locate) + j];"},{"line_number":212,"context_line":"                        }"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"2f07b7ef_324d6c22","line":209,"updated":"2025-11-27 18:45:05.000000000","message":"Sanity checking my own understanding: this just checks that there\u0027s *at least one* missing data in the local parity\u0027s group, not that there\u0027s *exactly one*, right? And if there\u0027s *more* than one, the matrix won\u0027t be invertible -- yeah?\n\nConversely, if there aren\u0027t *any* missing data in the group, the matrix still won\u0027t be invertible, but this time because the local parity doesn\u0027t add any new information -- the local data already cover it.\n\nBut that\u0027s OK, because we still have the inversion-succeeded check in `isa_l_lrc_reconstruct` at L797.","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[{"line_number":206,"context_line":"        while (i \u003c k \u0026\u0026 locate \u003c n) {"},{"line_number":207,"context_line":"            if (((1 \u003c\u003c locate) \u0026 missing_bm) \u003d\u003d 0) {"},{"line_number":208,"context_line":"                if (locate \u003e\u003d (k +global_parity)) {"},{"line_number":209,"context_line":"                    if (count_parity[locate-k -global_parity]) {"},{"line_number":210,"context_line":"                        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":211,"context_line":"                            decode_matrix[(k * i) + j] \u003d encode_matrix[(k * locate) + j];"},{"line_number":212,"context_line":"                        }"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"b81e4429_0157fc5b","line":209,"in_reply_to":"2f07b7ef_324d6c22","updated":"2026-02-24 21:20:37.000000000","message":"Acknowledged","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":336,"context_line":"    return inverse_rows;"},{"line_number":337,"context_line":"}"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"static unsigned char* get_lrc_inverse_rows(int k,"},{"line_number":340,"context_line":"                                       int m,"},{"line_number":341,"context_line":"                                       int min_range,"},{"line_number":342,"context_line":"                                       int max_range,"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"56c08057_b3110692","line":339,"updated":"2025-11-27 18:45:05.000000000","message":"OK, this guy seems maybe tricky. It needs to find the *relevant* inverse rows, given `min_range` and `max_range`, but *sometimes* those rows come from `decode_matrix` and sometimes they\u0027re *derived from* `encode_matrix`, which itself could *either* be the relevant local matrix or the full-on encode matrix...\n\nI feel like maybe instead of the `missing_idxs`, maybe we want `missing_bm`, except maybe updated when coming by way of `isa_l_lrc_get_reconstruct_matrix` to ensure when we\u0027re doing local-only reconstruction that everyone non-local is flagged as \"present\"....","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"041757128a8a0b44603fd45abe1cbf0030bd4fbb","unresolved":true,"context_lines":[{"line_number":336,"context_line":"    return inverse_rows;"},{"line_number":337,"context_line":"}"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"static unsigned char* get_lrc_inverse_rows(int k,"},{"line_number":340,"context_line":"                                       int m,"},{"line_number":341,"context_line":"                                       int min_range,"},{"line_number":342,"context_line":"                                       int max_range,"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"12043be3_e162c923","line":339,"in_reply_to":"56c08057_b3110692","updated":"2025-12-04 08:43:55.000000000","message":"Sometimes we need to compute parity and sometimes ne wee need to recover data: in first case we need encoding matrix and in second case we need the decode matrix (inverse of encoding if I remember)\n\nI will do a pass again to check decoding, local reconstruction etc.","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":344,"context_line":"                                       unsigned char *decode_inverse,"},{"line_number":345,"context_line":"                                       unsigned char* encode_matrix,"},{"line_number":346,"context_line":"                                       int *missing_idxs,"},{"line_number":347,"context_line":"                                       int * used_ids,"},{"line_number":348,"context_line":"                                       gf_mul_func gf_mul)"},{"line_number":349,"context_line":"{"},{"line_number":350,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"3e701823_3a276ef6","line":347,"updated":"2025-11-27 18:45:05.000000000","message":"Unused","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":false,"context_lines":[{"line_number":344,"context_line":"                                       unsigned char *decode_inverse,"},{"line_number":345,"context_line":"                                       unsigned char* encode_matrix,"},{"line_number":346,"context_line":"                                       int *missing_idxs,"},{"line_number":347,"context_line":"                                       int * used_ids,"},{"line_number":348,"context_line":"                                       gf_mul_func gf_mul)"},{"line_number":349,"context_line":"{"},{"line_number":350,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"f6ab1d7a_260411d6","line":347,"in_reply_to":"3e701823_3a276ef6","updated":"2026-01-31 18:04:27.000000000","message":"Done","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":370,"context_line":"     * Fill in rows for missing data"},{"line_number":371,"context_line":"     */"},{"line_number":372,"context_line":"    for (i \u003d 0; i \u003c matrix_size; i++) {"},{"line_number":373,"context_line":"        if ((1 \u003c\u003c i) \u0026 (missing_bm\u003e\u003emin_range)) {"},{"line_number":374,"context_line":"            for (j \u003d 0; j \u003c matrix_size; j++) {"},{"line_number":375,"context_line":"                inverse_rows[(l * matrix_size) + j] \u003d decode_inverse[(i * matrix_size) + j];"},{"line_number":376,"context_line":"            }"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"7712a550_a16021b0","line":373,"updated":"2025-11-27 18:45:05.000000000","message":"OK, so this makes sure we respect `min_range` -- what about `max_range`?","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b796f0edf55a9235bb69093ea7fe49b07d24bfb2","unresolved":false,"context_lines":[{"line_number":370,"context_line":"     * Fill in rows for missing data"},{"line_number":371,"context_line":"     */"},{"line_number":372,"context_line":"    for (i \u003d 0; i \u003c matrix_size; i++) {"},{"line_number":373,"context_line":"        if ((1 \u003c\u003c i) \u0026 (missing_bm\u003e\u003emin_range)) {"},{"line_number":374,"context_line":"            for (j \u003d 0; j \u003c matrix_size; j++) {"},{"line_number":375,"context_line":"                inverse_rows[(l * matrix_size) + j] \u003d decode_inverse[(i * matrix_size) + j];"},{"line_number":376,"context_line":"            }"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"f9cb7ed5_e2aeda7f","line":373,"in_reply_to":"7712a550_a16021b0","updated":"2026-02-27 05:40:30.000000000","message":"Oh, right -- by definition -- we\u0027re looping through `matrix_size`, which is `max_range - min_range`","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":399,"context_line":"            int d_idx_unavail \u003d 0;"},{"line_number":400,"context_line":"            for (j \u003d min_range; j \u003c max_range; j++) {"},{"line_number":401,"context_line":"                // This data is available, so we can use the encode matrix"},{"line_number":402,"context_line":"                if (((1 \u003c\u003c j) \u0026 (missing_bm)) \u003d\u003d 0) {"},{"line_number":403,"context_line":"                    inverse_rows[(l * matrix_size) + d_idx_avail] ^\u003d encode_matrix[(i * encode_matrix_size) + j];"},{"line_number":404,"context_line":"                    d_idx_avail++;"},{"line_number":405,"context_line":"                } else {"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"ca389553_c16d256e","line":402,"updated":"2025-11-27 18:45:05.000000000","message":"This doesn\u0027t need any further shifting/checking with `min_range`/`max_range`? Feels weird that we do it above when filling in for the missing data, but not here...","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b796f0edf55a9235bb69093ea7fe49b07d24bfb2","unresolved":false,"context_lines":[{"line_number":399,"context_line":"            int d_idx_unavail \u003d 0;"},{"line_number":400,"context_line":"            for (j \u003d min_range; j \u003c max_range; j++) {"},{"line_number":401,"context_line":"                // This data is available, so we can use the encode matrix"},{"line_number":402,"context_line":"                if (((1 \u003c\u003c j) \u0026 (missing_bm)) \u003d\u003d 0) {"},{"line_number":403,"context_line":"                    inverse_rows[(l * matrix_size) + d_idx_avail] ^\u003d encode_matrix[(i * encode_matrix_size) + j];"},{"line_number":404,"context_line":"                    d_idx_avail++;"},{"line_number":405,"context_line":"                } else {"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"c3067b17_0462ff55","line":402,"in_reply_to":"ca389553_c16d256e","updated":"2026-02-27 05:40:30.000000000","message":"Difference is that we\u0027re working with `decode_inverse` above, but `encode_matrix` here -- so once needs shifting, the other doesn\u0027t.","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":545,"context_line":"    int num_missing_elements \u003d get_num_missing_elements(missing_idxs);"},{"line_number":546,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    int *used_idxs \u003d calloc(n, sizeof(int));"},{"line_number":549,"context_line":"    if(NULL \u003d\u003d used_idxs) {"},{"line_number":550,"context_line":"        goto out;"},{"line_number":551,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"a6580a8b_9c9a5e40","line":548,"updated":"2025-11-27 18:45:05.000000000","message":"This would be better as an `uint64_t` bitmap like `missing_bm`. Smaller allocation, and we don\u0027t have to include any code in case `calloc` fails.\n\nOh, I see -- it was cribbed from `get_inverse_rows`. Still, might be worth doing.","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b796f0edf55a9235bb69093ea7fe49b07d24bfb2","unresolved":false,"context_lines":[{"line_number":545,"context_line":"    int num_missing_elements \u003d get_num_missing_elements(missing_idxs);"},{"line_number":546,"context_line":"    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"    int *used_idxs \u003d calloc(n, sizeof(int));"},{"line_number":549,"context_line":"    if(NULL \u003d\u003d used_idxs) {"},{"line_number":550,"context_line":"        goto out;"},{"line_number":551,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"065738c0_4194f7ea","line":548,"in_reply_to":"a6580a8b_9c9a5e40","updated":"2026-02-27 05:40:30.000000000","message":"Acknowledged","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":799,"context_line":"    }"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"    int nb_parity \u003d (matrix_size \u003d\u003d k)? m: 1;"},{"line_number":802,"context_line":"    unsigned char * encode \u003d (matrix_size \u003d\u003d k || missing_local_parity)?  isa_l_desc-\u003ematrix:decode_matrix;"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    /**"},{"line_number":805,"context_line":"     * Get the row needed to reconstruct"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"81fc9443_0e620865","line":802,"range":{"start_line":802,"start_character":30,"end_line":802,"end_character":70},"updated":"2025-11-27 18:45:05.000000000","message":"Why `|| missing_local_parity`? Actually, why shouldn\u0027t this just always be `decode_matrix`?","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b796f0edf55a9235bb69093ea7fe49b07d24bfb2","unresolved":true,"context_lines":[{"line_number":799,"context_line":"    }"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"    int nb_parity \u003d (matrix_size \u003d\u003d k)? m: 1;"},{"line_number":802,"context_line":"    unsigned char * encode \u003d (matrix_size \u003d\u003d k || missing_local_parity)?  isa_l_desc-\u003ematrix:decode_matrix;"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    /**"},{"line_number":805,"context_line":"     * Get the row needed to reconstruct"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"5e342e8c_e042f36a","line":802,"range":{"start_line":802,"start_character":30,"end_line":802,"end_character":70},"in_reply_to":"14ea685d_c974f7d4","updated":"2026-02-27 05:40:30.000000000","message":"Makes me a little surprised we aren\u0027t looking at `destination_idx` at all, then...","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"041757128a8a0b44603fd45abe1cbf0030bd4fbb","unresolved":true,"context_lines":[{"line_number":799,"context_line":"    }"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"    int nb_parity \u003d (matrix_size \u003d\u003d k)? m: 1;"},{"line_number":802,"context_line":"    unsigned char * encode \u003d (matrix_size \u003d\u003d k || missing_local_parity)?  isa_l_desc-\u003ematrix:decode_matrix;"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    /**"},{"line_number":805,"context_line":"     * Get the row needed to reconstruct"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"14ea685d_c974f7d4","line":802,"range":{"start_line":802,"start_character":30,"end_line":802,"end_character":70},"in_reply_to":"81fc9443_0e620865","updated":"2025-12-04 08:43:55.000000000","message":"If we need to rebuild parity: it is in fact an encoding process","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2df69dda1f885df59a327ebc76ee32ec91d9c9bf","unresolved":true,"context_lines":[{"line_number":89,"context_line":"        int group_size \u003d local_group_size(k, local_parity, v);"},{"line_number":90,"context_line":"        for (int u \u003d 0; u \u003c k; u++) {"},{"line_number":91,"context_line":"            uint64_t pos \u003d ((1 \u003c\u003c u) \u0026 missing_bm);"},{"line_number":92,"context_line":"            if ((pos) \u0026\u0026 (u \u003e\u003d group_offset) \u0026\u0026 (u \u003c group_offset + group_size)) {"},{"line_number":93,"context_line":"                use_parity[v] \u003d 1;"},{"line_number":94,"context_line":"            }"},{"line_number":95,"context_line":"        }"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"64010ea4_06e3c9d7","line":92,"updated":"2025-12-07 22:00:46.000000000","message":"Could simplify this condition but updating the for loop above:\n```\nfor (int u \u003d group_offset; u \u003c group_offset + group_size; u++) {\n```\nShould we also check for double failures? Like\n```\nif (pos) {\n    if (use_parity[v]) {\n        // Multiple failures!\n        use_parity[v] \u003d 0;\n        break;\n    } else {\n        use_parity[v] \u003d 1;\n    }\n}\n```","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"4cdecad4fea44df51b5d25f2c34be9fed3a7c17c","unresolved":true,"context_lines":[{"line_number":89,"context_line":"        int group_size \u003d local_group_size(k, local_parity, v);"},{"line_number":90,"context_line":"        for (int u \u003d 0; u \u003c k; u++) {"},{"line_number":91,"context_line":"            uint64_t pos \u003d ((1 \u003c\u003c u) \u0026 missing_bm);"},{"line_number":92,"context_line":"            if ((pos) \u0026\u0026 (u \u003e\u003d group_offset) \u0026\u0026 (u \u003c group_offset + group_size)) {"},{"line_number":93,"context_line":"                use_parity[v] \u003d 1;"},{"line_number":94,"context_line":"            }"},{"line_number":95,"context_line":"        }"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"c3214696_21e25cf2","line":92,"in_reply_to":"64010ea4_06e3c9d7","updated":"2025-12-08 13:52:06.000000000","message":"right for loop.\nFor double failures we can still combine local parity with global parity and it should decode.","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"3a7b1994cd7da81709b852c91d2a0b8145d1c97a","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        int group_size \u003d local_group_size(k, local_parity, v);"},{"line_number":90,"context_line":"        for (int u \u003d 0; u \u003c k; u++) {"},{"line_number":91,"context_line":"            uint64_t pos \u003d ((1 \u003c\u003c u) \u0026 missing_bm);"},{"line_number":92,"context_line":"            if ((pos) \u0026\u0026 (u \u003e\u003d group_offset) \u0026\u0026 (u \u003c group_offset + group_size)) {"},{"line_number":93,"context_line":"                use_parity[v] \u003d 1;"},{"line_number":94,"context_line":"            }"},{"line_number":95,"context_line":"        }"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"43a2c93b_1c58620b","line":92,"in_reply_to":"b1813f95_d042f8ae","updated":"2026-01-20 09:59:51.000000000","message":"In my opinion, the matrixes you submitted are not easily invertible, it depends on values.\nWhat I see from values is that we should target systematic correction of g+1 errors.\nIn your example we have 4 errors and this case is complex to prove.\nWhat is possible is to change a lillte the matrix encoding coefficients according to config (k,m, l). but this needs to make matrix encoding configurable.","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d597f7ca6108379fb58d66a00a6164e057e3a7dd","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        int group_size \u003d local_group_size(k, local_parity, v);"},{"line_number":90,"context_line":"        for (int u \u003d 0; u \u003c k; u++) {"},{"line_number":91,"context_line":"            uint64_t pos \u003d ((1 \u003c\u003c u) \u0026 missing_bm);"},{"line_number":92,"context_line":"            if ((pos) \u0026\u0026 (u \u003e\u003d group_offset) \u0026\u0026 (u \u003c group_offset + group_size)) {"},{"line_number":93,"context_line":"                use_parity[v] \u003d 1;"},{"line_number":94,"context_line":"            }"},{"line_number":95,"context_line":"        }"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"b1813f95_d042f8ae","line":92,"in_reply_to":"c3214696_21e25cf2","updated":"2026-01-17 03:50:52.000000000","message":"\u003e For double failures we can still combine local parity with global parity and it should decode.\n\nCan you? As a concrete example, I\u0027m thinking of something like 4+4(l\u003d2), so an encoding matrix like\n```\n1  0  0  0\n0  1  0  0\n0  0  1  0\n0  0  0  1\np1 p2 p3 p4\nq1 q2 q3 q4\nl1 l2 0  0\n0  0  m1 m2\n```\nOK, so\n```\n0  0  1  0\np1 p2 p3 p4\nq1 q2 q3 q4\nl1 l2 0  0\n```\nand\n```\n0  0  0  1\np1 p2 p3 p4\nq1 q2 q3 q4\nl1 l2 0  0\n```\nare pretty clearly invertible, but it\u0027s less clear to me that\n```\np1 p2 p3 p4\nq1 q2 q3 q4\nl1 l2 0  0\n0  0  m1 m2\n```\nis... I guess the sketch of the proof is that you should be able to use the `m` row to reduce to something like\n```\np1 p2 p3\u0027 0\nq1 q2 q3\u0027 0\nl1 l2 0   0\n0  0  m1  m2\n```\nand then some combination of those first three rows should allow you to get to\n```\np1 p2 p3\u0027 0\nq1 q2 q3\u0027 0\nl1 l2 0   0\n0  0  0   m2\u0027\n```\nwhich would pretty clearly be invertible. I guess a similar method should extend to other parameters/matrices?","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ec9746af86669f4d03e0785a504d3f48f6bd2ff5","unresolved":true,"context_lines":[{"line_number":134,"context_line":"    uint64_t useful_mask \u003d 0;"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    int min_range, max_range;"},{"line_number":137,"context_line":"    if (destination_idx \u003c k) {"},{"line_number":138,"context_line":"        // reconstructing a data frag; see if we can stay local"},{"line_number":139,"context_line":"        int local_group \u003d local_group_for_data(k, local_parity, destination_idx);"},{"line_number":140,"context_line":"        min_range \u003d local_group_data_lower(k, local_parity, local_group);"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"cc982548_4960b665","line":137,"updated":"2025-12-07 21:43:04.000000000","message":"This should have a `\u0026\u0026 local_parity \u003e 0` -- my bad.","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d597f7ca6108379fb58d66a00a6164e057e3a7dd","unresolved":false,"context_lines":[{"line_number":134,"context_line":"    uint64_t useful_mask \u003d 0;"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    int min_range, max_range;"},{"line_number":137,"context_line":"    if (destination_idx \u003c k) {"},{"line_number":138,"context_line":"        // reconstructing a data frag; see if we can stay local"},{"line_number":139,"context_line":"        int local_group \u003d local_group_for_data(k, local_parity, destination_idx);"},{"line_number":140,"context_line":"        min_range \u003d local_group_data_lower(k, local_parity, local_group);"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"d991ec1b_eb39f81a","line":137,"in_reply_to":"880684e2_a8d33449","updated":"2026-01-17 03:50:52.000000000","message":"Yup; with the `desc-\u003el \u003c 1` check on init, this comment is mooted.","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"4cdecad4fea44df51b5d25f2c34be9fed3a7c17c","unresolved":true,"context_lines":[{"line_number":134,"context_line":"    uint64_t useful_mask \u003d 0;"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    int min_range, max_range;"},{"line_number":137,"context_line":"    if (destination_idx \u003c k) {"},{"line_number":138,"context_line":"        // reconstructing a data frag; see if we can stay local"},{"line_number":139,"context_line":"        int local_group \u003d local_group_for_data(k, local_parity, destination_idx);"},{"line_number":140,"context_line":"        min_range \u003d local_group_data_lower(k, local_parity, local_group);"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"880684e2_a8d33449","line":137,"in_reply_to":"cc982548_4960b665","updated":"2025-12-08 13:52:06.000000000","message":"local_parity is used only for lrc. but one could check parameters at high level ?","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":true,"context_lines":[{"line_number":80,"context_line":"{"},{"line_number":81,"context_line":"    int i \u003d 0, j \u003d 0, locate \u003d 0;"},{"line_number":82,"context_line":"    int n \u003d k + m;"},{"line_number":83,"context_line":"    unsigned char *decode_matrix \u003d malloc(sizeof(unsigned char) * k * k);"},{"line_number":84,"context_line":"    int global_parity \u003d m - local_parity;"},{"line_number":85,"context_line":"    int *use_parity \u003d calloc(local_parity, sizeof(int) );"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":16,"id":"90dafee3_c358eb82","line":83,"range":{"start_line":83,"start_character":35,"end_line":83,"end_character":41},"updated":"2026-01-31 18:04:27.000000000","message":"We should check this didn\u0027t return `NULL`.\n\n(Oh, but we don\u0027t in `isa_l_lrc_decode`... 😬)","commit_id":"45cf399d0b6ad86131659a8695eb0d8c43ddf3fd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9f7f11bf4aa1755f27193e0c0a5705887039360","unresolved":false,"context_lines":[{"line_number":80,"context_line":"{"},{"line_number":81,"context_line":"    int i \u003d 0, j \u003d 0, locate \u003d 0;"},{"line_number":82,"context_line":"    int n \u003d k + m;"},{"line_number":83,"context_line":"    unsigned char *decode_matrix \u003d malloc(sizeof(unsigned char) * k * k);"},{"line_number":84,"context_line":"    int global_parity \u003d m - local_parity;"},{"line_number":85,"context_line":"    int *use_parity \u003d calloc(local_parity, sizeof(int) );"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":16,"id":"4ad61a94_226b5b74","line":83,"range":{"start_line":83,"start_character":35,"end_line":83,"end_character":41},"in_reply_to":"90dafee3_c358eb82","updated":"2026-02-20 04:03:50.000000000","message":"Done","commit_id":"45cf399d0b6ad86131659a8695eb0d8c43ddf3fd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":true,"context_lines":[{"line_number":82,"context_line":"    int n \u003d k + m;"},{"line_number":83,"context_line":"    unsigned char *decode_matrix \u003d malloc(sizeof(unsigned char) * k * k);"},{"line_number":84,"context_line":"    int global_parity \u003d m - local_parity;"},{"line_number":85,"context_line":"    int *use_parity \u003d calloc(local_parity, sizeof(int) );"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    int group_offset \u003d 0;"},{"line_number":88,"context_line":"    for (int v \u003d 0; v \u003c local_parity; v++) {"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"a26caf62_2af8a447","line":85,"range":{"start_line":85,"start_character":22,"end_line":85,"end_character":28},"updated":"2026-01-31 18:04:27.000000000","message":"This, too.","commit_id":"45cf399d0b6ad86131659a8695eb0d8c43ddf3fd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9f7f11bf4aa1755f27193e0c0a5705887039360","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    int n \u003d k + m;"},{"line_number":83,"context_line":"    unsigned char *decode_matrix \u003d malloc(sizeof(unsigned char) * k * k);"},{"line_number":84,"context_line":"    int global_parity \u003d m - local_parity;"},{"line_number":85,"context_line":"    int *use_parity \u003d calloc(local_parity, sizeof(int) );"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    int group_offset \u003d 0;"},{"line_number":88,"context_line":"    for (int v \u003d 0; v \u003c local_parity; v++) {"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"d38f5bc8_cb4f4b19","line":85,"range":{"start_line":85,"start_character":22,"end_line":85,"end_character":28},"in_reply_to":"a26caf62_2af8a447","updated":"2026-02-20 04:03:50.000000000","message":"Done","commit_id":"45cf399d0b6ad86131659a8695eb0d8c43ddf3fd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":true,"context_lines":[{"line_number":154,"context_line":"            useful_mask |\u003d 1 \u003c\u003c local_parity_idx;"},{"line_number":155,"context_line":"            *missing_bm \u0026\u003d useful_mask;"},{"line_number":156,"context_line":"            *mx_size \u003d max_range - min_range;"},{"line_number":157,"context_line":"            decode_matrix \u003d malloc(sizeof(unsigned char) * (*mx_size) * (*mx_size));"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"            int col \u003d 0;"},{"line_number":160,"context_line":"            for (int enc_idx \u003d min_range; enc_idx \u003c max_range; enc_idx++) {"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"d121d95e_4dbacbb2","line":157,"range":{"start_line":157,"start_character":28,"end_line":157,"end_character":34},"updated":"2026-01-31 18:04:27.000000000","message":"Check for `NULL`","commit_id":"45cf399d0b6ad86131659a8695eb0d8c43ddf3fd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9f7f11bf4aa1755f27193e0c0a5705887039360","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            useful_mask |\u003d 1 \u003c\u003c local_parity_idx;"},{"line_number":155,"context_line":"            *missing_bm \u0026\u003d useful_mask;"},{"line_number":156,"context_line":"            *mx_size \u003d max_range - min_range;"},{"line_number":157,"context_line":"            decode_matrix \u003d malloc(sizeof(unsigned char) * (*mx_size) * (*mx_size));"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"            int col \u003d 0;"},{"line_number":160,"context_line":"            for (int enc_idx \u003d min_range; enc_idx \u003c max_range; enc_idx++) {"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"23798c1c_546266f6","line":157,"range":{"start_line":157,"start_character":28,"end_line":157,"end_character":34},"in_reply_to":"d121d95e_4dbacbb2","updated":"2026-02-20 04:03:50.000000000","message":"Done","commit_id":"45cf399d0b6ad86131659a8695eb0d8c43ddf3fd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":true,"context_lines":[{"line_number":189,"context_line":"            *missing_bm \u0026\u003d useful_mask;"},{"line_number":190,"context_line":"            *missing_local_parity \u003d 1;"},{"line_number":191,"context_line":"            *mx_size \u003d max_range - min_range;"},{"line_number":192,"context_line":"            decode_matrix \u003d malloc(sizeof(unsigned char) * (*mx_size) * (*mx_size));"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"            for (int i \u003d min_range; i \u003c max_range; i++) {"},{"line_number":195,"context_line":"                for (int j \u003d min_range; j \u003c max_range; j++) {"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"64296bb3_432f9d28","line":192,"range":{"start_line":192,"start_character":28,"end_line":192,"end_character":34},"updated":"2026-01-31 18:04:27.000000000","message":"Check for `NULL`","commit_id":"45cf399d0b6ad86131659a8695eb0d8c43ddf3fd"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9f7f11bf4aa1755f27193e0c0a5705887039360","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            *missing_bm \u0026\u003d useful_mask;"},{"line_number":190,"context_line":"            *missing_local_parity \u003d 1;"},{"line_number":191,"context_line":"            *mx_size \u003d max_range - min_range;"},{"line_number":192,"context_line":"            decode_matrix \u003d malloc(sizeof(unsigned char) * (*mx_size) * (*mx_size));"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"            for (int i \u003d min_range; i \u003c max_range; i++) {"},{"line_number":195,"context_line":"                for (int j \u003d min_range; j \u003c max_range; j++) {"}],"source_content_type":"text/x-csrc","patch_set":16,"id":"ecc0e93e_9d43d2c7","line":192,"range":{"start_line":192,"start_character":28,"end_line":192,"end_character":34},"in_reply_to":"64296bb3_432f9d28","updated":"2026-02-20 04:03:50.000000000","message":"Done","commit_id":"45cf399d0b6ad86131659a8695eb0d8c43ddf3fd"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0073e465e011a64a1a9a70a63d086df007103d47","unresolved":true,"context_lines":[{"line_number":76,"context_line":"    return decode_matrix;"},{"line_number":77,"context_line":"}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"static unsigned char* isa_l_lrc_get_decode_matrix(int k, int m, unsigned local_parity, unsigned char *encode_matrix, uint64_t missing_bm, int *used_idxs)"},{"line_number":80,"context_line":"{"},{"line_number":81,"context_line":"    int i \u003d 0, j \u003d 0, locate \u003d 0;"},{"line_number":82,"context_line":"    int n \u003d k + m;"}],"source_content_type":"text/x-csrc","patch_set":17,"id":"4f0e7328_286d6cdd","line":79,"range":{"start_line":79,"start_character":28,"end_line":79,"end_character":31},"updated":"2026-02-05 00:31:40.000000000","message":"Are these lrc strickly only for the LRC implementation? if so do they belong here in isa_l_common or should they be defined in isa_l_rs_lrc.c?\n\nI guess it\u0027s fine that they\u0027re here if they will be used in more then 1 implementation. I\u0027m no expert on LRC codes, are these functions generic enough to be used elsewhere too?","commit_id":"c8c2faa1b6ee65be21d670fc351a845bcd1e4b07"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9f7f11bf4aa1755f27193e0c0a5705887039360","unresolved":false,"context_lines":[{"line_number":76,"context_line":"    return decode_matrix;"},{"line_number":77,"context_line":"}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"static unsigned char* isa_l_lrc_get_decode_matrix(int k, int m, unsigned local_parity, unsigned char *encode_matrix, uint64_t missing_bm, int *used_idxs)"},{"line_number":80,"context_line":"{"},{"line_number":81,"context_line":"    int i \u003d 0, j \u003d 0, locate \u003d 0;"},{"line_number":82,"context_line":"    int n \u003d k + m;"}],"source_content_type":"text/x-csrc","patch_set":17,"id":"2b300ded_0a6a18a9","line":79,"range":{"start_line":79,"start_character":28,"end_line":79,"end_character":31},"in_reply_to":"376f2364_e2470699","updated":"2026-02-20 04:03:50.000000000","message":"Done","commit_id":"c8c2faa1b6ee65be21d670fc351a845bcd1e4b07"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"112d1415c5c5730c8bcf428becbc16b737370a9d","unresolved":true,"context_lines":[{"line_number":76,"context_line":"    return decode_matrix;"},{"line_number":77,"context_line":"}"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"static unsigned char* isa_l_lrc_get_decode_matrix(int k, int m, unsigned local_parity, unsigned char *encode_matrix, uint64_t missing_bm, int *used_idxs)"},{"line_number":80,"context_line":"{"},{"line_number":81,"context_line":"    int i \u003d 0, j \u003d 0, locate \u003d 0;"},{"line_number":82,"context_line":"    int n \u003d k + m;"}],"source_content_type":"text/x-csrc","patch_set":17,"id":"376f2364_e2470699","line":79,"range":{"start_line":79,"start_character":28,"end_line":79,"end_character":31},"in_reply_to":"4f0e7328_286d6cdd","updated":"2026-02-05 12:21:34.000000000","message":"Mentioned by Tim also , these are specific and need to move into isa_l_rs_lrc.c","commit_id":"c8c2faa1b6ee65be21d670fc351a845bcd1e4b07"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"0073e465e011a64a1a9a70a63d086df007103d47","unresolved":true,"context_lines":[{"line_number":743,"context_line":"}"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"__attribute__ ((visibility (\"internal\")))"},{"line_number":746,"context_line":"int isa_l_lrc_reconstruct(void *desc, char **data, char **parity,"},{"line_number":747,"context_line":"        int *missing_idxs, int destination_idx, int blocksize)"},{"line_number":748,"context_line":"{"},{"line_number":749,"context_line":"    isa_l_descriptor *isa_l_desc \u003d (isa_l_descriptor*) desc;"}],"source_content_type":"text/x-csrc","patch_set":17,"id":"995c1e31_fe71a0fc","line":746,"range":{"start_line":746,"start_character":4,"end_line":746,"end_character":25},"updated":"2026-02-05 00:31:40.000000000","message":"As far as I can tell this is defined in common and then only used in `src/backends/isa-l/isa_l_rs_lrc.c`. As is `isa_l_lrc_decode`. \n\nSeems to me common should be for common functions that are used in more the 1 isa_l implementation, but seems for LRC in particular all the LRC functions live in common and there isn\u0027t much in the LRC explicit c file.","commit_id":"c8c2faa1b6ee65be21d670fc351a845bcd1e4b07"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9f7f11bf4aa1755f27193e0c0a5705887039360","unresolved":false,"context_lines":[{"line_number":743,"context_line":"}"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"__attribute__ ((visibility (\"internal\")))"},{"line_number":746,"context_line":"int isa_l_lrc_reconstruct(void *desc, char **data, char **parity,"},{"line_number":747,"context_line":"        int *missing_idxs, int destination_idx, int blocksize)"},{"line_number":748,"context_line":"{"},{"line_number":749,"context_line":"    isa_l_descriptor *isa_l_desc \u003d (isa_l_descriptor*) desc;"}],"source_content_type":"text/x-csrc","patch_set":17,"id":"74fd55a4_d559cc39","line":746,"range":{"start_line":746,"start_character":4,"end_line":746,"end_character":25},"in_reply_to":"12199307_9172e43a","updated":"2026-02-20 04:03:50.000000000","message":"Done","commit_id":"c8c2faa1b6ee65be21d670fc351a845bcd1e4b07"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"112d1415c5c5730c8bcf428becbc16b737370a9d","unresolved":true,"context_lines":[{"line_number":743,"context_line":"}"},{"line_number":744,"context_line":""},{"line_number":745,"context_line":"__attribute__ ((visibility (\"internal\")))"},{"line_number":746,"context_line":"int isa_l_lrc_reconstruct(void *desc, char **data, char **parity,"},{"line_number":747,"context_line":"        int *missing_idxs, int destination_idx, int blocksize)"},{"line_number":748,"context_line":"{"},{"line_number":749,"context_line":"    isa_l_descriptor *isa_l_desc \u003d (isa_l_descriptor*) desc;"}],"source_content_type":"text/x-csrc","patch_set":17,"id":"12199307_9172e43a","line":746,"range":{"start_line":746,"start_character":4,"end_line":746,"end_character":25},"in_reply_to":"995c1e31_fe71a0fc","updated":"2026-02-05 12:21:34.000000000","message":"No reason to have them in isa_l_common, but this was good start point","commit_id":"c8c2faa1b6ee65be21d670fc351a845bcd1e4b07"}],"src/backends/isa-l/isa_l_rs_lrc.c":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5f4eac3c9ed65c726288e25f9ee9e0cfef28f540","unresolved":true,"context_lines":[{"line_number":54,"context_line":"    int l \u003d desc-\u003el;   //local parities"},{"line_number":55,"context_line":"    int r \u003d m - l;     //global parities"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    /* Build a (k+m)*k Vandermonde matrix, A */"},{"line_number":58,"context_line":"    tmp \u003d malloc(sizeof(char) * n * k);"},{"line_number":59,"context_line":"    if (tmp \u003d\u003d NULL) {"},{"line_number":60,"context_line":"        goto error_free;"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"70431964_be6d8f0e","line":57,"updated":"2025-10-26 03:05:21.000000000","message":"Not a `(k+r)*k` matrix? Oh, I see -- we want this \u0027cause we\u0027re setting zeroes for the local parities later around L105-120.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    int l \u003d desc-\u003el;   //local parities"},{"line_number":55,"context_line":"    int r \u003d m - l;     //global parities"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    /* Build a (k+m)*k Vandermonde matrix, A */"},{"line_number":58,"context_line":"    tmp \u003d malloc(sizeof(char) * n * k);"},{"line_number":59,"context_line":"    if (tmp \u003d\u003d NULL) {"},{"line_number":60,"context_line":"        goto error_free;"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"0a73d0c6_bbb666dd","line":57,"in_reply_to":"6ad2b915_66121c5a","updated":"2025-11-05 23:12:44.000000000","message":"Acknowledged","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"7c50040b34670f0af0d136b82e3eee96979abbe6","unresolved":true,"context_lines":[{"line_number":54,"context_line":"    int l \u003d desc-\u003el;   //local parities"},{"line_number":55,"context_line":"    int r \u003d m - l;     //global parities"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    /* Build a (k+m)*k Vandermonde matrix, A */"},{"line_number":58,"context_line":"    tmp \u003d malloc(sizeof(char) * n * k);"},{"line_number":59,"context_line":"    if (tmp \u003d\u003d NULL) {"},{"line_number":60,"context_line":"        goto error_free;"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"6ad2b915_66121c5a","line":57,"in_reply_to":"70431964_be6d8f0e","updated":"2025-11-03 09:52:55.000000000","message":"Right, we make some local parities by zerowing some coeffs. Caunchy Matrix and Standard VAND_INV matrix have the proprerty that any k lines are independant.\nBut when zeroing we will looze soem of this capacity.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5f4eac3c9ed65c726288e25f9ee9e0cfef28f540","unresolved":true,"context_lines":[{"line_number":238,"context_line":"static struct ec_backend_op_stubs isa_l_rs_lrc_op_stubs \u003d {"},{"line_number":239,"context_line":"    .INIT                       \u003d isa_l_rs_lrc_init,"},{"line_number":240,"context_line":"    .EXIT                       \u003d isa_l_exit,"},{"line_number":241,"context_line":"    .ENCODE                     \u003d isa_l_encode,"},{"line_number":242,"context_line":"    .DECODE                     \u003d isa_l_lrc_decode,"},{"line_number":243,"context_line":"    .FRAGSNEEDED                \u003d isa_l_min_fragments,"},{"line_number":244,"context_line":"    .RECONSTRUCT                \u003d isa_l_lrc_reconstruct,"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"3265376c_ed49a7ec","line":241,"updated":"2025-10-26 03:05:21.000000000","message":"Right, nice: the encode operation is still straightforward; we just use a special encoding matrix.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"7c50040b34670f0af0d136b82e3eee96979abbe6","unresolved":false,"context_lines":[{"line_number":238,"context_line":"static struct ec_backend_op_stubs isa_l_rs_lrc_op_stubs \u003d {"},{"line_number":239,"context_line":"    .INIT                       \u003d isa_l_rs_lrc_init,"},{"line_number":240,"context_line":"    .EXIT                       \u003d isa_l_exit,"},{"line_number":241,"context_line":"    .ENCODE                     \u003d isa_l_encode,"},{"line_number":242,"context_line":"    .DECODE                     \u003d isa_l_lrc_decode,"},{"line_number":243,"context_line":"    .FRAGSNEEDED                \u003d isa_l_min_fragments,"},{"line_number":244,"context_line":"    .RECONSTRUCT                \u003d isa_l_lrc_reconstruct,"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"9911396e_1b87c27d","line":241,"in_reply_to":"3265376c_ed49a7ec","updated":"2025-11-03 09:52:55.000000000","message":"Done","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5f4eac3c9ed65c726288e25f9ee9e0cfef28f540","unresolved":true,"context_lines":[{"line_number":240,"context_line":"    .EXIT                       \u003d isa_l_exit,"},{"line_number":241,"context_line":"    .ENCODE                     \u003d isa_l_encode,"},{"line_number":242,"context_line":"    .DECODE                     \u003d isa_l_lrc_decode,"},{"line_number":243,"context_line":"    .FRAGSNEEDED                \u003d isa_l_min_fragments,"},{"line_number":244,"context_line":"    .RECONSTRUCT                \u003d isa_l_lrc_reconstruct,"},{"line_number":245,"context_line":"    .ELEMENTSIZE                \u003d isa_l_element_size,"},{"line_number":246,"context_line":"    .ISCOMPATIBLEWITH           \u003d isa_l_rs_lrc_is_compatible_with,"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"038176c7_d4d95c6e","line":243,"updated":"2025-10-26 03:05:21.000000000","message":"I\u0027m kind of surprised this gets to use the generic min_fragments, though...","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"eb7edfc4_84795e30","line":104,"updated":"2025-11-05 23:12:44.000000000","message":"I\u0027m nervous about this when `k % l` is high, like with `k \u003d 14, m \u003d 11, l \u003d 5`. That would produce data frags in groups of 2, 2, 2, 2, 9 right? Seems to me that it\u0027d be better to do something like 3, 3, 3, 3, 2 in that case, easier to keep regions balanced...\n\nI thought that something like https://paste.opendev.org/show/bORGinbzL32RBBIRkBCP/ would do it, but I\u0027m getting some test failures... still looking into it...","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"041757128a8a0b44603fd45abe1cbf0030bd4fbb","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"0e2a16b9_aec65819","line":104,"in_reply_to":"002a52e2_046501d1","updated":"2025-12-04 08:43:55.000000000","message":"I found it: there is a factor of 2 in decoding, as decoding is nout our main latency( major latency got from reading data from hdd and ssd). But it confirms what you found!\nWe measured decoting times and there is a factor of 2\nThanks, this makes me insist to find it","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"49b388f9_0a5dbd55","line":104,"in_reply_to":"0e2a16b9_aec65819","updated":"2026-02-24 21:20:37.000000000","message":"I think we can mark this thread as resolved, yeah?","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ab40a4b0e58e16819a91ed3fc30e30613f7c572c","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"34dd0663_f724f962","line":104,"in_reply_to":"16f63e82_04355e6b","updated":"2025-11-15 06:22:44.000000000","message":"\u003e sounds good\n\nCool! I\u0027ll continue building from there as I hack on reconstruction with local parities.\n\n\u003e I have no doubt about your math skills.\n\nMaybe I\u0027m overly humble, but I *definitely* have my doubts 😜\n\n\u003e I was convinced to gain some cpu if we present only data during decoding ... I Measured some cpu usage but I see no difference in cpu usage.\n\nI don\u0027t know that I\u0027d expect a *decrease in CPU usage* exactly, but I *do* expect an **increase in bandwidth** -- that is, we should be able to decode the same amount of data faster.\n\nThe pyeclib benchmark tool I wrote seems to bear that out; when there are zero unavailable data frags, we get ~3x performance compared to when we\u0027re missing at least one. And whether we lose one or more, they\u0027re all roughly comparable since they all go the matrix-math route.\n```\n% pyeclib-backend bench --ec-type isa_l_rs_vand_inv --decode --unavailable 0\nUsing 10 data + 5 parity with 0 unavailable frags\nisa_l_rs_vand_inv (decode): 19858.9MB/s\n% pyeclib-backend bench --ec-type isa_l_rs_vand_inv --decode --unavailable 1\nUsing 10 data + 5 parity with 1 unavailable frags\nisa_l_rs_vand_inv (decode): 6992.7MB/s\n% pyeclib-backend bench --ec-type isa_l_rs_vand_inv --decode --unavailable 2\nUsing 10 data + 5 parity with 2 unavailable frags\nisa_l_rs_vand_inv (decode): 6991.0MB/s\n% pyeclib-backend bench --ec-type isa_l_rs_vand_inv --decode --unavailable 3\nUsing 10 data + 5 parity with 3 unavailable frags\nisa_l_rs_vand_inv (decode): 6946.4MB/s\n```\nAnd the numbers are very comparable between all three released isa-l backends. Haven\u0027t yet gotten my local env to the point that I can test this new LRC backend with pyeclib, but I\u0027ll get there!","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c0f017d1cf0e19e37c94dcc236a642e5baa5a827","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"f42743fa_740db413","line":104,"in_reply_to":"3293c278_a50b00ea","updated":"2025-11-06 00:28:41.000000000","message":"\u003e groups of 2, 2, 2, 2, 9\n\nNo -- not quite *that* bad -- groups of 2, 2, 2, 2, **6**. Still not great, though.","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"5b31fd6cb526b93b06ef4f511d90cbadf0c4b071","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"834bc57b_f2e02daf","line":104,"in_reply_to":"34dd0663_f724f962","updated":"2025-11-18 14:40:24.000000000","message":"Thank you for such bench, I expected some latency/cpu/throughput or even consumption but not seen what I expected.\nHowever bench is using warp and limited to 450MB/s ....","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"3dfdf33229c5536d322b0108b04ad645563a894d","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"766c18cd_1135f935","line":104,"in_reply_to":"36b8ccf9_4dad61fb","updated":"2025-11-10 11:40:20.000000000","message":"I was aware of this, thanks for proposition. some different ways are possible but the best should be one where delta(card(groups)) is at most 1.\nAS as you see, for each chunk  we need to know to which group it belongs , that is why I started with simple way. I agree with your concern. \nLet met apply your change or come with some other way.","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ce3e24148befcb10a99a4b28c20a5bbdcdfd2e6b","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"e2fbe50a_79fc9fc4","line":104,"in_reply_to":"3762902c_b2bac81e","updated":"2025-11-13 17:24:51.000000000","message":"So my math was good (thankfully we\u0027ve got plenty of tests that catch it when it isn\u0027t!) but I\u0027m realizing I could probably clean it up and/or abstract it behind some helpers, \u0027cause I left some of those *horrendous* to reason about! See what you think of https://paste.opendev.org/show/b7VAFnqKY4GxPjqn89uh/","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"b1f0eff1ca570bea5c0521651dbf8f5279c6c365","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"3762902c_b2bac81e","line":104,"in_reply_to":"766c18cd_1135f935","updated":"2025-11-12 14:08:56.000000000","message":"I think you distributed remaineder of division over groups and this good.","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"002a52e2_046501d1","line":104,"in_reply_to":"834bc57b_f2e02daf","updated":"2025-11-27 18:45:05.000000000","message":"Is something else the bottleneck? What\u0027s warp (From minio, right? The S3 benchmark tool?) getting pointed at? Is it backed by spinning disks or SSD, and with what kind of erasure coding scheme? For single-stream throughput coming from a small number (3, maybe 4) of spinning disks, 450MB/s sounds about right.\n\nFWIW, this disparity is a significant part of why the Swift team hasn\u0027t spent much time on liberasurecode -- it works *well enough*, though there are occasional fixes needed as compilers get better at catching errors. (Thinking of [`548847e7`](https://github.com/openstack/liberasurecode/commit/548847e77e37be6339314840bbad7f7e9a3e4ffa), [`329537b5`](https://github.com/openstack/liberasurecode/commit/329537b549922c7c4040847f820dc636cf27d70c), and [`e97809b8`](https://github.com/openstack/liberasurecode/commit/e97809b89ee352fb55284a905670e19e7586f2c6) most recently.)\n\nThere probably *are* things we could do to get those number even better. (Mainly, I think, around reusing buffers when we\u0027re working on a stream of data and *know* there will be a bunch of decodes all using the same size buffers.) But because it\u0027s \"fast enough\", the disks or sometimes the network will be the bottleneck.","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"d834c98a80746de8d8fc38c5271d73daf287e338","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"16f63e82_04355e6b","line":104,"in_reply_to":"e2fbe50a_79fc9fc4","updated":"2025-11-14 11:30:50.000000000","message":"sounds good,and I have no doubt about your math skills. \nI will answer your remarks.\nLet me ask a question that is not related to LRC.\nI am measuring some cpu performance and I was convinced to gain some cpu if we present only data during decoding as we check here:\nhttps://review.opendev.org/c/openstack/liberasurecode/+/959280/9/src/erasurecode.c#b607\n\nI Measured some cpu usage but I see no difference in cpu usage.\nHowever in case we present data with some parity we go through matrix preparation and decoding that uses simd instrcutions etc etc","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"3edd309be7ee689328ce59ca06b26fa7e45cfbea","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"3293c278_a50b00ea","line":104,"in_reply_to":"eb7edfc4_84795e30","updated":"2025-11-06 00:18:24.000000000","message":"Oh, I see, I messed with the assumptions over in `isa_l_lrc_get_reconstruct_matrix`...","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"78a0823f1143da45aef5b42e1cab0e2f816eb95d","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        }"},{"line_number":102,"context_line":"    }"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    int group_size \u003d (int)(k / l);"},{"line_number":105,"context_line":"    for (i \u003d k + r; i \u003c n; i++) {"},{"line_number":106,"context_line":"        for (j \u003d 0; j \u003c k; j++) {"},{"line_number":107,"context_line":"            if (count_group \u003d\u003d l -1) {"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"36b8ccf9_4dad61fb","line":104,"in_reply_to":"f42743fa_740db413","updated":"2025-11-06 01:13:41.000000000","message":"OK, better diff (fixes up `isa_l_lrc_get_reconstruct_matrix`): https://paste.opendev.org/show/bvbQzkMk0xAv7IcrULT3/","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ec9746af86669f4d03e0785a504d3f48f6bd2ff5","unresolved":true,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    desc-\u003ek \u003d args-\u003euargs.k;"},{"line_number":133,"context_line":"    desc-\u003em \u003d args-\u003euargs.m;"},{"line_number":134,"context_line":"    desc-\u003el \u003d args-\u003euargs.priv_args1.lrc_args.l;"},{"line_number":135,"context_line":"    if (args-\u003euargs.w \u003c\u003d 0)"},{"line_number":136,"context_line":"        args-\u003euargs.w \u003d ISA_L_W;"},{"line_number":137,"context_line":"    desc-\u003ew \u003d args-\u003euargs.w;"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"53a45da5_f5416d99","line":134,"updated":"2025-12-07 21:43:04.000000000","message":"There should be some validation on this, right? Something like\n```\nif (desc-\u003el \u003c 0 || desc-\u003el \u003e desc-\u003em) {\n    goto error;\n}\n```\n(or maybe even\n```\nif (desc-\u003el \u003c 1 || desc-\u003el \u003e desc-\u003em) {\n    goto error;\n}\n```\n)","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"4cdecad4fea44df51b5d25f2c34be9fed3a7c17c","unresolved":true,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    desc-\u003ek \u003d args-\u003euargs.k;"},{"line_number":133,"context_line":"    desc-\u003em \u003d args-\u003euargs.m;"},{"line_number":134,"context_line":"    desc-\u003el \u003d args-\u003euargs.priv_args1.lrc_args.l;"},{"line_number":135,"context_line":"    if (args-\u003euargs.w \u003c\u003d 0)"},{"line_number":136,"context_line":"        args-\u003euargs.w \u003d ISA_L_W;"},{"line_number":137,"context_line":"    desc-\u003ew \u003d args-\u003euargs.w;"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"64f41cbc_9d3ad803","line":134,"in_reply_to":"53a45da5_f5416d99","updated":"2025-12-08 13:52:06.000000000","message":"ok, right to check here","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d597f7ca6108379fb58d66a00a6164e057e3a7dd","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    desc-\u003ek \u003d args-\u003euargs.k;"},{"line_number":133,"context_line":"    desc-\u003em \u003d args-\u003euargs.m;"},{"line_number":134,"context_line":"    desc-\u003el \u003d args-\u003euargs.priv_args1.lrc_args.l;"},{"line_number":135,"context_line":"    if (args-\u003euargs.w \u003c\u003d 0)"},{"line_number":136,"context_line":"        args-\u003euargs.w \u003d ISA_L_W;"},{"line_number":137,"context_line":"    desc-\u003ew \u003d args-\u003euargs.w;"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"677baa0f_3a329d53","line":134,"in_reply_to":"64f41cbc_9d3ad803","updated":"2026-01-17 03:50:52.000000000","message":"Done","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9f7f11bf4aa1755f27193e0c0a5705887039360","unresolved":true,"context_lines":[{"line_number":531,"context_line":"    isa_l_desc-\u003eec_init_tables(k, num_missing_elements, inverse_rows, g_tbls);"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    isa_l_desc-\u003eec_encode_data(blocksize, k, num_missing_elements, g_tbls, (unsigned char**)available_fragments,"},{"line_number":534,"context_line":"                               (unsigned char**)decoded_elements);"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    ret \u003d 0;"},{"line_number":537,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":21,"id":"69c097ea_5d4f9263","line":534,"updated":"2026-02-20 04:03:50.000000000","message":"nit: The casts are unnecessary.","commit_id":"a87e849da8a341827e4c026164d7d8d956467519"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[{"line_number":531,"context_line":"    isa_l_desc-\u003eec_init_tables(k, num_missing_elements, inverse_rows, g_tbls);"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    isa_l_desc-\u003eec_encode_data(blocksize, k, num_missing_elements, g_tbls, (unsigned char**)available_fragments,"},{"line_number":534,"context_line":"                               (unsigned char**)decoded_elements);"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    ret \u003d 0;"},{"line_number":537,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":21,"id":"d99c0145_86e57384","line":534,"in_reply_to":"69c097ea_5d4f9263","updated":"2026-02-24 21:20:37.000000000","message":"Done","commit_id":"a87e849da8a341827e4c026164d7d8d956467519"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"40c185ae10fa257cf244a095c23f2fcc02a0a703","unresolved":true,"context_lines":[{"line_number":418,"context_line":"        i++;"},{"line_number":419,"context_line":"    }"},{"line_number":420,"context_line":"    // we can simplify here as total_missing counts only missing data + global parity"},{"line_number":421,"context_line":"    if (i \u003c k \u0026\u0026 !missing_local_parity \u0026\u0026 (total_missing \u003d\u003d global_parity + 1)) {"},{"line_number":422,"context_line":"        // We can combine all the local parities into a single global parity"},{"line_number":423,"context_line":"        group_offset \u003d 0;"},{"line_number":424,"context_line":"        for (int v \u003d 0; v \u003c local_parity; v++) {"}],"source_content_type":"text/x-csrc","patch_set":24,"id":"4f6dcb47_42b45d29","line":421,"updated":"2026-02-23 19:03:12.000000000","message":"If we add the `total_missing` condition here, won\u0027t we need to in `isa_l_lrc_decode` and `isa_l_lrc_reconstruct`, too? Otherwise we still add the combined fragments *without* adding the combined decode row, which seems like it\u0027d lead to data corruption...\n\nAlternatively, I think we can just drop the condition -- or are you mainly worried about performance implications due to the combining? I\u0027m not convinced we\u0027ve *lost* any information by inserting the combined frag/decode row...","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"b7b61a7726e7ae66fad331843d9372aba3bebfa1","unresolved":true,"context_lines":[{"line_number":418,"context_line":"        i++;"},{"line_number":419,"context_line":"    }"},{"line_number":420,"context_line":"    // we can simplify here as total_missing counts only missing data + global parity"},{"line_number":421,"context_line":"    if (i \u003c k \u0026\u0026 !missing_local_parity \u0026\u0026 (total_missing \u003d\u003d global_parity + 1)) {"},{"line_number":422,"context_line":"        // We can combine all the local parities into a single global parity"},{"line_number":423,"context_line":"        group_offset \u003d 0;"},{"line_number":424,"context_line":"        for (int v \u003d 0; v \u003c local_parity; v++) {"}],"source_content_type":"text/x-csrc","patch_set":24,"id":"b712eedc_572565d3","line":421,"in_reply_to":"4f6dcb47_42b45d29","updated":"2026-02-24 09:49:09.000000000","message":"Right, for both decode and reconstruct.\nFor the second part I am worried about performance and we should use combination in case of g + 1 errors and no parity error only.","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[{"line_number":418,"context_line":"        i++;"},{"line_number":419,"context_line":"    }"},{"line_number":420,"context_line":"    // we can simplify here as total_missing counts only missing data + global parity"},{"line_number":421,"context_line":"    if (i \u003c k \u0026\u0026 !missing_local_parity \u0026\u0026 (total_missing \u003d\u003d global_parity + 1)) {"},{"line_number":422,"context_line":"        // We can combine all the local parities into a single global parity"},{"line_number":423,"context_line":"        group_offset \u003d 0;"},{"line_number":424,"context_line":"        for (int v \u003d 0; v \u003c local_parity; v++) {"}],"source_content_type":"text/x-csrc","patch_set":24,"id":"c1dd8596_9bd3574d","line":421,"in_reply_to":"b712eedc_572565d3","updated":"2026-02-24 21:20:37.000000000","message":"Done","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"da8e353dedafe791434169255859a959c93e4e8d","unresolved":true,"context_lines":[{"line_number":434,"context_line":"        // Still not enough? Well, let\u0027s add what local parities we have,"},{"line_number":435,"context_line":"        // see if we can get lucky"},{"line_number":436,"context_line":"        for (locate \u003d k + global_parity; i \u003c k \u0026\u0026 locate \u003c n; locate++) {"},{"line_number":437,"context_line":"            if (use_parity \u0026 (1 \u003c\u003c locate)) {"},{"line_number":438,"context_line":"                for (j \u003d 0; j \u003c k; j++) {"},{"line_number":439,"context_line":"                    decode_matrix[(k * i) + j] \u003d encode_matrix[(k * locate) + j];"},{"line_number":440,"context_line":"                }"}],"source_content_type":"text/x-csrc","patch_set":24,"id":"e92c64a7_3ec8416f","line":437,"updated":"2026-02-24 01:22:11.000000000","message":"Ah! Looks like I lost track of a missing check here -- need something like `\u0026\u0026 !((1 \u003c\u003c locate) \u0026 missing_bm)` to prevent the corruption.","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[{"line_number":434,"context_line":"        // Still not enough? Well, let\u0027s add what local parities we have,"},{"line_number":435,"context_line":"        // see if we can get lucky"},{"line_number":436,"context_line":"        for (locate \u003d k + global_parity; i \u003c k \u0026\u0026 locate \u003c n; locate++) {"},{"line_number":437,"context_line":"            if (use_parity \u0026 (1 \u003c\u003c locate)) {"},{"line_number":438,"context_line":"                for (j \u003d 0; j \u003c k; j++) {"},{"line_number":439,"context_line":"                    decode_matrix[(k * i) + j] \u003d encode_matrix[(k * locate) + j];"},{"line_number":440,"context_line":"                }"}],"source_content_type":"text/x-csrc","patch_set":24,"id":"0991630e_8e091488","line":437,"in_reply_to":"7029b2f8_b5950c4c","updated":"2026-02-24 21:20:37.000000000","message":"Done","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"b7b61a7726e7ae66fad331843d9372aba3bebfa1","unresolved":true,"context_lines":[{"line_number":434,"context_line":"        // Still not enough? Well, let\u0027s add what local parities we have,"},{"line_number":435,"context_line":"        // see if we can get lucky"},{"line_number":436,"context_line":"        for (locate \u003d k + global_parity; i \u003c k \u0026\u0026 locate \u003c n; locate++) {"},{"line_number":437,"context_line":"            if (use_parity \u0026 (1 \u003c\u003c locate)) {"},{"line_number":438,"context_line":"                for (j \u003d 0; j \u003c k; j++) {"},{"line_number":439,"context_line":"                    decode_matrix[(k * i) + j] \u003d encode_matrix[(k * locate) + j];"},{"line_number":440,"context_line":"                }"}],"source_content_type":"text/x-csrc","patch_set":24,"id":"7029b2f8_b5950c4c","line":437,"in_reply_to":"e92c64a7_3ec8416f","updated":"2026-02-24 09:49:09.000000000","message":"Done, right","commit_id":"c9436ce37b0a49088a3d720a823aefa77ca22f7f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b796f0edf55a9235bb69093ea7fe49b07d24bfb2","unresolved":true,"context_lines":[{"line_number":136,"context_line":"    desc-\u003ek \u003d args-\u003euargs.k;"},{"line_number":137,"context_line":"    desc-\u003em \u003d args-\u003euargs.m;"},{"line_number":138,"context_line":"    desc-\u003el \u003d args-\u003euargs.priv_args1.lrc_args.l;"},{"line_number":139,"context_line":"    if (desc-\u003el \u003c 1 || desc-\u003el \u003e desc-\u003em) {"},{"line_number":140,"context_line":"        goto error;"},{"line_number":141,"context_line":"    }"},{"line_number":142,"context_line":"    if (args-\u003euargs.w \u003c\u003d 0)"}],"source_content_type":"text/x-csrc","patch_set":25,"id":"72b62cde_4408182f","line":139,"updated":"2026-02-27 05:40:30.000000000","message":"I\u0027m torn about whether to allow `l \u003d\u003d 1` -- doesn\u0027t seem so local... OTOH, I was the one pushing for allowing `l \u003d\u003d 0`...\n\nShould we maybe also throw an error unless `l \u003c\u003d k`? Maybe even unless `2 * l \u003c\u003d k`, to require that every local parity be composed of at least two data frags?","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"a172bd5c192e4c9cac76c94615ec5c92ba342727","unresolved":true,"context_lines":[{"line_number":136,"context_line":"    desc-\u003ek \u003d args-\u003euargs.k;"},{"line_number":137,"context_line":"    desc-\u003em \u003d args-\u003euargs.m;"},{"line_number":138,"context_line":"    desc-\u003el \u003d args-\u003euargs.priv_args1.lrc_args.l;"},{"line_number":139,"context_line":"    if (desc-\u003el \u003c 1 || desc-\u003el \u003e desc-\u003em) {"},{"line_number":140,"context_line":"        goto error;"},{"line_number":141,"context_line":"    }"},{"line_number":142,"context_line":"    if (args-\u003euargs.w \u003c\u003d 0)"}],"source_content_type":"text/x-csrc","patch_set":25,"id":"b4397c8d_c3454d8b","line":139,"in_reply_to":"72b62cde_4408182f","updated":"2026-02-27 09:51:20.000000000","message":"Ok vote for 2 *l  \u003c\u003d k","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e4571f0afd744abadcb6017305aa782ad8a7aede","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    desc-\u003ek \u003d args-\u003euargs.k;"},{"line_number":137,"context_line":"    desc-\u003em \u003d args-\u003euargs.m;"},{"line_number":138,"context_line":"    desc-\u003el \u003d args-\u003euargs.priv_args1.lrc_args.l;"},{"line_number":139,"context_line":"    if (desc-\u003el \u003c 1 || desc-\u003el \u003e desc-\u003em) {"},{"line_number":140,"context_line":"        goto error;"},{"line_number":141,"context_line":"    }"},{"line_number":142,"context_line":"    if (args-\u003euargs.w \u003c\u003d 0)"}],"source_content_type":"text/x-csrc","patch_set":25,"id":"f2ce5673_dbabb974","line":139,"in_reply_to":"b4397c8d_c3454d8b","updated":"2026-03-02 23:59:24.000000000","message":"Done","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"}],"src/erasurecode.c":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"246d995adce671419efc8ec5296ae0ff62b21447","unresolved":true,"context_lines":[{"line_number":659,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":660,"context_line":"    else"},{"line_number":661,"context_line":"        ret \u003d get_fragment_partition(k, m, local_parity, available_fragments, num_fragments,"},{"line_number":662,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    if (ret \u003em ) {"},{"line_number":665,"context_line":"        log_error(\"Could not properly partition the fragments!\");"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"a5098907_63c12649","line":662,"updated":"2025-10-21 16:54:09.000000000","message":"I think this should just be something like\n```\n    if (local_parity \u003e 0)\n        ret \u003d get_lrc_fragment_partition(k, m, local_parity, available_fragments, num_fragments,\n                                 data, parity, missing_idxs);\n    else\n        ret \u003d get_fragment_partition(k, m, available_fragments, num_fragments,\n                                    data, parity, missing_idxs);\n```\nand we skip the `get_fragment_partition` API change","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"1fffc181e9bd20e892ba765945801632309fbd30","unresolved":true,"context_lines":[{"line_number":659,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":660,"context_line":"    else"},{"line_number":661,"context_line":"        ret \u003d get_fragment_partition(k, m, local_parity, available_fragments, num_fragments,"},{"line_number":662,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    if (ret \u003em ) {"},{"line_number":665,"context_line":"        log_error(\"Could not properly partition the fragments!\");"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"c715f5a0_4811df77","line":662,"in_reply_to":"a5098907_63c12649","updated":"2025-10-23 16:17:03.000000000","message":"Yes, right some changes that I didn\u0027t clean after","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":false,"context_lines":[{"line_number":659,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":660,"context_line":"    else"},{"line_number":661,"context_line":"        ret \u003d get_fragment_partition(k, m, local_parity, available_fragments, num_fragments,"},{"line_number":662,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    if (ret \u003em ) {"},{"line_number":665,"context_line":"        log_error(\"Could not properly partition the fragments!\");"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"3623199a_b055384f","line":662,"in_reply_to":"c715f5a0_4811df77","updated":"2025-11-05 23:12:44.000000000","message":"Done","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"246d995adce671419efc8ec5296ae0ff62b21447","unresolved":true,"context_lines":[{"line_number":848,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":849,"context_line":"    else"},{"line_number":850,"context_line":"        ret \u003d get_fragment_partition(k, m, local_parity, available_fragments, num_fragments,"},{"line_number":851,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":852,"context_line":"    if (ret \u003c 0) {"},{"line_number":853,"context_line":"        log_error(\"Could not properly partition the fragments!\");"},{"line_number":854,"context_line":"        goto out;"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"97b6de20_694df9e8","line":851,"updated":"2025-10-21 16:54:09.000000000","message":"And then similar down here.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":false,"context_lines":[{"line_number":848,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":849,"context_line":"    else"},{"line_number":850,"context_line":"        ret \u003d get_fragment_partition(k, m, local_parity, available_fragments, num_fragments,"},{"line_number":851,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":852,"context_line":"    if (ret \u003c 0) {"},{"line_number":853,"context_line":"        log_error(\"Could not properly partition the fragments!\");"},{"line_number":854,"context_line":"        goto out;"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"d05b03a0_c307b398","line":851,"in_reply_to":"7bfd200b_2e43337f","updated":"2025-11-05 23:12:44.000000000","message":"Done","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"1fffc181e9bd20e892ba765945801632309fbd30","unresolved":true,"context_lines":[{"line_number":848,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":849,"context_line":"    else"},{"line_number":850,"context_line":"        ret \u003d get_fragment_partition(k, m, local_parity, available_fragments, num_fragments,"},{"line_number":851,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":852,"context_line":"    if (ret \u003c 0) {"},{"line_number":853,"context_line":"        log_error(\"Could not properly partition the fragments!\");"},{"line_number":854,"context_line":"        goto out;"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"7bfd200b_2e43337f","line":851,"in_reply_to":"97b6de20_694df9e8","updated":"2025-10-23 16:17:03.000000000","message":"ok","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5f4eac3c9ed65c726288e25f9ee9e0cfef28f540","unresolved":true,"context_lines":[{"line_number":572,"context_line":""},{"line_number":573,"context_line":"    k \u003d instance-\u003eargs.uargs.k;"},{"line_number":574,"context_line":"    m \u003d instance-\u003eargs.uargs.m;"},{"line_number":575,"context_line":"    int local_parity \u003d instance-\u003eargs.uargs.priv_args1.lrc_args.l;"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"    if (num_fragments \u003c k) {"},{"line_number":578,"context_line":"        log_error(\"Not enough fragments to decode, got %d, need %d!\","}],"source_content_type":"text/x-csrc","patch_set":7,"id":"ffb2aeba_d1848709","line":575,"updated":"2025-10-26 03:05:21.000000000","message":"I wonder if this should be more like\n```\n    int local_parity \u003d 0;\n    if (instance-\u003ecommon.id \u003d\u003d EC_BACKEND_ISA_L_RS_LRC) {\n        local_parity \u003d instance-\u003eargs.uargs.priv_args1.lrc_args.l;\n    }\n```\nso we only get the private LRC arg if we\u0027re actually using the LRC backend...","commit_id":"8ef1bf2f284f2804a2605891866447780760dbf3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":false,"context_lines":[{"line_number":572,"context_line":""},{"line_number":573,"context_line":"    k \u003d instance-\u003eargs.uargs.k;"},{"line_number":574,"context_line":"    m \u003d instance-\u003eargs.uargs.m;"},{"line_number":575,"context_line":"    int local_parity \u003d instance-\u003eargs.uargs.priv_args1.lrc_args.l;"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"    if (num_fragments \u003c k) {"},{"line_number":578,"context_line":"        log_error(\"Not enough fragments to decode, got %d, need %d!\","}],"source_content_type":"text/x-csrc","patch_set":7,"id":"2cb35ebd_07a8c935","line":575,"in_reply_to":"6ac4ed46_1cfcb6e6","updated":"2025-11-05 23:12:44.000000000","message":"Done","commit_id":"8ef1bf2f284f2804a2605891866447780760dbf3"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"7c50040b34670f0af0d136b82e3eee96979abbe6","unresolved":true,"context_lines":[{"line_number":572,"context_line":""},{"line_number":573,"context_line":"    k \u003d instance-\u003eargs.uargs.k;"},{"line_number":574,"context_line":"    m \u003d instance-\u003eargs.uargs.m;"},{"line_number":575,"context_line":"    int local_parity \u003d instance-\u003eargs.uargs.priv_args1.lrc_args.l;"},{"line_number":576,"context_line":""},{"line_number":577,"context_line":"    if (num_fragments \u003c k) {"},{"line_number":578,"context_line":"        log_error(\"Not enough fragments to decode, got %d, need %d!\","}],"source_content_type":"text/x-csrc","patch_set":7,"id":"6ac4ed46_1cfcb6e6","line":575,"in_reply_to":"ffb2aeba_d1848709","updated":"2025-11-03 09:52:55.000000000","message":"I agree","commit_id":"8ef1bf2f284f2804a2605891866447780760dbf3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5f4eac3c9ed65c726288e25f9ee9e0cfef28f540","unresolved":true,"context_lines":[{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    k \u003d instance-\u003eargs.uargs.k;"},{"line_number":805,"context_line":"    m \u003d instance-\u003eargs.uargs.m;"},{"line_number":806,"context_line":"    local_parity \u003d instance-\u003eargs.uargs.priv_args1.lrc_args.l;"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    for (i \u003d 0; i \u003c num_fragments; i++) {"},{"line_number":809,"context_line":"        /* Verify metadata checksum */"}],"source_content_type":"text/x-csrc","patch_set":7,"id":"38f7e749_3210bf1b","line":806,"updated":"2025-10-26 03:05:21.000000000","message":"Similar concern here, about only wanting to look for private LRC args when we know we\u0027re using the LRC backend.","commit_id":"8ef1bf2f284f2804a2605891866447780760dbf3"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"7c50040b34670f0af0d136b82e3eee96979abbe6","unresolved":true,"context_lines":[{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    k \u003d instance-\u003eargs.uargs.k;"},{"line_number":805,"context_line":"    m \u003d instance-\u003eargs.uargs.m;"},{"line_number":806,"context_line":"    local_parity \u003d instance-\u003eargs.uargs.priv_args1.lrc_args.l;"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    for (i \u003d 0; i \u003c num_fragments; i++) {"},{"line_number":809,"context_line":"        /* Verify metadata checksum */"}],"source_content_type":"text/x-csrc","patch_set":7,"id":"45342cd7_5427fbef","line":806,"in_reply_to":"38f7e749_3210bf1b","updated":"2025-11-03 09:52:55.000000000","message":"sounds good","commit_id":"8ef1bf2f284f2804a2605891866447780760dbf3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":false,"context_lines":[{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    k \u003d instance-\u003eargs.uargs.k;"},{"line_number":805,"context_line":"    m \u003d instance-\u003eargs.uargs.m;"},{"line_number":806,"context_line":"    local_parity \u003d instance-\u003eargs.uargs.priv_args1.lrc_args.l;"},{"line_number":807,"context_line":""},{"line_number":808,"context_line":"    for (i \u003d 0; i \u003c num_fragments; i++) {"},{"line_number":809,"context_line":"        /* Verify metadata checksum */"}],"source_content_type":"text/x-csrc","patch_set":7,"id":"6f213d3c_af1892c6","line":806,"in_reply_to":"45342cd7_5427fbef","updated":"2025-11-05 23:12:44.000000000","message":"Done","commit_id":"8ef1bf2f284f2804a2605891866447780760dbf3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":true,"context_lines":[{"line_number":663,"context_line":"        ret \u003d get_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":664,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    if (ret \u003em ) {"},{"line_number":667,"context_line":"        log_error(\"Could not properly partition the fragments!\");"},{"line_number":668,"context_line":"        goto out;"},{"line_number":669,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"138c467d_b2244172","line":666,"updated":"2025-11-05 23:12:44.000000000","message":"Is this the right condition for both these functions?","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"3dfdf33229c5536d322b0108b04ad645563a894d","unresolved":true,"context_lines":[{"line_number":663,"context_line":"        ret \u003d get_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":664,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    if (ret \u003em ) {"},{"line_number":667,"context_line":"        log_error(\"Could not properly partition the fragments!\");"},{"line_number":668,"context_line":"        goto out;"},{"line_number":669,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"2bd61457_b8c11cdf","line":666,"in_reply_to":"138c467d_b2244172","updated":"2025-11-10 11:40:20.000000000","message":"Ok I will look.","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"5b31fd6cb526b93b06ef4f511d90cbadf0c4b071","unresolved":true,"context_lines":[{"line_number":663,"context_line":"        ret \u003d get_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":664,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    if (ret \u003em ) {"},{"line_number":667,"context_line":"        log_error(\"Could not properly partition the fragments!\");"},{"line_number":668,"context_line":"        goto out;"},{"line_number":669,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"c056bfb8_cdd77437","line":666,"in_reply_to":"2bd61457_b8c11cdf","updated":"2025-11-18 14:40:24.000000000","message":"done","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":false,"context_lines":[{"line_number":663,"context_line":"        ret \u003d get_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":664,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    if (ret \u003em ) {"},{"line_number":667,"context_line":"        log_error(\"Could not properly partition the fragments!\");"},{"line_number":668,"context_line":"        goto out;"},{"line_number":669,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"c36060c2_d80a9030","line":666,"in_reply_to":"c056bfb8_cdd77437","updated":"2025-11-27 18:45:05.000000000","message":"Acknowledged","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":true,"context_lines":[{"line_number":852,"context_line":"    else"},{"line_number":853,"context_line":"        ret \u003d get_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":854,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":855,"context_line":"    if (ret \u003c 0) {"},{"line_number":856,"context_line":"        log_error(\"Could not properly partition the fragments!\");"},{"line_number":857,"context_line":"        goto out;"},{"line_number":858,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"9ebe7915_4dca9b16","line":855,"updated":"2025-11-05 23:12:44.000000000","message":"Similarly here: Is this the right condition for both these functions?","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":false,"context_lines":[{"line_number":852,"context_line":"    else"},{"line_number":853,"context_line":"        ret \u003d get_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":854,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":855,"context_line":"    if (ret \u003c 0) {"},{"line_number":856,"context_line":"        log_error(\"Could not properly partition the fragments!\");"},{"line_number":857,"context_line":"        goto out;"},{"line_number":858,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"ff5455ad_9b286715","line":855,"in_reply_to":"1be9b800_a5979f06","updated":"2025-11-27 18:45:05.000000000","message":"Acknowledged","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"5b31fd6cb526b93b06ef4f511d90cbadf0c4b071","unresolved":true,"context_lines":[{"line_number":852,"context_line":"    else"},{"line_number":853,"context_line":"        ret \u003d get_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":854,"context_line":"                                    data, parity, missing_idxs);"},{"line_number":855,"context_line":"    if (ret \u003c 0) {"},{"line_number":856,"context_line":"        log_error(\"Could not properly partition the fragments!\");"},{"line_number":857,"context_line":"        goto out;"},{"line_number":858,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":8,"id":"1be9b800_a5979f06","line":855,"in_reply_to":"9ebe7915_4dca9b16","updated":"2025-11-18 14:40:24.000000000","message":"done","commit_id":"0a72559d0dfb3ce5e8ca91ba149f1ecf9adab4ee"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":false,"context_lines":[{"line_number":806,"context_line":"    k \u003d instance-\u003eargs.uargs.k;"},{"line_number":807,"context_line":"    m \u003d instance-\u003eargs.uargs.m;"},{"line_number":808,"context_line":"    if (instance-\u003ecommon.id \u003d\u003d EC_BACKEND_ISA_L_RS_LRC) {"},{"line_number":809,"context_line":"        local_parity \u003d instance-\u003eargs.uargs.priv_args1.lrc_args.l;"},{"line_number":810,"context_line":"    }"},{"line_number":811,"context_line":"    for (i \u003d 0; i \u003c num_fragments; i++) {"},{"line_number":812,"context_line":"        /* Verify metadata checksum */"}],"source_content_type":"text/x-csrc","patch_set":9,"id":"c82f6a6d_434765fd","line":809,"updated":"2025-11-27 18:45:05.000000000","message":"Nice! *Love* to see this go; **way** better that we do the backend check to decide which function to use, then inside the function cast to an `isa_l_descriptor*` (which we were even already doing!)","commit_id":"642dac1086f0ccf9c05775c45e61b4a3f34dbc34"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":847,"context_line":"     * pieces are missing."},{"line_number":848,"context_line":"     */"},{"line_number":849,"context_line":"    if (instance-\u003ecommon.id \u003d\u003d EC_BACKEND_ISA_L_RS_LRC) {"},{"line_number":850,"context_line":"        ret \u003d get_lrc_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":851,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":852,"context_line":"        // get_lrc_fragment_partition returns the number of missing fragments"},{"line_number":853,"context_line":"        if (ret \u003e m) {"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"5205e214_d742a852","line":850,"updated":"2025-11-27 18:45:05.000000000","message":"OK, so we definitely want some new LRC-specific thing here, because now we can reconstruct some fragments given just `k / l` (or `k / l + 1`) frags rather than needing at least `k` -- so the current `if (ret \u003e m)` check below is still overly-constraining.\n\nDecoding is still always going to require at least `k` frags, though, right? Might be able to continue using just `get_fragment_partition` up there.","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":false,"context_lines":[{"line_number":847,"context_line":"     * pieces are missing."},{"line_number":848,"context_line":"     */"},{"line_number":849,"context_line":"    if (instance-\u003ecommon.id \u003d\u003d EC_BACKEND_ISA_L_RS_LRC) {"},{"line_number":850,"context_line":"        ret \u003d get_lrc_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":851,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":852,"context_line":"        // get_lrc_fragment_partition returns the number of missing fragments"},{"line_number":853,"context_line":"        if (ret \u003e m) {"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"fb86ccd3_5e02f9de","line":850,"in_reply_to":"5205e214_d742a852","updated":"2026-01-31 18:04:27.000000000","message":"Done","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c55de9655434241ed4184d696ddfd9d0022c15a1","unresolved":true,"context_lines":[{"line_number":850,"context_line":"        ret \u003d get_lrc_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":851,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":852,"context_line":"        // get_lrc_fragment_partition returns the number of missing fragments"},{"line_number":853,"context_line":"        if (ret \u003e m) {"},{"line_number":854,"context_line":"            log_error(\"LRC Could not properly partition the fragments!\");"},{"line_number":855,"context_line":"            goto out;"},{"line_number":856,"context_line":"        }"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"29aa6675_5aba0835","line":853,"updated":"2025-11-27 18:45:05.000000000","message":"Don\u0027t we still have to worry about a potential `-EBADHEADER`?","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ec9746af86669f4d03e0785a504d3f48f6bd2ff5","unresolved":true,"context_lines":[{"line_number":850,"context_line":"        ret \u003d get_lrc_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":851,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":852,"context_line":"        // get_lrc_fragment_partition returns the number of missing fragments"},{"line_number":853,"context_line":"        if (ret \u003e m) {"},{"line_number":854,"context_line":"            log_error(\"LRC Could not properly partition the fragments!\");"},{"line_number":855,"context_line":"            goto out;"},{"line_number":856,"context_line":"        }"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"a9e5307e_6eff82c0","line":853,"in_reply_to":"29aa6675_5aba0835","updated":"2025-12-07 21:43:04.000000000","message":"I think I maybe like the direction I\u0027m trying over in https://review.opendev.org/c/openstack/liberasurecode/+/969545\n\nIf we like that (and get the chain merged down), then *this patch* would just need to implement a `check_reconstruct_fragments` -- which I think could look something like\n```\n    uint64_t missing_bm \u003d convert_list_to_bitmap(missing_idxs);\n    int num_available \u003d desc-\u003ek + desc-\u003em;\n    for (int i \u003d num_available; i-- \u003e 0; )\n        if ((1LLU \u003c\u003c i) \u0026 missing_bm)\n            num_available--;\n\n    if (num_available \u003c local_group_size(desc-\u003ek, desc-\u003el, destination_idx))\n        return -EINSUFFFRAGS;\n    return 0;\n```\n(Though `local_group_size` should probably get something like `if (l \u003d\u003d 0) return k;` fairly early.)","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":false,"context_lines":[{"line_number":850,"context_line":"        ret \u003d get_lrc_fragment_partition(k, m, available_fragments, num_fragments,"},{"line_number":851,"context_line":"                                 data, parity, missing_idxs);"},{"line_number":852,"context_line":"        // get_lrc_fragment_partition returns the number of missing fragments"},{"line_number":853,"context_line":"        if (ret \u003e m) {"},{"line_number":854,"context_line":"            log_error(\"LRC Could not properly partition the fragments!\");"},{"line_number":855,"context_line":"            goto out;"},{"line_number":856,"context_line":"        }"}],"source_content_type":"text/x-csrc","patch_set":11,"id":"b76444fc_809fcdf9","line":853,"in_reply_to":"a9e5307e_6eff82c0","updated":"2026-01-31 18:04:27.000000000","message":"Done -- though I went with a more complicated (maybe overly-complicated?) `check_reconstruct_fragments` function.","commit_id":"e77c16b114e6c4894183b69ea72c32981d2d3143"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ec9746af86669f4d03e0785a504d3f48f6bd2ff5","unresolved":true,"context_lines":[{"line_number":852,"context_line":"        // get_lrc_fragment_partition returns the number of missing fragments"},{"line_number":853,"context_line":"        if (ret \u003e m) {"},{"line_number":854,"context_line":"            log_error(\"LRC Could not properly partition the fragments!\");"},{"line_number":855,"context_line":"            goto out;"},{"line_number":856,"context_line":"        }"},{"line_number":857,"context_line":"    }"},{"line_number":858,"context_line":"    else {"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"f7258390_5d366ece","line":855,"updated":"2025-12-07 21:43:04.000000000","message":"Also, if we just jump to out when `ret \u003e m` (`\u003e 0`), the caller will assume success; we should also set `ret \u003d -EiNSUFFFRAGS` or something. Pretty sure this explains why I see bad data (rather than failures) when trying to reconstruct with `k\u003d2, m\u003d2, l\u003d2` and 3 unavailable frags.","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":false,"context_lines":[{"line_number":852,"context_line":"        // get_lrc_fragment_partition returns the number of missing fragments"},{"line_number":853,"context_line":"        if (ret \u003e m) {"},{"line_number":854,"context_line":"            log_error(\"LRC Could not properly partition the fragments!\");"},{"line_number":855,"context_line":"            goto out;"},{"line_number":856,"context_line":"        }"},{"line_number":857,"context_line":"    }"},{"line_number":858,"context_line":"    else {"}],"source_content_type":"text/x-csrc","patch_set":13,"id":"1dbfe757_cc7ad206","line":855,"in_reply_to":"f7258390_5d366ece","updated":"2026-01-31 18:04:27.000000000","message":"Done","commit_id":"0a489d2dfc37a08af6222efcae7f835126d55917"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d597f7ca6108379fb58d66a00a6164e057e3a7dd","unresolved":true,"context_lines":[{"line_number":658,"context_line":"        // get_lrc_fragment_partition returns the number of missing fragments"},{"line_number":659,"context_line":"        if (ret \u003e m) {"},{"line_number":660,"context_line":"            log_error(\"LRC Could not properly partition the fragments!\");"},{"line_number":661,"context_line":"            ret \u003d -EBADHEADER;"},{"line_number":662,"context_line":"            goto out;"},{"line_number":663,"context_line":"        }"},{"line_number":664,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":14,"id":"2c3bc9ba_b6a08bc7","line":661,"range":{"start_line":661,"start_character":19,"end_line":661,"end_character":29},"updated":"2026-01-17 03:50:52.000000000","message":"That doesn\u0027t seem like the right error to return. `-EINSUFFFRAGS` maybe?","commit_id":"2fde6b21c9e8263f2dce2d2d4092fe5b0a5fa383"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f119856ce32d15858446607bdb75cb6640bdd42f","unresolved":false,"context_lines":[{"line_number":658,"context_line":"        // get_lrc_fragment_partition returns the number of missing fragments"},{"line_number":659,"context_line":"        if (ret \u003e m) {"},{"line_number":660,"context_line":"            log_error(\"LRC Could not properly partition the fragments!\");"},{"line_number":661,"context_line":"            ret \u003d -EBADHEADER;"},{"line_number":662,"context_line":"            goto out;"},{"line_number":663,"context_line":"        }"},{"line_number":664,"context_line":"    }"}],"source_content_type":"text/x-csrc","patch_set":14,"id":"c931aee1_8eca0915","line":661,"range":{"start_line":661,"start_character":19,"end_line":661,"end_character":29},"in_reply_to":"2c3bc9ba_b6a08bc7","updated":"2026-01-31 18:04:27.000000000","message":"Acknowledged","commit_id":"2fde6b21c9e8263f2dce2d2d4092fe5b0a5fa383"}],"src/erasurecode_preprocessing.c":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"246d995adce671419efc8ec5296ae0ff62b21447","unresolved":true,"context_lines":[{"line_number":226,"context_line":"}"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"int get_fragment_partition("},{"line_number":229,"context_line":"        int k, int m, int local_parity,"},{"line_number":230,"context_line":"        char **fragments, int num_fragments,"},{"line_number":231,"context_line":"        char **data, char **parity, int *missing)"},{"line_number":232,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"f5856bfe_3020947d","line":229,"range":{"start_line":229,"start_character":22,"end_line":229,"end_character":38},"updated":"2025-10-21 16:54:09.000000000","message":"OK, so we don\u0027t actually *use* the new arg in the old function...","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":false,"context_lines":[{"line_number":226,"context_line":"}"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"int get_fragment_partition("},{"line_number":229,"context_line":"        int k, int m, int local_parity,"},{"line_number":230,"context_line":"        char **fragments, int num_fragments,"},{"line_number":231,"context_line":"        char **data, char **parity, int *missing)"},{"line_number":232,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"a8d09882_87926f18","line":229,"range":{"start_line":229,"start_character":22,"end_line":229,"end_character":38},"in_reply_to":"f5856bfe_3020947d","updated":"2025-11-05 23:12:44.000000000","message":"Done","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"246d995adce671419efc8ec5296ae0ff62b21447","unresolved":true,"context_lines":[{"line_number":280,"context_line":"}"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"int get_lrc_fragment_partition("},{"line_number":283,"context_line":"        int k, int m, int local_parity,"},{"line_number":284,"context_line":"        char **fragments, int num_fragments,"},{"line_number":285,"context_line":"        char **data, char **parity, int *missing)"},{"line_number":286,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"a5651537_385bcd1c","line":283,"range":{"start_line":283,"start_character":26,"end_line":283,"end_character":38},"updated":"2025-10-21 16:54:09.000000000","message":"Wait, do we not use the new arg in the new function, either?","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[{"line_number":280,"context_line":"}"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"int get_lrc_fragment_partition("},{"line_number":283,"context_line":"        int k, int m, int local_parity,"},{"line_number":284,"context_line":"        char **fragments, int num_fragments,"},{"line_number":285,"context_line":"        char **data, char **parity, int *missing)"},{"line_number":286,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"edb5f7cf_1753c8d0","line":283,"range":{"start_line":283,"start_character":26,"end_line":283,"end_character":38},"in_reply_to":"3a411033_5dda113f","updated":"2026-02-24 21:20:37.000000000","message":"Done","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"1fffc181e9bd20e892ba765945801632309fbd30","unresolved":true,"context_lines":[{"line_number":280,"context_line":"}"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"int get_lrc_fragment_partition("},{"line_number":283,"context_line":"        int k, int m, int local_parity,"},{"line_number":284,"context_line":"        char **fragments, int num_fragments,"},{"line_number":285,"context_line":"        char **data, char **parity, int *missing)"},{"line_number":286,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"3a411033_5dda113f","line":283,"range":{"start_line":283,"start_character":26,"end_line":283,"end_character":38},"in_reply_to":"a5651537_385bcd1c","updated":"2025-10-23 16:17:03.000000000","message":"sorry for duplicating some code, and I ended up by using different return","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"246d995adce671419efc8ec5296ae0ff62b21447","unresolved":true,"context_lines":[{"line_number":330,"context_line":"    }"},{"line_number":331,"context_line":"    // TODO: In general, it is possible to reconstruct one or more fragments"},{"line_number":332,"context_line":"    // when more than m fragments are missing (e.g. flat XOR codes)"},{"line_number":333,"context_line":"    return num_missing;"},{"line_number":334,"context_line":"}"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"__attribute__ ((visibility (\"internal\")))"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"d798b71f_43296fba","line":333,"updated":"2025-10-21 16:54:09.000000000","message":"Oh, this is a rather different return than what we had from `get_fragment_partition`.... hmm...\n\nBut it\u0027s also the *only* change from `get_fragment_partition` 😕","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"7c50040b34670f0af0d136b82e3eee96979abbe6","unresolved":true,"context_lines":[{"line_number":330,"context_line":"    }"},{"line_number":331,"context_line":"    // TODO: In general, it is possible to reconstruct one or more fragments"},{"line_number":332,"context_line":"    // when more than m fragments are missing (e.g. flat XOR codes)"},{"line_number":333,"context_line":"    return num_missing;"},{"line_number":334,"context_line":"}"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"__attribute__ ((visibility (\"internal\")))"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"67def39a_27f332ea","line":333,"in_reply_to":"111520a9_f623314a","updated":"2025-11-03 09:52:55.000000000","message":"I took a path to change less lines of existing code, so less chance to introduce a regression.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b796f0edf55a9235bb69093ea7fe49b07d24bfb2","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    }"},{"line_number":331,"context_line":"    // TODO: In general, it is possible to reconstruct one or more fragments"},{"line_number":332,"context_line":"    // when more than m fragments are missing (e.g. flat XOR codes)"},{"line_number":333,"context_line":"    return num_missing;"},{"line_number":334,"context_line":"}"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"__attribute__ ((visibility (\"internal\")))"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"b13d1c48_6e645553","line":333,"in_reply_to":"67def39a_27f332ea","updated":"2026-02-27 05:40:30.000000000","message":"We managed to ditch `get_lrc_fragment_partition` now; this is mooted.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"1fffc181e9bd20e892ba765945801632309fbd30","unresolved":true,"context_lines":[{"line_number":330,"context_line":"    }"},{"line_number":331,"context_line":"    // TODO: In general, it is possible to reconstruct one or more fragments"},{"line_number":332,"context_line":"    // when more than m fragments are missing (e.g. flat XOR codes)"},{"line_number":333,"context_line":"    return num_missing;"},{"line_number":334,"context_line":"}"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"__attribute__ ((visibility (\"internal\")))"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"f5592d25_3d03bfd6","line":333,"in_reply_to":"d798b71f_43296fba","updated":"2025-10-23 16:17:03.000000000","message":"Ok will change that to same function but return differently according to local_parity parameter","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5f4eac3c9ed65c726288e25f9ee9e0cfef28f540","unresolved":true,"context_lines":[{"line_number":330,"context_line":"    }"},{"line_number":331,"context_line":"    // TODO: In general, it is possible to reconstruct one or more fragments"},{"line_number":332,"context_line":"    // when more than m fragments are missing (e.g. flat XOR codes)"},{"line_number":333,"context_line":"    return num_missing;"},{"line_number":334,"context_line":"}"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"__attribute__ ((visibility (\"internal\")))"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"111520a9_f623314a","line":333,"in_reply_to":"f5592d25_3d03bfd6","updated":"2025-10-26 03:05:21.000000000","message":"So are we still working on getting the implementation we want for this `get_lrc_fragment_partition`? *Should* it in fact take a `local_parity` arg that influences how it behaves and under what circumstances we determine we don\u0027t have sufficient fragments?\n\nFWIW, I\u0027m a little skeptical of having this function return *either* a negative error code (L307) *or* some independently useful value (`num_missing`); it\u0027s going to make the handling in the caller a little more complicated than what we\u0027ve got with `get_fragment_partition` (which just does negative error code or 0 for success).","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"}],"test/liberasure_rs_isal_stress_test.c":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b796f0edf55a9235bb69093ea7fe49b07d24bfb2","unresolved":true,"context_lines":[{"line_number":189,"context_line":"    for(int x\u003d0; x \u003c orig_data_size; x++)"},{"line_number":190,"context_line":"    {"},{"line_number":191,"context_line":"        //printf(\"orig %c, new %c \\n\", orig_data[x], decoded_data[x]);"},{"line_number":192,"context_line":"    }"},{"line_number":193,"context_line":"    assert(memcmp(decoded_data, orig_data, orig_data_size) \u003d\u003d 0);"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    rc \u003d liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);"}],"source_content_type":"text/x-csrc","patch_set":25,"id":"b0deed1a_0881b9a4","line":192,"updated":"2026-02-27 05:40:30.000000000","message":"Should we drop this?","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e4571f0afd744abadcb6017305aa782ad8a7aede","unresolved":false,"context_lines":[{"line_number":189,"context_line":"    for(int x\u003d0; x \u003c orig_data_size; x++)"},{"line_number":190,"context_line":"    {"},{"line_number":191,"context_line":"        //printf(\"orig %c, new %c \\n\", orig_data[x], decoded_data[x]);"},{"line_number":192,"context_line":"    }"},{"line_number":193,"context_line":"    assert(memcmp(decoded_data, orig_data, orig_data_size) \u003d\u003d 0);"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    rc \u003d liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);"}],"source_content_type":"text/x-csrc","patch_set":25,"id":"3737b2e6_310ac39a","line":192,"in_reply_to":"12c030a9_60e54101","updated":"2026-03-02 23:59:24.000000000","message":"Done","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"a172bd5c192e4c9cac76c94615ec5c92ba342727","unresolved":true,"context_lines":[{"line_number":189,"context_line":"    for(int x\u003d0; x \u003c orig_data_size; x++)"},{"line_number":190,"context_line":"    {"},{"line_number":191,"context_line":"        //printf(\"orig %c, new %c \\n\", orig_data[x], decoded_data[x]);"},{"line_number":192,"context_line":"    }"},{"line_number":193,"context_line":"    assert(memcmp(decoded_data, orig_data, orig_data_size) \u003d\u003d 0);"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"    rc \u003d liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);"}],"source_content_type":"text/x-csrc","patch_set":25,"id":"12c030a9_60e54101","line":192,"in_reply_to":"b0deed1a_0881b9a4","updated":"2026-02-27 09:51:20.000000000","message":"Done","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b796f0edf55a9235bb69093ea7fe49b07d24bfb2","unresolved":true,"context_lines":[{"line_number":352,"context_line":"    if (argc !\u003d 6) {"},{"line_number":353,"context_line":"        printf(\"Stress Test with m missing positions for RS(k,m).\\n\");"},{"line_number":354,"context_line":"        printf(\"Number of iterations {nb_iter} should be at least ~ (k+m)!/(k!)(m!).\\n\");"},{"line_number":355,"context_line":"        printf(\"Usage: %s \u003cmessage_length\u003e \u003ctotal_parity_length\u003e \u003clocall_parity_length \u003cnb_iter\u003e\\n\", argv[0]);"},{"line_number":356,"context_line":"        return 0;"},{"line_number":357,"context_line":"    }"},{"line_number":358,"context_line":"    int backend \u003d atoi(argv[1]);"}],"source_content_type":"text/x-csrc","patch_set":25,"id":"8264f14e_04c77f46","line":355,"updated":"2026-02-27 05:40:30.000000000","message":"Should add `\u003cbackend_id\u003e`\n\nAlso, `s/\u003clocall_parity_length/\u003clocal_parity_length\u003e/`","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"a172bd5c192e4c9cac76c94615ec5c92ba342727","unresolved":true,"context_lines":[{"line_number":352,"context_line":"    if (argc !\u003d 6) {"},{"line_number":353,"context_line":"        printf(\"Stress Test with m missing positions for RS(k,m).\\n\");"},{"line_number":354,"context_line":"        printf(\"Number of iterations {nb_iter} should be at least ~ (k+m)!/(k!)(m!).\\n\");"},{"line_number":355,"context_line":"        printf(\"Usage: %s \u003cmessage_length\u003e \u003ctotal_parity_length\u003e \u003clocall_parity_length \u003cnb_iter\u003e\\n\", argv[0]);"},{"line_number":356,"context_line":"        return 0;"},{"line_number":357,"context_line":"    }"},{"line_number":358,"context_line":"    int backend \u003d atoi(argv[1]);"}],"source_content_type":"text/x-csrc","patch_set":25,"id":"66ad95fe_1dd29f79","line":355,"in_reply_to":"8264f14e_04c77f46","updated":"2026-02-27 09:51:20.000000000","message":"Done","commit_id":"fc3e09b33e56478d51f835806204d4cebc050381"}],"test/liberasurecode_test.c":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5f4eac3c9ed65c726288e25f9ee9e0cfef28f540","unresolved":true,"context_lines":[{"line_number":68,"context_line":"    .m \u003d 4,"},{"line_number":69,"context_line":"    .priv_args1.null_args.arg1 \u003d 11,"},{"line_number":70,"context_line":"    .ct \u003d CHKSUM_NONE,"},{"line_number":71,"context_line":"    .priv_args1.lrc_args.l \u003d 0,"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"};"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":6,"id":"7d4ae132_c54bbf69","line":71,"updated":"2025-10-26 03:05:21.000000000","message":"This is breaking my build locally:\n```\nliberasurecode_test.c:71:16: error: initializer overrides prior initialization of this subobject [-Werror,-Winitializer-overrides]\n   71 |     .priv_args1.lrc_args.l \u003d 0,\n      |                ^~~~~~~~~~~~~~~\nliberasurecode_test.c:69:26: note: previous initialization is here\n   69 |     .priv_args1.null_args.arg1 \u003d 11,\n      |                          ^~~~~~~~~~\n1 error generated.\n```\nI think we can just ditch it?","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"7c50040b34670f0af0d136b82e3eee96979abbe6","unresolved":true,"context_lines":[{"line_number":68,"context_line":"    .m \u003d 4,"},{"line_number":69,"context_line":"    .priv_args1.null_args.arg1 \u003d 11,"},{"line_number":70,"context_line":"    .ct \u003d CHKSUM_NONE,"},{"line_number":71,"context_line":"    .priv_args1.lrc_args.l \u003d 0,"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"};"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":6,"id":"896e2302_28334c02","line":71,"in_reply_to":"7d4ae132_c54bbf69","updated":"2025-11-03 09:52:55.000000000","message":"Ok will remove .lrc_args.l and apply your proposed patch","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    .m \u003d 4,"},{"line_number":69,"context_line":"    .priv_args1.null_args.arg1 \u003d 11,"},{"line_number":70,"context_line":"    .ct \u003d CHKSUM_NONE,"},{"line_number":71,"context_line":"    .priv_args1.lrc_args.l \u003d 0,"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"};"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":6,"id":"13d9581d_8cd32dec","line":71,"in_reply_to":"896e2302_28334c02","updated":"2025-11-05 23:12:44.000000000","message":"Done","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"5f4eac3c9ed65c726288e25f9ee9e0cfef28f540","unresolved":true,"context_lines":[{"line_number":902,"context_line":"    assert(out_frag !\u003d NULL);"},{"line_number":903,"context_line":"    rc \u003d liberasurecode_reconstruct_fragment(desc, encoded_data, 1, encoded_fragment_len, 1, out_frag);"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    assert(rc \u003d\u003d -EINSUFFFRAGS);"},{"line_number":906,"context_line":"    free(orig_data);"},{"line_number":907,"context_line":"    free(out_frag);"},{"line_number":908,"context_line":"    liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"7a67c97d_364ee91c","line":905,"updated":"2025-10-26 03:05:21.000000000","message":"Huh. I\u0027m get an assertion failure here locally... which is weird, because it clearly passes in the gate....\n\nI think it comes down to me applying\n```\ndiff --git a/test/liberasurecode_test.c b/test/liberasurecode_test.c\nindex 5219f11..e60c9c3 100644\n--- a/test/liberasurecode_test.c\n+++ b/test/liberasurecode_test.c\n@@ -68,7 +68,6 @@ struct ec_args null_args \u003d {\n     .m \u003d 4,\n     .priv_args1.null_args.arg1 \u003d 11,\n     .ct \u003d CHKSUM_NONE,\n-    .priv_args1.lrc_args.l \u003d 0,\n\n };\n```\nto fix my local build, but then the private null args `arg1` being 11 causes the current code to think we have `local_parity` 11, which eventually breaks things.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ed386086241986aa91b200fd1f778bfcdf05993","unresolved":false,"context_lines":[{"line_number":902,"context_line":"    assert(out_frag !\u003d NULL);"},{"line_number":903,"context_line":"    rc \u003d liberasurecode_reconstruct_fragment(desc, encoded_data, 1, encoded_fragment_len, 1, out_frag);"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    assert(rc \u003d\u003d -EINSUFFFRAGS);"},{"line_number":906,"context_line":"    free(orig_data);"},{"line_number":907,"context_line":"    free(out_frag);"},{"line_number":908,"context_line":"    liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"fbbd5944_993c5906","line":905,"in_reply_to":"0917ef7f_49177094","updated":"2025-11-05 23:12:44.000000000","message":"Done","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"7c50040b34670f0af0d136b82e3eee96979abbe6","unresolved":true,"context_lines":[{"line_number":902,"context_line":"    assert(out_frag !\u003d NULL);"},{"line_number":903,"context_line":"    rc \u003d liberasurecode_reconstruct_fragment(desc, encoded_data, 1, encoded_fragment_len, 1, out_frag);"},{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    assert(rc \u003d\u003d -EINSUFFFRAGS);"},{"line_number":906,"context_line":"    free(orig_data);"},{"line_number":907,"context_line":"    free(out_frag);"},{"line_number":908,"context_line":"    liberasurecode_encode_cleanup(desc, encoded_data, encoded_parity);"}],"source_content_type":"text/x-csrc","patch_set":6,"id":"0917ef7f_49177094","line":905,"in_reply_to":"7a67c97d_364ee91c","updated":"2025-11-03 09:52:55.000000000","message":"right, some test fails as this is interpreted as local_parity 11.","commit_id":"8e8c91fba99ab2ea3dcad250200472f2a812b437"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9f7f11bf4aa1755f27193e0c0a5705887039360","unresolved":true,"context_lines":[{"line_number":202,"context_line":"    .k \u003d 7,"},{"line_number":203,"context_line":"    .m \u003d 5,"},{"line_number":204,"context_line":"    .w \u003d 8,"},{"line_number":205,"context_line":"    .hd \u003d5,"},{"line_number":206,"context_line":"    .priv_args1.lrc_args.l \u003d 2,"},{"line_number":207,"context_line":"};"},{"line_number":208,"context_line":"struct ec_args isa_l_lrc_84_args \u003d {"}],"source_content_type":"text/x-csrc","patch_set":19,"id":"3b72762e_4edcb405","line":205,"updated":"2026-02-20 04:03:50.000000000","message":"Should this be 6 (\u003d `m + 1`), in keeping with the other RS codes?","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"c6f39370d34ea3881e6506e722cbc1c0a5470502","unresolved":true,"context_lines":[{"line_number":202,"context_line":"    .k \u003d 7,"},{"line_number":203,"context_line":"    .m \u003d 5,"},{"line_number":204,"context_line":"    .w \u003d 8,"},{"line_number":205,"context_line":"    .hd \u003d5,"},{"line_number":206,"context_line":"    .priv_args1.lrc_args.l \u003d 2,"},{"line_number":207,"context_line":"};"},{"line_number":208,"context_line":"struct ec_args isa_l_lrc_84_args \u003d {"}],"source_content_type":"text/x-csrc","patch_set":19,"id":"62fca61f_538a8acf","line":205,"in_reply_to":"3b72762e_4edcb405","updated":"2026-02-23 13:15:41.000000000","message":"Done","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[{"line_number":202,"context_line":"    .k \u003d 7,"},{"line_number":203,"context_line":"    .m \u003d 5,"},{"line_number":204,"context_line":"    .w \u003d 8,"},{"line_number":205,"context_line":"    .hd \u003d5,"},{"line_number":206,"context_line":"    .priv_args1.lrc_args.l \u003d 2,"},{"line_number":207,"context_line":"};"},{"line_number":208,"context_line":"struct ec_args isa_l_lrc_84_args \u003d {"}],"source_content_type":"text/x-csrc","patch_set":19,"id":"54504cb2_de8d9117","line":205,"in_reply_to":"62fca61f_538a8acf","updated":"2026-02-24 21:20:37.000000000","message":"Done","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9f7f11bf4aa1755f27193e0c0a5705887039360","unresolved":true,"context_lines":[{"line_number":1184,"context_line":"    /* Passing k+m frags for a k+(m-1) policy, we should notice the"},{"line_number":1185,"context_line":"     * too-high frag index and call its header \"bad\"."},{"line_number":1186,"context_line":"     */"},{"line_number":1187,"context_line":"    rc \u003d get_fragment_partition(null_args.k, null_args.m - 1,  avail_frags, num_avail_frags,"},{"line_number":1188,"context_line":"                                encoded_data, encoded_parity, missing);"},{"line_number":1189,"context_line":"    assert(-EBADHEADER \u003d\u003d rc);"},{"line_number":1190,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":19,"id":"70729a7d_2ce2ae7e","line":1187,"updated":"2026-02-20 04:03:50.000000000","message":"Stray edit?","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"20d0ef86db67d8a6406bf6404555455703249386","unresolved":false,"context_lines":[{"line_number":1184,"context_line":"    /* Passing k+m frags for a k+(m-1) policy, we should notice the"},{"line_number":1185,"context_line":"     * too-high frag index and call its header \"bad\"."},{"line_number":1186,"context_line":"     */"},{"line_number":1187,"context_line":"    rc \u003d get_fragment_partition(null_args.k, null_args.m - 1,  avail_frags, num_avail_frags,"},{"line_number":1188,"context_line":"                                encoded_data, encoded_parity, missing);"},{"line_number":1189,"context_line":"    assert(-EBADHEADER \u003d\u003d rc);"},{"line_number":1190,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":19,"id":"8bfd4b17_9b2c1735","line":1187,"in_reply_to":"2457f65a_36714c8c","updated":"2026-02-24 21:20:37.000000000","message":"Done","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"},{"author":{"_account_id":38169,"name":"Lhoussain AIT ASSOU","display_name":"aitassou","email":"lhoussain.ait-assou@ovhcloud.com","username":"aitassou"},"change_message_id":"c6f39370d34ea3881e6506e722cbc1c0a5470502","unresolved":true,"context_lines":[{"line_number":1184,"context_line":"    /* Passing k+m frags for a k+(m-1) policy, we should notice the"},{"line_number":1185,"context_line":"     * too-high frag index and call its header \"bad\"."},{"line_number":1186,"context_line":"     */"},{"line_number":1187,"context_line":"    rc \u003d get_fragment_partition(null_args.k, null_args.m - 1,  avail_frags, num_avail_frags,"},{"line_number":1188,"context_line":"                                encoded_data, encoded_parity, missing);"},{"line_number":1189,"context_line":"    assert(-EBADHEADER \u003d\u003d rc);"},{"line_number":1190,"context_line":""}],"source_content_type":"text/x-csrc","patch_set":19,"id":"2457f65a_36714c8c","line":1187,"in_reply_to":"70729a7d_2ce2ae7e","updated":"2026-02-23 13:15:41.000000000","message":"Done","commit_id":"44c2c486303f20b194f64a738e9dc859f056c768"}]}
