mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-05 21:07:43 +00:00
3e4a7c1f6a
fix(ecstore): lockstep stripe read to stop EC GET desync truncation On the reconstruction-verifying GET path, ParallelReader::read used a data-first schedule: it read only `data_shards` readers per stripe and pulled in a parity reader as a substitute on demand. Because the shard readers are streaming (advanced only by being read, no seek), a parity reader first used mid-object was still positioned at its stream start (block 0) and returned an earlier stripe than the surviving data shards. Every shard passed its own bitrot hash, yet the set was mutually misaligned, so decode_data_with_reconstruction_verification correctly rejected it with "inconsistent read source shards" and the large-object GET truncated mid-stream (client "unexpected EOF"). Add read_lockstep(): on the verify_reconstruction path, read every live shard reader once per stripe and wait for all of them, so all readers advance one block per stripe and stay mutually aligned; any reader that errors is retired for the rest of the object (a stream that failed mid-block can no longer be trusted to be aligned). The adaptive data-first path is unchanged for non-verifying callers (e.g. heal). Adds a regression test reproducing a data shard that dies partway through a multi-stripe object; it must still reconstruct byte-exact output. Refs backlog#832.