For some reasons when we delete a MergeTree Part in atomic way something may go wrong - and leave the `delete_tmp_*` folder or it's part on disk. This may lead to a disk space consumption over time.

It's suggested to delete this folders at least at server start-up. Current solution with `clearOldTemporaryDirectories()` doesn't work because this method is called periodically from a thread without any locks or advisory on folders - it may cause the race conditions.
const DataPartPtr & part,
    std::unique_lock<std::mutex> & currently_processing_in_background_mutex_lock) const
{
    auto it = current_mutations_by_version.upper_bound(getUpdatedDataVersion(part, currently_processing_in_background_mutex_lock));
    if (it == current_mutations_by_version.begin())
        return 0;
    --it;
    return it->first;
}
size_t StorageMergeTree::clearOldMutations(bool truncate)
{
    size_t finished_mutations_to_keep = truncate ? 0 : getSettings()->finished_mutations_to_keep;
    std::vector<MergeTreeMutationEntry> mutations_to_delete;
    {
        std::unique_lock<std::mutex> lock(currently_processing_in_background_mutex);
        if (current_mutations_by_version.size() <= finished_mutations_to_keep)
            return 0;
        auto end_it = current_mutations_by_version.end();
        auto begin_it = current_mutations_by_version.begin();
        if (std::optional<Int64> min_version = getMinPartDataVersion())
            end_it = current_mutations_by_version.upper_bound(*min_version);
        size_t done_count = std::distance(begin_it, end_it);
        if (done_count <= finished_mutations_to_keep)
            return 0;
        auto part_versions_with_names = getSortedPartVersionsWithNames(lock);
        for (auto it = begin_it; it != end_it; ++it)
        {
            const PartVersionWithName needle{static_cast<Int64>(it->first), ""};