mirror of
https://github.com/scylladb/scylladb.git
synced 2026-05-12 19:02:12 +00:00
Rewrite operations are scrub, cleanup and upgrade. Race can happen because 'selection of sstables' and 'mark sstables as compacting' are decoupled. So any deferring point in between can lead to a parallel compaction picking the same files. After commit2cf0c4bbf, files are marked as compacting before rewrite starts, but it didn't take into account the commitc84217adwhich moved retrieval of candidates to a deferring thread, before rewrite_sstables() is even called. Scrub isn't affected by this because it uses a coarse grained approach where whole operation is run with compaction disabled, which isn't good because regular compaction cannot run until its completion. From now on, selection of files and marking them as compacting will be serialized by running them with compaction disabled. Now cleanup will also retrieve sstables with compaction disabled, meaning it will no longer leave uncleaned files behind, which is important to avoid data resurrection if node regains ownership of data in uncleaned files. Fixes #8168. Refs #8155. [backport notes: - minor conflict around run_with_compaction_disabled() - bumped into our old friend https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95111, so I had to use std::ref() on local copy of lambda - with the yielding part of candidate retrieval now happening in rewrite_sstables(), task registration is moved to after run_with_ compaction_disabled() call, so the latter won't incorrectly try to stop the task that called it, which triggers an assert in debug mode. ] Signed-off-by: Raphael S. Carvalho <raphaelsc@scylladb.com> Message-Id: <20211129133107.53011-1-raphaelsc@scylladb.com> (cherry picked from commit80a1ebf0f3) Signed-off-by: Raphael S. Carvalho <raphaelsc@scylladb.com> Closes #10963