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-05-19 18:44:42 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-05-19 18:44:42 +0300
commit4555e1b21c365ed8303ffb7a3325d773c9b8bf31 (patch)
tree5423a1c7516cffe36384133ade12572cf709398d /app/services/projects
parente570267f2f6b326480d284e0164a6464ba4081bc (diff)
Add latest changes from gitlab-org/gitlab@13-12-stable-eev13.12.0-rc42
Diffstat (limited to 'app/services/projects')
-rw-r--r--app/services/projects/after_rename_service.rb8
-rw-r--r--app/services/projects/autocomplete_service.rb2
-rw-r--r--app/services/projects/cleanup_service.rb2
-rw-r--r--app/services/projects/create_from_template_service.rb2
-rw-r--r--app/services/projects/create_service.rb17
-rw-r--r--app/services/projects/destroy_service.rb24
-rw-r--r--app/services/projects/disable_deploy_key_service.rb2
-rw-r--r--app/services/projects/enable_deploy_key_service.rb2
-rw-r--r--app/services/projects/gitlab_projects_import_service.rb2
-rw-r--r--app/services/projects/group_links/create_service.rb2
-rw-r--r--app/services/projects/group_links/destroy_service.rb2
-rw-r--r--app/services/projects/hashed_storage/migrate_attachments_service.rb2
-rw-r--r--app/services/projects/hashed_storage/migrate_repository_service.rb2
-rw-r--r--app/services/projects/housekeeping_service.rb16
-rw-r--r--app/services/projects/import_export/export_service.rb2
-rw-r--r--app/services/projects/import_service.rb4
-rw-r--r--app/services/projects/lfs_pointers/lfs_import_service.rb2
-rw-r--r--app/services/projects/operations/update_service.rb2
-rw-r--r--app/services/projects/prometheus/alerts/notify_service.rb18
-rw-r--r--app/services/projects/transfer_service.rb14
-rw-r--r--app/services/projects/unlink_fork_service.rb2
-rw-r--r--app/services/projects/update_pages_configuration_service.rb2
-rw-r--r--app/services/projects/update_pages_service.rb6
-rw-r--r--app/services/projects/update_remote_mirror_service.rb2
-rw-r--r--app/services/projects/update_service.rb8
-rw-r--r--app/services/projects/update_statistics_service.rb35
26 files changed, 104 insertions, 78 deletions
diff --git a/app/services/projects/after_rename_service.rb b/app/services/projects/after_rename_service.rb
index a2cdb87e631..6d389035922 100644
--- a/app/services/projects/after_rename_service.rb
+++ b/app/services/projects/after_rename_service.rb
@@ -49,10 +49,8 @@ module Projects
def first_ensure_no_registry_tags_are_present
return unless project.has_container_registry_tags?
- raise RenameFailedError.new(
- "Project #{full_path_before} cannot be renamed because images are " \
+ raise RenameFailedError, "Project #{full_path_before} cannot be renamed because images are " \
"present in its container registry"
- )
end
def expire_caches_before_rename
@@ -144,9 +142,9 @@ module Projects
Gitlab::AppLogger.error(error)
- raise RenameFailedError.new(error)
+ raise RenameFailedError, error
end
end
end
-Projects::AfterRenameService.prepend_if_ee('EE::Projects::AfterRenameService')
+Projects::AfterRenameService.prepend_mod_with('Projects::AfterRenameService')
diff --git a/app/services/projects/autocomplete_service.rb b/app/services/projects/autocomplete_service.rb
index 68086f636b7..55f16aa3e3d 100644
--- a/app/services/projects/autocomplete_service.rb
+++ b/app/services/projects/autocomplete_service.rb
@@ -39,4 +39,4 @@ module Projects
end
end
-Projects::AutocompleteService.prepend_if_ee('EE::Projects::AutocompleteService')
+Projects::AutocompleteService.prepend_mod_with('Projects::AutocompleteService')
diff --git a/app/services/projects/cleanup_service.rb b/app/services/projects/cleanup_service.rb
index 7bcaee75813..5eafa5f9b29 100644
--- a/app/services/projects/cleanup_service.rb
+++ b/app/services/projects/cleanup_service.rb
@@ -108,4 +108,4 @@ module Projects
end
end
-Projects::CleanupService.prepend_if_ee('EE::Projects::CleanupService')
+Projects::CleanupService.prepend_mod_with('Projects::CleanupService')
diff --git a/app/services/projects/create_from_template_service.rb b/app/services/projects/create_from_template_service.rb
index 3c66ff709c9..48dda09da71 100644
--- a/app/services/projects/create_from_template_service.rb
+++ b/app/services/projects/create_from_template_service.rb
@@ -58,4 +58,4 @@ module Projects
end
end
-Projects::CreateFromTemplateService.prepend_if_ee('EE::Projects::CreateFromTemplateService')
+Projects::CreateFromTemplateService.prepend_mod_with('Projects::CreateFromTemplateService')
diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb
index 5fb0bda912e..97ea7d87545 100644
--- a/app/services/projects/create_service.rb
+++ b/app/services/projects/create_service.rb
@@ -40,7 +40,7 @@ module Projects
if namespace_id
# Find matching namespace and check if it allowed
# for current user if namespace_id passed.
- unless allowed_namespace?(current_user, namespace_id)
+ unless current_user.can?(:create_projects, project_namespace)
@project.namespace_id = nil
deny_namespace
return @project
@@ -72,7 +72,7 @@ module Projects
rescue ActiveRecord::RecordInvalid => e
message = "Unable to save #{e.inspect}: #{e.record.errors.full_messages.join(", ")}"
fail(error: message)
- rescue => e
+ rescue StandardError => e
@project.errors.add(:base, e.message) if @project
fail(error: e.message)
end
@@ -83,13 +83,6 @@ module Projects
@project.errors.add(:namespace, "is not valid")
end
- # rubocop: disable CodeReuse/ActiveRecord
- def allowed_namespace?(user, namespace_id)
- namespace = Namespace.find_by(id: namespace_id)
- current_user.can?(:create_projects, namespace)
- end
- # rubocop: enable CodeReuse/ActiveRecord
-
def after_create_actions
log_info("#{@project.owner.name} created a new project \"#{@project.full_name}\"")
@@ -156,7 +149,7 @@ module Projects
def create_readme
commit_attrs = {
- branch_name: @project.default_branch || 'master',
+ branch_name: @project.default_branch_or_main,
commit_message: 'Initial commit',
file_path: 'README.md',
file_content: "# #{@project.name}\n\n#{@project.description}"
@@ -174,7 +167,7 @@ module Projects
@project.create_or_update_import_data(data: @import_data[:data], credentials: @import_data[:credentials]) if @import_data
if @project.save
- Service.create_from_active_default_integrations(@project, :project_id, with_templates: true)
+ Integration.create_from_active_default_integrations(@project, :project_id, with_templates: true)
@project.create_labels unless @project.gitlab_project_import?
@@ -271,7 +264,7 @@ module Projects
end
end
-Projects::CreateService.prepend_if_ee('EE::Projects::CreateService')
+Projects::CreateService.prepend_mod_with('Projects::CreateService')
# Measurable should be at the bottom of the ancestor chain, so it will measure execution of EE::Projects::CreateService as well
Projects::CreateService.prepend(Measurable)
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb
index 4ba48f74273..0682f3013d4 100644
--- a/app/services/projects/destroy_service.rb
+++ b/app/services/projects/destroy_service.rb
@@ -41,7 +41,7 @@ module Projects
current_user.invalidate_personal_projects_count
true
- rescue => error
+ rescue StandardError => error
attempt_rollback(project, error.message)
false
rescue Exception => error # rubocop:disable Lint/RescueException
@@ -116,6 +116,7 @@ module Projects
log_destroy_event
trash_relation_repositories!
trash_project_repositories!
+ destroy_web_hooks! if Feature.enabled?(:destroy_webhooks_before_the_project, project, default_enabled: :yaml)
# Rails attempts to load all related records into memory before
# destroying: https://github.com/rails/rails/issues/22510
@@ -131,6 +132,23 @@ module Projects
log_info("Attempting to destroy #{project.full_path} (#{project.id})")
end
+ # The project can have multiple webhooks with hundreds of thousands of web_hook_logs.
+ # By default, they are removed with "DELETE CASCADE" option defined via foreign_key.
+ # But such queries can exceed the statement_timeout limit and fail to delete the project.
+ # (see https://gitlab.com/gitlab-org/gitlab/-/issues/26259)
+ #
+ # To prevent that we use WebHooks::DestroyService. It deletes logs in batches and
+ # produces smaller and faster queries to the database.
+ def destroy_web_hooks!
+ project.hooks.find_each do |web_hook|
+ result = ::WebHooks::DestroyService.new(current_user).sync_destroy(web_hook)
+
+ unless result[:status] == :success
+ raise_error(s_('DeleteProject|Failed to remove webhooks. Please try again or contact administrator.'))
+ end
+ end
+ end
+
def remove_registry_tags
return true unless Gitlab.config.registry.enabled
return false unless remove_legacy_registry_tags
@@ -156,7 +174,7 @@ module Projects
end
def raise_error(message)
- raise DestroyError.new(message)
+ raise DestroyError, message
end
def flush_caches(project)
@@ -165,4 +183,4 @@ module Projects
end
end
-Projects::DestroyService.prepend_if_ee('EE::Projects::DestroyService')
+Projects::DestroyService.prepend_mod_with('Projects::DestroyService')
diff --git a/app/services/projects/disable_deploy_key_service.rb b/app/services/projects/disable_deploy_key_service.rb
index 9fb2e3398b2..e0f309875de 100644
--- a/app/services/projects/disable_deploy_key_service.rb
+++ b/app/services/projects/disable_deploy_key_service.rb
@@ -12,4 +12,4 @@ module Projects
end
end
-Projects::DisableDeployKeyService.prepend_if_ee('EE::Projects::DisableDeployKeyService')
+Projects::DisableDeployKeyService.prepend_mod_with('Projects::DisableDeployKeyService')
diff --git a/app/services/projects/enable_deploy_key_service.rb b/app/services/projects/enable_deploy_key_service.rb
index 0a24137bd61..581a6cc0ade 100644
--- a/app/services/projects/enable_deploy_key_service.rb
+++ b/app/services/projects/enable_deploy_key_service.rb
@@ -27,4 +27,4 @@ module Projects
end
end
-Projects::EnableDeployKeyService.prepend_if_ee('EE::Projects::EnableDeployKeyService')
+Projects::EnableDeployKeyService.prepend_mod_with('Projects::EnableDeployKeyService')
diff --git a/app/services/projects/gitlab_projects_import_service.rb b/app/services/projects/gitlab_projects_import_service.rb
index 38f0e2f7c1a..63a41d172ea 100644
--- a/app/services/projects/gitlab_projects_import_service.rb
+++ b/app/services/projects/gitlab_projects_import_service.rb
@@ -77,4 +77,4 @@ module Projects
end
end
-Projects::GitlabProjectsImportService.prepend_if_ee('EE::Projects::GitlabProjectsImportService')
+Projects::GitlabProjectsImportService.prepend_mod_with('Projects::GitlabProjectsImportService')
diff --git a/app/services/projects/group_links/create_service.rb b/app/services/projects/group_links/create_service.rb
index 3262839e246..d8fa2f36fcc 100644
--- a/app/services/projects/group_links/create_service.rb
+++ b/app/services/projects/group_links/create_service.rb
@@ -44,4 +44,4 @@ module Projects
end
end
-Projects::GroupLinks::CreateService.prepend_if_ee('EE::Projects::GroupLinks::CreateService')
+Projects::GroupLinks::CreateService.prepend_mod_with('Projects::GroupLinks::CreateService')
diff --git a/app/services/projects/group_links/destroy_service.rb b/app/services/projects/group_links/destroy_service.rb
index 229191e41f6..bfe704cd780 100644
--- a/app/services/projects/group_links/destroy_service.rb
+++ b/app/services/projects/group_links/destroy_service.rb
@@ -20,4 +20,4 @@ module Projects
end
end
-Projects::GroupLinks::DestroyService.prepend_if_ee('EE::Projects::GroupLinks::DestroyService')
+Projects::GroupLinks::DestroyService.prepend_mod_with('Projects::GroupLinks::DestroyService')
diff --git a/app/services/projects/hashed_storage/migrate_attachments_service.rb b/app/services/projects/hashed_storage/migrate_attachments_service.rb
index 3d9d03c4a95..023f8494d99 100644
--- a/app/services/projects/hashed_storage/migrate_attachments_service.rb
+++ b/app/services/projects/hashed_storage/migrate_attachments_service.rb
@@ -64,4 +64,4 @@ module Projects
end
end
-Projects::HashedStorage::MigrateAttachmentsService.prepend_if_ee('EE::Projects::HashedStorage::MigrateAttachmentsService')
+Projects::HashedStorage::MigrateAttachmentsService.prepend_mod_with('Projects::HashedStorage::MigrateAttachmentsService')
diff --git a/app/services/projects/hashed_storage/migrate_repository_service.rb b/app/services/projects/hashed_storage/migrate_repository_service.rb
index adc7e38e4d5..c7989e04607 100644
--- a/app/services/projects/hashed_storage/migrate_repository_service.rb
+++ b/app/services/projects/hashed_storage/migrate_repository_service.rb
@@ -52,4 +52,4 @@ module Projects
end
end
-Projects::HashedStorage::MigrateRepositoryService.prepend_if_ee('EE::Projects::HashedStorage::MigrateRepositoryService')
+Projects::HashedStorage::MigrateRepositoryService.prepend_mod_with('Projects::HashedStorage::MigrateRepositoryService')
diff --git a/app/services/projects/housekeeping_service.rb b/app/services/projects/housekeeping_service.rb
deleted file mode 100644
index b5589d556aa..00000000000
--- a/app/services/projects/housekeeping_service.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-# This is a compatibility class to avoid calling a non-existent
-# class from sidekiq during deployment.
-#
-# We're deploying the rename of this class in 13.9. Nevertheless,
-# we cannot remove this class entirely because there can be jobs
-# referencing it.
-#
-# We can get rid of this class in 13.10
-# https://gitlab.com/gitlab-org/gitlab/-/issues/297580
-#
-module Projects
- class HousekeepingService < ::Repositories::HousekeepingService
- end
-end
diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb
index c2a8db7b657..64c0f1ff4ac 100644
--- a/app/services/projects/import_export/export_service.rb
+++ b/app/services/projects/import_export/export_service.rb
@@ -112,7 +112,7 @@ module Projects
def notify_error!
notify_error
- raise Gitlab::ImportExport::Error.new(shared.errors.to_sentence)
+ raise Gitlab::ImportExport::Error, shared.errors.to_sentence
end
def notify_success
diff --git a/app/services/projects/import_service.rb b/app/services/projects/import_service.rb
index b4abb5b6df7..b5288aad6f0 100644
--- a/app/services/projects/import_service.rb
+++ b/app/services/projects/import_service.rb
@@ -29,7 +29,7 @@ module Projects
Gitlab::ErrorTracking.track_exception(e, project_path: project.full_path, importer: project.import_type)
error(s_("ImportProjects|Error importing repository %{project_safe_import_url} into %{project_full_path} - %{message}") % { project_safe_import_url: project.safe_import_url, project_full_path: project.full_path, message: e.message })
- rescue => e
+ rescue StandardError => e
message = Projects::ImportErrorFilter.filter_message(e.message)
Gitlab::ErrorTracking.track_exception(e, project_path: project.full_path, importer: project.import_type)
@@ -149,7 +149,7 @@ module Projects
end
end
-Projects::ImportService.prepend_if_ee('EE::Projects::ImportService')
+Projects::ImportService.prepend_mod_with('Projects::ImportService')
# Measurable should be at the bottom of the ancestor chain, so it will measure execution of EE::Projects::ImportService as well
Projects::ImportService.prepend(Measurable)
diff --git a/app/services/projects/lfs_pointers/lfs_import_service.rb b/app/services/projects/lfs_pointers/lfs_import_service.rb
index 2afcce7099b..3fc82f2c410 100644
--- a/app/services/projects/lfs_pointers/lfs_import_service.rb
+++ b/app/services/projects/lfs_pointers/lfs_import_service.rb
@@ -16,7 +16,7 @@ module Projects
end
success
- rescue => e
+ rescue StandardError => e
error(e.message)
end
end
diff --git a/app/services/projects/operations/update_service.rb b/app/services/projects/operations/update_service.rb
index 7dfe7fffa1b..c0734171ee5 100644
--- a/app/services/projects/operations/update_service.rb
+++ b/app/services/projects/operations/update_service.rb
@@ -135,4 +135,4 @@ module Projects
end
end
-Projects::Operations::UpdateService.prepend_if_ee('::EE::Projects::Operations::UpdateService')
+Projects::Operations::UpdateService.prepend_mod_with('Projects::Operations::UpdateService')
diff --git a/app/services/projects/prometheus/alerts/notify_service.rb b/app/services/projects/prometheus/alerts/notify_service.rb
index 93165a58470..db640a54745 100644
--- a/app/services/projects/prometheus/alerts/notify_service.rb
+++ b/app/services/projects/prometheus/alerts/notify_service.rb
@@ -63,7 +63,7 @@ module Projects
def valid_alert_manager_token?(token, integration)
valid_for_manual?(token) ||
valid_for_alerts_endpoint?(token, integration) ||
- valid_for_managed?(token)
+ valid_for_cluster?(token)
end
def valid_for_manual?(token)
@@ -83,18 +83,20 @@ module Projects
compare_token(token, integration.token)
end
- def valid_for_managed?(token)
- prometheus_application = available_prometheus_application(project)
- return false unless prometheus_application
+ def valid_for_cluster?(token)
+ cluster_integration = find_cluster_integration(project)
+ return false unless cluster_integration
+
+ cluster_integration_token = cluster_integration.alert_manager_token
if token
- compare_token(token, prometheus_application.alert_manager_token)
+ compare_token(token, cluster_integration_token)
else
- prometheus_application.alert_manager_token.nil?
+ cluster_integration_token.nil?
end
end
- def available_prometheus_application(project)
+ def find_cluster_integration(project)
alert_id = gitlab_alert_id
return unless alert_id
@@ -105,7 +107,7 @@ module Projects
return unless cluster&.enabled?
return unless cluster.application_prometheus_available?
- cluster.application_prometheus
+ cluster.application_prometheus || cluster.integration_prometheus
end
def find_alert(project, metric)
diff --git a/app/services/projects/transfer_service.rb b/app/services/projects/transfer_service.rb
index 8a5e0706126..d9e49dfae61 100644
--- a/app/services/projects/transfer_service.rb
+++ b/app/services/projects/transfer_service.rb
@@ -47,16 +47,16 @@ module Projects
@old_namespace = project.namespace
if Project.where(namespace_id: @new_namespace.try(:id)).where('path = ? or name = ?', project.path, project.name).exists?
- raise TransferError.new(s_("TransferProject|Project with same name or path in target namespace already exists"))
+ raise TransferError, s_("TransferProject|Project with same name or path in target namespace already exists")
end
if project.has_container_registry_tags?
# We currently don't support renaming repository if it contains tags in container registry
- raise TransferError.new(s_('TransferProject|Project cannot be transferred, because tags are present in its container registry'))
+ raise TransferError, s_('TransferProject|Project cannot be transferred, because tags are present in its container registry')
end
if project.has_packages?(:npm) && !new_namespace_has_same_root?(project)
- raise TransferError.new(s_("TransferProject|Root namespace can't be updated if project has NPM packages"))
+ raise TransferError, s_("TransferProject|Root namespace can't be updated if project has NPM packages")
end
proceed_to_transfer
@@ -170,7 +170,7 @@ module Projects
# Move main repository
unless move_repo_folder(@old_path, @new_path)
- raise TransferError.new(s_("TransferProject|Cannot move project"))
+ raise TransferError, s_("TransferProject|Cannot move project")
end
# Disk path is changed; we need to ensure we reload it
@@ -223,10 +223,10 @@ module Projects
end
def update_integrations
- project.services.inherit.delete_all
- Service.create_from_active_default_integrations(project, :project_id)
+ project.integrations.inherit.delete_all
+ Integration.create_from_active_default_integrations(project, :project_id)
end
end
end
-Projects::TransferService.prepend_if_ee('EE::Projects::TransferService')
+Projects::TransferService.prepend_mod_with('Projects::TransferService')
diff --git a/app/services/projects/unlink_fork_service.rb b/app/services/projects/unlink_fork_service.rb
index 91632e50ba8..9eccc16a8b2 100644
--- a/app/services/projects/unlink_fork_service.rb
+++ b/app/services/projects/unlink_fork_service.rb
@@ -17,7 +17,7 @@ module Projects
.from_and_to_forks(@project)
merge_requests.find_each do |mr|
- ::MergeRequests::CloseService.new(@project, @current_user).execute(mr)
+ ::MergeRequests::CloseService.new(project: @project, current_user: @current_user).execute(mr)
log_info(message: "UnlinkForkService: Closed merge request", merge_request_id: mr.id)
end
diff --git a/app/services/projects/update_pages_configuration_service.rb b/app/services/projects/update_pages_configuration_service.rb
index b63903c6c61..4272e1dc8b6 100644
--- a/app/services/projects/update_pages_configuration_service.rb
+++ b/app/services/projects/update_pages_configuration_service.rb
@@ -102,7 +102,7 @@ module Projects
File.open(file, 'r') do |f|
f.read
end
- rescue
+ rescue StandardError
nil
end
end
diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb
index 6fa42b293c5..8ea35131339 100644
--- a/app/services/projects/update_pages_service.rb
+++ b/app/services/projects/update_pages_service.rb
@@ -48,7 +48,7 @@ module Projects
end
rescue InvalidStateError => e
error(e.message)
- rescue => e
+ rescue StandardError => e
error(e.message)
raise e
end
@@ -145,7 +145,7 @@ module Projects
FileUtils.mkdir_p(pages_path)
begin
FileUtils.move(public_path, previous_public_path)
- rescue
+ rescue StandardError
end
FileUtils.move(archive_public_path, public_path)
ensure
@@ -267,4 +267,4 @@ module Projects
end
end
-Projects::UpdatePagesService.prepend_if_ee('EE::Projects::UpdatePagesService')
+Projects::UpdatePagesService.prepend_mod_with('Projects::UpdatePagesService')
diff --git a/app/services/projects/update_remote_mirror_service.rb b/app/services/projects/update_remote_mirror_service.rb
index 8832a1bc027..9f4f6133d92 100644
--- a/app/services/projects/update_remote_mirror_service.rb
+++ b/app/services/projects/update_remote_mirror_service.rb
@@ -24,7 +24,7 @@ module Projects
hard_retry_or_fail(remote_mirror, e.message, tries)
error(e.message)
- rescue => e
+ rescue StandardError => e
remote_mirror.hard_fail!(e.message)
raise e
end
diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb
index 8384bfa813f..541b333aae3 100644
--- a/app/services/projects/update_service.rb
+++ b/app/services/projects/update_service.rb
@@ -49,11 +49,11 @@ module Projects
def validate!
unless valid_visibility_level_change?(project, params[:visibility_level])
- raise ValidationError.new(s_('UpdateProject|New visibility level not allowed!'))
+ raise ValidationError, s_('UpdateProject|New visibility level not allowed!')
end
if renaming_project_with_container_registry_tags?
- raise ValidationError.new(s_('UpdateProject|Cannot rename project because it contains container registry tags!'))
+ raise ValidationError, s_('UpdateProject|Cannot rename project because it contains container registry tags!')
end
validate_default_branch_change
@@ -67,7 +67,7 @@ module Projects
if project.change_head(params[:default_branch])
after_default_branch_change(previous_default_branch)
else
- raise ValidationError.new(s_("UpdateProject|Could not set the default branch"))
+ raise ValidationError, s_("UpdateProject|Could not set the default branch")
end
end
@@ -170,4 +170,4 @@ module Projects
end
end
-Projects::UpdateService.prepend_if_ee('EE::Projects::UpdateService')
+Projects::UpdateService.prepend_mod_with('Projects::UpdateService')
diff --git a/app/services/projects/update_statistics_service.rb b/app/services/projects/update_statistics_service.rb
index a0793cff2df..71f5a8e633d 100644
--- a/app/services/projects/update_statistics_service.rb
+++ b/app/services/projects/update_statistics_service.rb
@@ -2,18 +2,49 @@
module Projects
class UpdateStatisticsService < BaseService
+ include ::Gitlab::Utils::StrongMemoize
+
+ STAT_TO_CACHED_METHOD = {
+ repository_size: :size,
+ commit_count: :commit_count
+ }.freeze
+
def execute
return unless project
Gitlab::AppLogger.info("Updating statistics for project #{project.id}")
- project.statistics.refresh!(only: statistics.map(&:to_sym))
+ expire_repository_caches
+ expire_wiki_caches
+ project.statistics.refresh!(only: statistics)
end
private
+ def expire_repository_caches
+ if statistics.empty?
+ project.repository.expire_statistics_caches
+ elsif method_caches_to_expire.present?
+ project.repository.expire_method_caches(method_caches_to_expire)
+ end
+ end
+
+ def expire_wiki_caches
+ return unless project.wiki_enabled? && statistics.include?(:wiki_size)
+
+ project.wiki.repository.expire_method_caches([:size])
+ end
+
+ def method_caches_to_expire
+ strong_memoize(:method_caches_to_expire) do
+ statistics.map { |stat| STAT_TO_CACHED_METHOD[stat] }.compact
+ end
+ end
+
def statistics
- params[:statistics]
+ strong_memoize(:statistics) do
+ params[:statistics]&.map(&:to_sym)
+ end
end
end
end