Listing all parts in log have no sense. 
Should be either silenced, either combined into a single line.
}
            sum_marks_pk.fetch_add(ranges.getMarksCount(), std::memory_order_relaxed);
            for (const auto & index_and_condition : useful_indices)
                ranges.ranges = filterMarksUsingIndex(
                        index_and_condition.first, index_and_condition.second, part, ranges.ranges, settings, reader_settings, log);
            if (!ranges.ranges.empty())
            {
                if (limits.max_rows || leaf_limits.max_rows)
                {
                    
                    auto current_rows_estimate = ranges.getRowsCount();
                    size_t prev_total_rows_estimate = total_rows.fetch_add(current_rows_estimate);
                    size_t total_rows_estimate = current_rows_estimate + prev_total_rows_estimate;
                    limits.check(total_rows_estimate, 0, "rows (controlled by 'max_rows_to_read' setting)", ErrorCodes::TOO_MANY_ROWS);
                    leaf_limits.check(total_rows_estimate, 0, "rows (controlled by 'max_rows_to_read_leaf' setting)", ErrorCodes::TOO_MANY_ROWS);
                }
                parts_with_ranges[part_index] = std::move(ranges);
            }
        };
        size_t num_threads = std::min(size_t(num_streams), parts.size());
        if (num_threads <= 1)
        {
            for (size_t part_index = 0; part_index < parts.size(); ++part_index)
                process_part(part_index);
        }
        else
        {
            
            ThreadPool pool(num_threads);
            for (size_t part_index = 0; part_index < parts.size(); ++part_index)