mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-28 12:17:02 +00:00
" Row level repair, when using a local reader, is prone to deadlocking on the streaming reader concurrency semaphore. This has been observed to happen with at least two participating nodes, running more concurrent repairs than the maximum allowed amount of reads by the concurrency semaphore. In this situation, it is possible that two repair instances, competing for the last available permits on both nodes, get a permit on one of the nodes and get queued on the other one respectively. As neither will let go of the permit it already acquired, nor give up waiting on the failed-to-acquired permit, a deadlock happens. To prevent this, we make the local repair reader evictable. For this we reuse the already existing evictable reader mechanism of the multishard combining reader. This patchset refactors this evictable reader mechanism into a standalone flat mutation reader, then exposes it to the outside world. The repair reader is paused after the repair buffer is filled, which is currently 32MB, so the cost of a possible reader recreation is amortized over 32MB read. The repair reader is said to be local, when it can use the shard-local partitioner. This is the case if the participating nodes are homogenous (their shard configuration is identical), that is the repair instance has to read just from one shard. A non-local reader uses the multishard reader, which already makes its shard readers evictable and hence is not prone to the deadlock described here. Fixes: #6272 Tests: unit(dev, release, debug) " * 'repair-row-level-evictable-local-reader/v3' of https://github.com/denesb/scylla: repair: row_level: destroy reader on EOS or error repair: row_level: use evictable_reader for local reads mutation_reader: expose evictable_reader mutation_reader: evictable_reader: add auto_pause flag mutation_reader: make evictable_reader a flat_mutation_reader mutation_reader: s/inactive_shard_read/inactive_evictable_reader/ mutation_reader: move inactive_shard_reader code up mutation_reader: fix indentation mutation_reader: shard_reader: extract remote_reader as evictable_reader mutation_reader: reader_lifecycle_policy: make semaphore() available early