Share project and namespace in atomic pipeline processing

What does this MR do and why?

Ci::PipelineProcessing::AtomicProcessingService#load_jobs preloaded each batch of jobs with the with_project_preload scope, issuing fresh project and namespace queries per batch even though the service already holds both records (pipeline.project and its namespace).

This MR preloads the association explicitly with ActiveRecord::Associations::Preloader and available_records, so every loaded job shares the in-memory project and namespace instances instead of reloading them. Measured on the jobRetry GraphQL mutation with CI variables, this removes 6 SQL queries (90 → 84 in the progression measured on the proof of concept, see References).

Feature flag

Atomic processing runs on every pipeline processing pass, so the change is guarded by the ci_atomic_processing_preload_available_records derisk feature flag (disabled by default, actor: project). When disabled, the code falls back to the existing with_project_preload scope unchanged. Both states are covered by specs.

References

MR acceptance checklist

Evaluated against the MR acceptance checklist.

Merge request reports

Loading