Commit 5db533f6 authored by Grzegorz Bizon's avatar Grzegorz Bizon

Avoid inflating Redis memory when aborting pipelines

This commit makes it possible to find builds with stale build logs,
typically stored in Redis memory (or object storage), to clean these
logs up. This should eventually reduce Redis memory consumption.
parent a17818c1
......@@ -5,26 +5,29 @@ module Ci
# Danger: Cancels in bulk without callbacks
# Only for pipeline abandonment scenarios (examples: project delete, user block)
def execute(pipelines)
bulk_abort!(pipelines.cancelable, status: :canceled)
@time = Time.current
bulk_abort!(pipelines.cancelable, { status: :canceled })
ServiceResponse.success(message: 'Pipelines canceled')
end
private
def bulk_abort!(pipelines, status:)
def bulk_abort!(pipelines, attributes)
pipelines.each_batch(of: 100) do |pipeline_batch|
update_status_for(Ci::Stage, pipeline_batch, status)
update_status_for(CommitStatus, pipeline_batch, status)
pipeline_batch.update_all(status: status, finished_at: Time.current)
update_status_for(Ci::Stage, pipeline_batch, attributes)
update_status_for(CommitStatus, pipeline_batch, attributes.merge(finished_at: @time))
pipeline_batch.update_all(attributes.merge(finished_at: @time))
end
end
def update_status_for(klass, pipelines, status)
def update_status_for(klass, pipelines, attributes)
klass.in_pipelines(pipelines)
.cancelable
.in_batches(of: 150) # rubocop:disable Cop/InBatches
.update_all(status: status)
.update_all(attributes)
end
end
end
---
title: Avoid inflating Redis memory when aborting pipelines
merge_request: 59018
author:
type: fixed
......@@ -45,6 +45,22 @@ RSpec.describe Ci::AbortPipelinesService do
expect { described_class.new.execute(project_pipelines) }.not_to exceed_query_limit(control_count)
end
context 'with live build logs' do
before do
create(:ci_build_trace_chunk, build: cancelable_build)
end
it 'makes canceled builds with stale trace visible' do
expect(Ci::Build.with_stale_live_trace.count).to eq 0
travel_to(2.days.ago) do
described_class.new.execute(project.all_pipelines)
end
expect(Ci::Build.with_stale_live_trace.count).to eq 1
end
end
end
context 'with user pipelines' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment