Introduce endpoint optimisations
This commit is contained in:
parent
3015e768f5
commit
8a1c12aa6f
6 changed files with 31 additions and 34 deletions
|
@ -103,18 +103,13 @@ module Ci
|
|||
end
|
||||
|
||||
def playable?
|
||||
project.builds_enabled? && has_commands? &&
|
||||
action? && manual?
|
||||
action? && manual?
|
||||
end
|
||||
|
||||
def action?
|
||||
self.when == 'manual'
|
||||
end
|
||||
|
||||
def has_commands?
|
||||
commands.present?
|
||||
end
|
||||
|
||||
def play(current_user)
|
||||
# Try to queue a current build
|
||||
if self.enqueue
|
||||
|
@ -131,8 +126,7 @@ module Ci
|
|||
end
|
||||
|
||||
def retryable?
|
||||
project.builds_enabled? && has_commands? &&
|
||||
(success? || failed? || canceled?)
|
||||
success? || failed? || canceled?
|
||||
end
|
||||
|
||||
def retried?
|
||||
|
|
|
@ -12,6 +12,12 @@ module Ci
|
|||
has_many :builds, foreign_key: :commit_id
|
||||
has_many :trigger_requests, dependent: :destroy, foreign_key: :commit_id
|
||||
|
||||
has_many :pending_builds, -> { pending }, foreign_key: :commit_id, class_name: 'Ci::Build'
|
||||
has_many :retryable_builds, -> { latest.failed_or_canceled }, foreign_key: :commit_id, class_name: 'Ci::Build'
|
||||
has_many :cancelable_statuses, -> { cancelable }, foreign_key: :commit_id, class_name: 'CommitStatus'
|
||||
has_many :manual_actions, -> { latest.manual_actions }, foreign_key: :commit_id, class_name: 'Ci::Build'
|
||||
has_many :artifacts, -> { latest.with_artifacts_not_expired }, foreign_key: :commit_id, class_name: 'Ci::Build'
|
||||
|
||||
delegate :id, to: :project, prefix: true
|
||||
|
||||
validates :sha, presence: { unless: :importing? }
|
||||
|
@ -160,10 +166,6 @@ module Ci
|
|||
end
|
||||
end
|
||||
|
||||
def artifacts
|
||||
builds.latest.with_artifacts_not_expired.includes(project: [:namespace])
|
||||
end
|
||||
|
||||
def valid_commit_sha
|
||||
if self.sha == Gitlab::Git::BLANK_SHA
|
||||
self.errors.add(:sha, " cant be 00000000 (branch removal)")
|
||||
|
@ -200,27 +202,22 @@ module Ci
|
|||
!tag?
|
||||
end
|
||||
|
||||
def manual_actions
|
||||
builds.latest.manual_actions.includes(project: [:namespace])
|
||||
end
|
||||
|
||||
def stuck?
|
||||
builds.pending.includes(:project).any?(&:stuck?)
|
||||
pending_builds.any?(&:stuck?)
|
||||
end
|
||||
|
||||
def retryable?
|
||||
builds.latest.failed_or_canceled.any?(&:retryable?)
|
||||
retryable_builds.any?
|
||||
end
|
||||
|
||||
def cancelable?
|
||||
statuses.cancelable.any?
|
||||
cancelable_statuses.any?
|
||||
end
|
||||
|
||||
def cancel_running
|
||||
Gitlab::OptimisticLocking.retry_lock(
|
||||
statuses.cancelable) do |cancelable|
|
||||
cancelable.find_each(&:cancel)
|
||||
end
|
||||
Gitlab::OptimisticLocking.retry_lock(cancelable_statuses) do |cancelable|
|
||||
cancelable.find_each(&:cancel)
|
||||
end
|
||||
end
|
||||
|
||||
def retry_failed(current_user)
|
||||
|
|
|
@ -1093,15 +1093,23 @@ class Project < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def shared_runners
|
||||
shared_runners_available? ? Ci::Runner.shared : Ci::Runner.none
|
||||
@shared_runners ||= shared_runners_available? ? Ci::Runner.shared : Ci::Runner.none
|
||||
end
|
||||
|
||||
def active_runners
|
||||
@active_runners ||= runners.active
|
||||
end
|
||||
|
||||
def active_shared_runners
|
||||
@active_shared_runners ||= shared_runners.active
|
||||
end
|
||||
|
||||
def any_runners?(&block)
|
||||
if runners.active.any?(&block)
|
||||
if active_runners.any?(&block)
|
||||
return true
|
||||
end
|
||||
|
||||
shared_runners.active.any?(&block)
|
||||
active_shared_runners.any?(&block)
|
||||
end
|
||||
|
||||
def valid_runners_token?(token)
|
||||
|
|
|
@ -69,13 +69,13 @@ class PipelineEntity < Grape::Entity
|
|||
alias_method :pipeline, :object
|
||||
|
||||
def can_retry?
|
||||
pipeline.retryable? &&
|
||||
can?(request.user, :update_pipeline, pipeline)
|
||||
can?(request.user, :update_pipeline, pipeline) &&
|
||||
pipeline.retryable?
|
||||
end
|
||||
|
||||
def can_cancel?
|
||||
pipeline.cancelable? &&
|
||||
can?(request.user, :update_pipeline, pipeline)
|
||||
can?(request.user, :update_pipeline, pipeline) &&
|
||||
pipeline.cancelable?
|
||||
end
|
||||
|
||||
def detailed_status
|
||||
|
|
|
@ -7,9 +7,7 @@ module Ci
|
|||
raise Gitlab::Access::AccessDeniedError
|
||||
end
|
||||
|
||||
pipeline.builds.latest.failed_or_canceled.find_each do |build|
|
||||
next unless build.retryable?
|
||||
|
||||
pipeline.retryable_builds.find_each do |build|
|
||||
Ci::RetryBuildService.new(project, current_user)
|
||||
.reprocess(build)
|
||||
end
|
||||
|
|
|
@ -105,7 +105,7 @@ describe PipelineSerializer do
|
|||
|
||||
it "verifies number of queries" do
|
||||
recorded = ActiveRecord::QueryRecorder.new { subject }
|
||||
expect(recorded.count).to be_within(320).of(10)
|
||||
expect(recorded.count).to be_within(200).of(10)
|
||||
end
|
||||
|
||||
def create_pipeline(status)
|
||||
|
|
Loading…
Reference in a new issue