Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-03-23 03:09:09 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-03-23 03:09:09 +0300
commit5df6990daccf98d24f3ac45865d0386c3a4c3eb5 (patch)
treec2d2f2d59012d1dee0fadfdf6d321e0db23cbb9e /app/models
parentb489f0f0a1ebcea2044911b7b38837f072b7ee05 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/models')
-rw-r--r--app/models/ci/stage.rb1
-rw-r--r--app/models/clusters/agent_token.rb28
-rw-r--r--app/models/user.rb25
3 files changed, 48 insertions, 6 deletions
diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb
index 03a97355574..c49d088fe6b 100644
--- a/app/models/ci/stage.rb
+++ b/app/models/ci/stage.rb
@@ -19,6 +19,7 @@ module Ci
has_many :bridges, foreign_key: :stage_id
scope :ordered, -> { order(position: :asc) }
+ scope :in_pipelines, ->(pipelines) { where(pipeline: pipelines) }
with_options unless: :importing? do
validates :project, presence: true
diff --git a/app/models/clusters/agent_token.rb b/app/models/clusters/agent_token.rb
index 9d79887b574..b53bd30272a 100644
--- a/app/models/clusters/agent_token.rb
+++ b/app/models/clusters/agent_token.rb
@@ -2,11 +2,17 @@
module Clusters
class AgentToken < ApplicationRecord
+ include RedisCacheable
include TokenAuthenticatable
+
add_authentication_token_field :token, encrypted: :required, token_generator: -> { Devise.friendly_token(50) }
+ cached_attr_reader :last_contacted_at
self.table_name = 'cluster_agent_tokens'
+ # The `UPDATE_USED_COLUMN_EVERY` defines how often the token DB entry can be updated
+ UPDATE_USED_COLUMN_EVERY = (40.minutes..55.minutes).freeze
+
belongs_to :agent, class_name: 'Clusters::Agent', optional: false
belongs_to :created_by_user, class_name: 'User', optional: true
@@ -14,5 +20,27 @@ module Clusters
validates :description, length: { maximum: 1024 }
validates :name, presence: true, length: { maximum: 255 }, on: :create
+
+ def track_usage
+ track_values = { last_used_at: Time.current.utc }
+
+ cache_attributes(track_values)
+
+ # Use update_column so updated_at is skipped
+ update_columns(track_values) if can_update_track_values?
+ end
+
+ private
+
+ def can_update_track_values?
+ # Use a random threshold to prevent beating DB updates.
+ last_used_at_max_age = Random.rand(UPDATE_USED_COLUMN_EVERY)
+
+ real_last_used_at = read_attribute(:last_used_at)
+
+ # Handle too many updates from high token traffic
+ real_last_used_at.nil? ||
+ (Time.current - real_last_used_at) >= last_used_at_max_age
+ end
end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index 049c01256c1..f1cc937a19d 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -352,7 +352,12 @@ class User < ApplicationRecord
# this state transition object in order to do a rollback.
# For this reason the tradeoff is to disable this cop.
after_transition any => :blocked do |user|
- Ci::CancelUserPipelinesService.new.execute(user)
+ if Feature.enabled?(:abort_user_pipelines_on_block, user)
+ Ci::AbortPipelinesService.new.execute(user.pipelines)
+ else
+ Ci::CancelUserPipelinesService.new.execute(user)
+ end
+
Ci::DisableUserPipelineSchedulesService.new.execute(user)
end
# rubocop: enable CodeReuse/ServiceClass
@@ -1598,32 +1603,40 @@ class User < ApplicationRecord
@global_notification_setting
end
+ def count_cache_validity_period
+ if Feature.enabled?(:longer_count_cache_validity, self, default_enabled: :yaml)
+ 24.hours
+ else
+ 20.minutes
+ end
+ end
+
def assigned_open_merge_requests_count(force: false)
- Rails.cache.fetch(['users', id, 'assigned_open_merge_requests_count'], force: force, expires_in: 20.minutes) do
+ Rails.cache.fetch(['users', id, 'assigned_open_merge_requests_count'], force: force, expires_in: count_cache_validity_period) do
MergeRequestsFinder.new(self, assignee_id: self.id, state: 'opened', non_archived: true).execute.count
end
end
def review_requested_open_merge_requests_count(force: false)
- Rails.cache.fetch(['users', id, 'review_requested_open_merge_requests_count'], force: force, expires_in: 20.minutes) do
+ Rails.cache.fetch(['users', id, 'review_requested_open_merge_requests_count'], force: force, expires_in: count_cache_validity_period) do
MergeRequestsFinder.new(self, reviewer_id: id, state: 'opened', non_archived: true).execute.count
end
end
def assigned_open_issues_count(force: false)
- Rails.cache.fetch(['users', id, 'assigned_open_issues_count'], force: force, expires_in: 20.minutes) do
+ Rails.cache.fetch(['users', id, 'assigned_open_issues_count'], force: force, expires_in: count_cache_validity_period) do
IssuesFinder.new(self, assignee_id: self.id, state: 'opened', non_archived: true).execute.count
end
end
def todos_done_count(force: false)
- Rails.cache.fetch(['users', id, 'todos_done_count'], force: force, expires_in: 20.minutes) do
+ Rails.cache.fetch(['users', id, 'todos_done_count'], force: force, expires_in: count_cache_validity_period) do
TodosFinder.new(self, state: :done).execute.count
end
end
def todos_pending_count(force: false)
- Rails.cache.fetch(['users', id, 'todos_pending_count'], force: force, expires_in: 20.minutes) do
+ Rails.cache.fetch(['users', id, 'todos_pending_count'], force: force, expires_in: count_cache_validity_period) do
TodosFinder.new(self, state: :pending).execute.count
end
end