diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 7755b346b81ee6572aa44d972b14f3bed28a466b..0f84768e2a79bcb5c4cf0fe111d60c5e80c915a6 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -149,15 +149,27 @@ def pipelines Gitlab::PollingInterval.set_header(response, interval: 10_000) + serializer_options = { + disable_coverage: true, + disable_failed_builds: true, + preload: true + } + + if Feature.enabled?(:skip_status_preload_in_pipeline_lists, @project, type: :gitlab_com_derisk) + serializer_options.merge!( + disable_manual_and_scheduled_actions: true, + preload_statuses: false, + preload_downstream_statuses: false + ) + end + render json: { pipelines: PipelineSerializer .new(project: @project, current_user: @current_user) .with_pagination(request, response) .represent( @pipelines, - preload: true, - disable_failed_builds: true, - disable_coverage: true + **serializer_options ), count: { all: @pipelines.count diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb index 516aa70cf89626fdf425bf01d708ef7f57255e54..a87c4b722d87093488bd9c83ccc702d8853e35e0 100644 --- a/app/controllers/projects/pipelines_controller.rb +++ b/app/controllers/projects/pipelines_controller.rb @@ -226,14 +226,26 @@ def downloadable_artifacts private def serialize_pipelines + serializer_options = { + disable_coverage: true, + disable_manual_and_scheduled_actions: true, + preload: true + } + + if Feature.enabled?(:skip_status_preload_in_pipeline_lists, @project, type: :gitlab_com_derisk) + serializer_options.merge!( + disable_failed_builds: true, + preload_statuses: false, + preload_downstream_statuses: false + ) + end + PipelineSerializer .new(project: @project, current_user: @current_user) .with_pagination(request, response) .represent( @pipelines, - disable_coverage: true, - preload: true, - disable_manual_and_scheduled_actions: true + **serializer_options ) end diff --git a/app/serializers/pipeline_serializer.rb b/app/serializers/pipeline_serializer.rb index a3e842d348e520bf1c9f2a43c59d8484d28fd1ae..0a14988b08d522645e215267cc736fbfe3eb14c3 100644 --- a/app/serializers/pipeline_serializer.rb +++ b/app/serializers/pipeline_serializer.rb @@ -6,17 +6,9 @@ class PipelineSerializer < BaseSerializer # rubocop: disable CodeReuse/ActiveRecord def represent(resource, opts = {}) - if resource.is_a?(ActiveRecord::Relation) - resource = resource.preload(preloaded_relations) - end - - if paginated? - resource = paginator.paginate(resource) - end - - if opts.delete(:preload) - resource = Gitlab::Ci::Pipeline::Preloader.preload!(resource) - end + resource = resource.preload(preloaded_relations(**opts)) if resource.is_a?(ActiveRecord::Relation) + resource = paginator.paginate(resource) if paginated? + resource = Gitlab::Ci::Pipeline::Preloader.preload!(resource) if opts.delete(:preload) super(resource, opts) end @@ -38,15 +30,15 @@ def represent_stages(resource) private - def preloaded_relations + def preloaded_relations(preload_statuses: true, preload_downstream_statuses: true, **) [ :pipeline_metadata, :cancelable_statuses, :retryable_builds, :stages, - :latest_statuses, :trigger_requests, :user, + (:latest_statuses if preload_statuses), { manual_actions: :metadata, scheduled_actions: :metadata, @@ -59,15 +51,15 @@ def preloaded_relations project: [:route, { namespace: :route }], triggered_by_pipeline: [{ project: [:route, { namespace: :route }] }, :user], triggered_pipelines: [ + (:latest_statuses if preload_downstream_statuses), { project: [:route, { namespace: :route }] }, :source_job, - :latest_statuses, :user - ] + ].compact } - ] + ].compact end end diff --git a/config/feature_flags/gitlab_com_derisk/skip_status_preload_in_pipeline_lists.yml b/config/feature_flags/gitlab_com_derisk/skip_status_preload_in_pipeline_lists.yml new file mode 100644 index 0000000000000000000000000000000000000000..3758e2fce9b4db6cc63027c0aaeec9a82c230bb5 --- /dev/null +++ b/config/feature_flags/gitlab_com_derisk/skip_status_preload_in_pipeline_lists.yml @@ -0,0 +1,9 @@ +--- +name: skip_status_preload_in_pipeline_lists +feature_issue_url: +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/142947 +rollout_issue_url: https://gitlab.com/gitlab-com/gl-infra/production/-/issues/17482 +milestone: '16.9' +group: group::pipeline execution +type: gitlab_com_derisk +default_enabled: false diff --git a/ee/app/serializers/ee/pipeline_serializer.rb b/ee/app/serializers/ee/pipeline_serializer.rb index 82527eef4ce8f9c2707434af3f81f2de71ab3560..1de6b621cd6efd3b1ae631b9a99fca9a5ba2baad 100644 --- a/ee/app/serializers/ee/pipeline_serializer.rb +++ b/ee/app/serializers/ee/pipeline_serializer.rb @@ -6,7 +6,7 @@ module PipelineSerializer private - def preloaded_relations + def preloaded_relations(...) relations = super project_relation = relations.detect { |item| item.is_a?(Hash) }