Chunk and meta servers: change "chunk available" policy from use available chunks only as the "last resort" when only last chunk replica / stripe is available, and relying on replication or recovery to restore the chunks, to use available chunks when possible, and use the replication or recovery as the "last resort". Change the race resolution policy between chunk available and chunk replication / recovery from always use the result of replication / recovery to "use available chunks when possible instead". Cancel recovery / replication if chunk with replication / recovery target version becomes available.
With chunk directory checker io time limit enforcement and hysteresis, "favoring" available chunks might help to minimize chunk loss with severe file system wide disk thrashing resulting in failures of most of the replication / recoveries scheduled by the meta server in response to the chunk directories becoming unavailable as a result of disk thrashing / DoS. The potential downside, besides the code complexity increase, is larger number of chunks remaining on the under-performing / "unreliable" disks in steady state / normal operational conditions. Io time limit enforcement in directory checker should help to minimize this effect.
Chunk replicator: use open file handle, instead of in-flight replications table, to detect stale replications, in order to simplify replication cancellation, and allow to remove replicated chunk entries from the chunk table at any time without taking into the account replicated chunks version and state. Fail replication or recovery if a stable "readable" chunk with the target version exists or becomes available, in order to minimize chunk loss in the state when the chunk replication or recovery is likely to fail due to disk thrashing for example.