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-11-18 16:16:36 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-11-18 16:16:36 +0300
commit311b0269b4eb9839fa63f80c8d7a58f32b8138a0 (patch)
tree07e7870bca8aed6d61fdcc810731c50d2c40af47 /app/services/projects
parent27909cef6c4170ed9205afa7426b8d3de47cbb0c (diff)
Add latest changes from gitlab-org/gitlab@14-5-stable-eev14.5.0-rc42
Diffstat (limited to 'app/services/projects')
-rw-r--r--app/services/projects/alerting/notify_service.rb15
-rw-r--r--app/services/projects/all_issues_count_service.rb15
-rw-r--r--app/services/projects/all_merge_requests_count_service.rb15
-rw-r--r--app/services/projects/container_repository/cache_tags_created_at_service.rb70
-rw-r--r--app/services/projects/container_repository/cleanup_tags_service.rb5
-rw-r--r--app/services/projects/create_service.rb10
-rw-r--r--app/services/projects/destroy_service.rb9
-rw-r--r--app/services/projects/detect_repository_languages_service.rb2
-rw-r--r--app/services/projects/import_export/export_service.rb11
-rw-r--r--app/services/projects/lfs_pointers/lfs_link_service.rb2
-rw-r--r--app/services/projects/participants_service.rb10
-rw-r--r--app/services/projects/prometheus/alerts/notify_service.rb19
12 files changed, 63 insertions, 120 deletions
diff --git a/app/services/projects/alerting/notify_service.rb b/app/services/projects/alerting/notify_service.rb
index a5ee7173bdf..e5d40b60747 100644
--- a/app/services/projects/alerting/notify_service.rb
+++ b/app/services/projects/alerting/notify_service.rb
@@ -5,6 +5,7 @@ module Projects
class NotifyService
extend ::Gitlab::Utils::Override
include ::AlertManagement::AlertProcessing
+ include ::AlertManagement::Responses
def initialize(project, payload)
@project = project
@@ -23,7 +24,7 @@ module Projects
complete_post_processing_tasks
- ServiceResponse.success
+ success(alert)
end
private
@@ -46,18 +47,6 @@ module Projects
def valid_token?(token)
token == integration.token
end
-
- def bad_request
- ServiceResponse.error(message: 'Bad Request', http_status: :bad_request)
- end
-
- def unauthorized
- ServiceResponse.error(message: 'Unauthorized', http_status: :unauthorized)
- end
-
- def forbidden
- ServiceResponse.error(message: 'Forbidden', http_status: :forbidden)
- end
end
end
end
diff --git a/app/services/projects/all_issues_count_service.rb b/app/services/projects/all_issues_count_service.rb
new file mode 100644
index 00000000000..15352b14d3e
--- /dev/null
+++ b/app/services/projects/all_issues_count_service.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Projects
+ # Service class for counting and caching the number of all issues of a
+ # project.
+ class AllIssuesCountService < Projects::CountService
+ def relation_for_count
+ @project.issues
+ end
+
+ def cache_key_name
+ 'all_issues_count'
+ end
+ end
+end
diff --git a/app/services/projects/all_merge_requests_count_service.rb b/app/services/projects/all_merge_requests_count_service.rb
new file mode 100644
index 00000000000..db0bab3f799
--- /dev/null
+++ b/app/services/projects/all_merge_requests_count_service.rb
@@ -0,0 +1,15 @@
+# frozen_string_literal: true
+
+module Projects
+ # Service class for counting and caching the number of all merge requests of
+ # a project.
+ class AllMergeRequestsCountService < Projects::CountService
+ def relation_for_count
+ @project.merge_requests
+ end
+
+ def cache_key_name
+ 'all_merge_requests_count'
+ end
+ end
+end
diff --git a/app/services/projects/container_repository/cache_tags_created_at_service.rb b/app/services/projects/container_repository/cache_tags_created_at_service.rb
deleted file mode 100644
index 3a5346d7a23..00000000000
--- a/app/services/projects/container_repository/cache_tags_created_at_service.rb
+++ /dev/null
@@ -1,70 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module ContainerRepository
- class CacheTagsCreatedAtService
- def initialize(container_repository)
- @container_repository = container_repository
- @cached_tag_names = Set.new
- end
-
- def populate(tags)
- return if tags.empty?
-
- # This will load all tags in one Redis roundtrip
- # the maximum number of tags is configurable and is set to 200 by default.
- # https://gitlab.com/gitlab-org/gitlab/blob/master/doc/user/packages/container_registry/index.md#set-cleanup-limits-to-conserve-resources
- keys = tags.map(&method(:cache_key))
- cached_tags_count = 0
-
- ::Gitlab::Redis::Cache.with do |redis|
- tags.zip(redis.mget(keys)).each do |tag, created_at|
- next unless created_at
-
- tag.created_at = DateTime.rfc3339(created_at)
- @cached_tag_names << tag.name
- cached_tags_count += 1
- end
- end
-
- cached_tags_count
- end
-
- def insert(tags, max_ttl_in_seconds)
- return unless max_ttl_in_seconds
- return if tags.empty?
-
- # tags with nil created_at are not cacheable
- # tags already cached don't need to be cached again
- cacheable_tags = tags.select do |tag|
- tag.created_at.present? && !tag.name.in?(@cached_tag_names)
- end
-
- return if cacheable_tags.empty?
-
- now = Time.zone.now
-
- ::Gitlab::Redis::Cache.with do |redis|
- # we use a pipeline instead of a MSET because each tag has
- # a specific ttl
- redis.pipelined do
- cacheable_tags.each do |tag|
- created_at = tag.created_at
- # ttl is the max_ttl_in_seconds reduced by the number
- # of seconds that the tag has already existed
- ttl = max_ttl_in_seconds - (now - created_at).seconds
- ttl = ttl.to_i
- redis.set(cache_key(tag), created_at.rfc3339, ex: ttl) if ttl > 0
- end
- end
- end
- end
-
- private
-
- def cache_key(tag)
- "container_repository:{#{@container_repository.id}}:tag:#{tag.name}:created_at"
- end
- end
- end
-end
diff --git a/app/services/projects/container_repository/cleanup_tags_service.rb b/app/services/projects/container_repository/cleanup_tags_service.rb
index 3a60de0f1ee..1a788abac12 100644
--- a/app/services/projects/container_repository/cleanup_tags_service.rb
+++ b/app/services/projects/container_repository/cleanup_tags_service.rb
@@ -140,14 +140,13 @@ module Projects
def cache
strong_memoize(:cache) do
- ::Projects::ContainerRepository::CacheTagsCreatedAtService.new(@container_repository)
+ ::Gitlab::ContainerRepository::Tags::Cache.new(@container_repository)
end
end
def caching_enabled?
container_expiration_policy &&
- older_than.present? &&
- Feature.enabled?(:container_registry_expiration_policies_caching, @project)
+ older_than.present?
end
def throttling_enabled?
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 1536f0a22b8..1d187b140ef 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -45,7 +45,7 @@ module Projects
if namespace_id
# Find matching namespace and check if it allowed
# for current user if namespace_id passed.
- unless current_user.can?(:create_projects, project_namespace)
+ unless current_user.can?(:create_projects, parent_namespace)
@project.namespace_id = nil
deny_namespace
return @project
@@ -136,7 +136,7 @@ module Projects
access_level: group_access_level)
end
- AuthorizedProjectUpdate::ProjectCreateWorker.perform_async(@project.id)
+ AuthorizedProjectUpdate::ProjectRecalculateWorker.perform_async(@project.id)
# AuthorizedProjectsWorker uses an exclusive lease per user but
# specialized workers might have synchronization issues. Until we
# compare the inconsistency rates of both approaches, we still run
@@ -227,14 +227,14 @@ module Projects
def extra_attributes_for_measurement
{
current_user: current_user&.name,
- project_full_path: "#{project_namespace&.full_path}/#{@params[:path]}"
+ project_full_path: "#{parent_namespace&.full_path}/#{@params[:path]}"
}
end
private
- def project_namespace
- @project_namespace ||= Namespace.find_by_id(@params[:namespace_id]) || current_user.namespace
+ def parent_namespace
+ @parent_namespace ||= Namespace.find_by_id(@params[:namespace_id]) || current_user.namespace
end
def create_from_template?
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index 27f813f4661..b7ed9202b01 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -152,9 +152,12 @@ module Projects
deleted_count = project.commit_statuses.delete_all
- if deleted_count > 0
- Gitlab::AppLogger.info "Projects::DestroyService - Project #{project.id} - #{deleted_count} leftover commit statuses"
- end
+ Gitlab::AppLogger.info(
+ class: 'Projects::DestroyService',
+ project_id: project.id,
+ message: 'leftover commit statuses',
+ orphaned_commit_status_count: deleted_count
+ )
end
# The project can have multiple webhooks with hundreds of thousands of web_hook_logs.
diff --git a/app/services/projects/detect_repository_languages_service.rb b/app/services/projects/detect_repository_languages_service.rb
index 0356a6b0ccd..9db0b71d106 100644
--- a/app/services/projects/detect_repository_languages_service.rb
+++ b/app/services/projects/detect_repository_languages_service.rb
@@ -21,7 +21,7 @@ module Projects
.update_all(share: update[:share])
end
- Gitlab::Database.main.bulk_insert( # rubocop:disable Gitlab/BulkInsert
+ ApplicationRecord.legacy_bulk_insert( # rubocop:disable Gitlab/BulkInsert
RepositoryLanguage.table_name,
detection.insertions(matching_programming_languages)
)
diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb
index 64c0f1ff4ac..b1a2182fbdc 100644
--- a/app/services/projects/import_export/export_service.rb
+++ b/app/services/projects/import_export/export_service.rb
@@ -36,6 +36,7 @@ module Projects
private
attr_accessor :shared
+ attr_reader :logger
def execute_after_export_action(after_export_strategy)
return unless after_export_strategy
@@ -74,7 +75,11 @@ module Projects
end
def project_tree_saver
- tree_saver_class.new(project: project, current_user: current_user, shared: shared, params: params)
+ tree_saver_class.new(project: project,
+ current_user: current_user,
+ shared: shared,
+ params: params,
+ logger: logger)
end
def tree_saver_class
@@ -116,7 +121,7 @@ module Projects
end
def notify_success
- @logger.info(
+ logger.info(
message: 'Project successfully exported',
project_name: project.name,
project_id: project.id
@@ -124,7 +129,7 @@ module Projects
end
def notify_error
- @logger.error(
+ logger.error(
message: 'Project export error',
export_errors: shared.errors.join(', '),
project_name: project.name,
diff --git a/app/services/projects/lfs_pointers/lfs_link_service.rb b/app/services/projects/lfs_pointers/lfs_link_service.rb
index 7c00b9e6105..cf3cc5cd8e0 100644
--- a/app/services/projects/lfs_pointers/lfs_link_service.rb
+++ b/app/services/projects/lfs_pointers/lfs_link_service.rb
@@ -38,7 +38,7 @@ module Projects
rows = existent_lfs_objects
.not_linked_to_project(project)
.map { |existing_lfs_object| { project_id: project.id, lfs_object_id: existing_lfs_object.id } }
- Gitlab::Database.main.bulk_insert(:lfs_objects_projects, rows) # rubocop:disable Gitlab/BulkInsert
+ ApplicationRecord.legacy_bulk_insert(:lfs_objects_projects, rows) # rubocop:disable Gitlab/BulkInsert
iterations += 1
linked_existing_objects += existent_lfs_objects.map(&:oid)
diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb
index 1616a8a4062..152590fffff 100644
--- a/app/services/projects/participants_service.rb
+++ b/app/services/projects/participants_service.rb
@@ -36,17 +36,9 @@ module Projects
private
def project_members_through_invited_groups
- groups_with_ancestors = if ::Feature.enabled?(:linear_participants_service_ancestor_scopes, current_user, default_enabled: :yaml)
- visible_groups.self_and_ancestors
- else
- Gitlab::ObjectHierarchy
- .new(visible_groups)
- .base_and_ancestors
- end
-
GroupMember
.active_without_invites_and_requests
- .with_source_id(groups_with_ancestors.pluck_primary_key)
+ .with_source_id(visible_groups.self_and_ancestors.pluck_primary_key)
end
def visible_groups
diff --git a/app/services/projects/prometheus/alerts/notify_service.rb b/app/services/projects/prometheus/alerts/notify_service.rb
index c1bf2e68436..56f65718d24 100644
--- a/app/services/projects/prometheus/alerts/notify_service.rb
+++ b/app/services/projects/prometheus/alerts/notify_service.rb
@@ -6,6 +6,7 @@ module Projects
class NotifyService
include Gitlab::Utils::StrongMemoize
include ::IncidentManagement::Settings
+ include ::AlertManagement::Responses
# This set of keys identifies a payload as a valid Prometheus
# payload and thus processable by this service. See also
@@ -27,9 +28,9 @@ module Projects
return unprocessable_entity unless self.class.processable?(payload)
return unauthorized unless valid_alert_manager_token?(token, integration)
- process_prometheus_alerts
+ alert_responses = process_prometheus_alerts
- ServiceResponse.success
+ alert_response(alert_responses)
end
def self.processable?(payload)
@@ -128,23 +129,17 @@ module Projects
end
def process_prometheus_alerts
- alerts.each do |alert|
+ alerts.map do |alert|
AlertManagement::ProcessPrometheusAlertService
.new(project, alert.to_h)
.execute
end
end
- def bad_request
- ServiceResponse.error(message: 'Bad Request', http_status: :bad_request)
- end
-
- def unauthorized
- ServiceResponse.error(message: 'Unauthorized', http_status: :unauthorized)
- end
+ def alert_response(alert_responses)
+ alerts = alert_responses.map { |resp| resp.payload[:alert] }.compact
- def unprocessable_entity
- ServiceResponse.error(message: 'Unprocessable Entity', http_status: :unprocessable_entity)
+ success(alerts)
end
end
end