diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-05-19 15:44:42 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-05-19 15:44:42 +0000 |
commit | 4555e1b21c365ed8303ffb7a3325d773c9b8bf31 (patch) | |
tree | 5423a1c7516cffe36384133ade12572cf709398d /app/services/projects | |
parent | e570267f2f6b326480d284e0164a6464ba4081bc (diff) | |
download | gitlab-ce-4555e1b21c365ed8303ffb7a3325d773c9b8bf31.tar.gz |
Add latest changes from gitlab-org/gitlab@13-12-stable-eev13.12.0-rc42
Diffstat (limited to 'app/services/projects')
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 |