diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2022-01-20 12:16:11 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2022-01-20 12:16:11 +0300 |
commit | edaa33dee2ff2f7ea3fac488d41558eb5f86d68c (patch) | |
tree | 11f143effbfeba52329fb7afbd05e6e2a3790241 /app/services/projects | |
parent | d8a5691316400a0f7ec4f83832698f1988eb27c1 (diff) |
Add latest changes from gitlab-org/gitlab@14-7-stable-eev14.7.0-rc42
Diffstat (limited to 'app/services/projects')
-rw-r--r-- | app/services/projects/destroy_service.rb | 8 | ||||
-rw-r--r-- | app/services/projects/fork_service.rb | 6 | ||||
-rw-r--r-- | app/services/projects/overwrite_project_service.rb | 4 | ||||
-rw-r--r-- | app/services/projects/prometheus/alerts/notify_service.rb | 31 | ||||
-rw-r--r-- | app/services/projects/update_pages_configuration_service.rb | 109 | ||||
-rw-r--r-- | app/services/projects/update_remote_mirror_service.rb | 41 | ||||
-rw-r--r-- | app/services/projects/update_service.rb | 19 |
7 files changed, 79 insertions, 139 deletions
diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index aef92b8adee..5c4a0e947de 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -41,6 +41,8 @@ module Projects true rescue StandardError => error + context = Gitlab::ApplicationContext.current.merge(project_id: project.id) + Gitlab::ErrorTracking.track_exception(error, **context) attempt_rollback(project, error.message) false rescue Exception => error # rubocop:disable Lint/RescueException @@ -80,8 +82,14 @@ module Projects end def remove_events + log_info("Attempting to destroy events from #{project.full_path} (#{project.id})") + response = ::Events::DestroyService.new(project).execute + if response.error? + log_error("Event deletion failed on #{project.full_path} with the following message: #{response.message}") + end + response.success? end diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 74b7d18f401..3e8d6563709 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -69,6 +69,8 @@ module Projects new_params[:avatar] = @project.avatar end + new_params[:mr_default_target_self] = target_mr_default_target_self unless target_mr_default_target_self.nil? + new_params.merge!(@project.object_pool_params) new_params @@ -127,5 +129,9 @@ module Projects Gitlab::VisibilityLevel.closest_allowed_level(target_level) end + + def target_mr_default_target_self + @target_mr_default_target_self ||= params[:mr_default_target_self] + end end end diff --git a/app/services/projects/overwrite_project_service.rb b/app/services/projects/overwrite_project_service.rb index 2612001eb95..c58fba33b2a 100644 --- a/app/services/projects/overwrite_project_service.rb +++ b/app/services/projects/overwrite_project_service.rb @@ -11,7 +11,9 @@ module Projects move_before_destroy_relationships(source_project) # Reset is required in order to get the proper # uncached fork network method calls value. - destroy_old_project(source_project.reset) + ::Gitlab::Database::QueryAnalyzers::PreventCrossDatabaseModification.allow_cross_database_modification_within_transaction(url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/340256') do + destroy_old_project(source_project.reset) + end rename_project(source_project.name, source_project.path) @project diff --git a/app/services/projects/prometheus/alerts/notify_service.rb b/app/services/projects/prometheus/alerts/notify_service.rb index 56f65718d24..bc517ee3d6f 100644 --- a/app/services/projects/prometheus/alerts/notify_service.rb +++ b/app/services/projects/prometheus/alerts/notify_service.rb @@ -18,6 +18,14 @@ module Projects SUPPORTED_VERSION = '4' + # If feature flag :prometheus_notify_max_alerts is enabled truncate + # alerts to 100 and process only them. + # If feature flag is disabled process any amount of alerts. + # + # This is to mitigate incident: + # https://gitlab.com/gitlab-com/gl-infra/production/-/issues/6086 + PROCESS_MAX_ALERTS = 100 + def initialize(project, payload) @project = project @payload = payload @@ -28,6 +36,8 @@ module Projects return unprocessable_entity unless self.class.processable?(payload) return unauthorized unless valid_alert_manager_token?(token, integration) + truncate_alerts! if max_alerts_exceeded? + alert_responses = process_prometheus_alerts alert_response(alert_responses) @@ -49,12 +59,23 @@ module Projects Gitlab::Utils::DeepSize.new(payload).valid? end - def firings - @firings ||= alerts_by_status('firing') + def max_alerts_exceeded? + return false unless Feature.enabled?(:prometheus_notify_max_alerts, project, type: :ops) + + alerts.size > PROCESS_MAX_ALERTS end - def alerts_by_status(status) - alerts.select { |alert| alert['status'] == status } + def truncate_alerts! + Gitlab::AppLogger.warn( + message: 'Prometheus payload exceeded maximum amount of alerts. Truncating alerts.', + project_id: project.id, + alerts: { + total: alerts.size, + max: PROCESS_MAX_ALERTS + } + ) + + payload['alerts'] = alerts.first(PROCESS_MAX_ALERTS) end def alerts @@ -137,7 +158,7 @@ module Projects end def alert_response(alert_responses) - alerts = alert_responses.map { |resp| resp.payload[:alert] }.compact + alerts = alert_responses.flat_map { |resp| resp.payload[:alerts] }.compact success(alerts) end diff --git a/app/services/projects/update_pages_configuration_service.rb b/app/services/projects/update_pages_configuration_service.rb deleted file mode 100644 index 4272e1dc8b6..00000000000 --- a/app/services/projects/update_pages_configuration_service.rb +++ /dev/null @@ -1,109 +0,0 @@ -# frozen_string_literal: true - -module Projects - class UpdatePagesConfigurationService < BaseService - include Gitlab::Utils::StrongMemoize - - attr_reader :project - - def initialize(project) - @project = project - end - - def execute - return success unless ::Settings.pages.local_store.enabled - - # If the pages were never deployed, we can't write out the config, as the - # directory would not exist. - # https://gitlab.com/gitlab-org/gitlab/-/issues/235139 - return success unless project.pages_deployed? - - unless file_equals?(pages_config_file, pages_config_json) - update_file(pages_config_file, pages_config_json) - reload_daemon - end - - success - end - - private - - def pages_config_json - strong_memoize(:pages_config_json) do - pages_config.to_json - end - end - - def pages_config - { - domains: pages_domains_config, - https_only: project.pages_https_only?, - id: project.project_id, - access_control: !project.public_pages? - } - end - - def pages_domains_config - enabled_pages_domains.map do |domain| - { - domain: domain.domain, - certificate: domain.certificate, - key: domain.key, - https_only: project.pages_https_only? && domain.https?, - id: project.project_id, - access_control: !project.public_pages? - } - end - end - - def enabled_pages_domains - if Gitlab::CurrentSettings.pages_domain_verification_enabled? - project.pages_domains.enabled - else - project.pages_domains - end - end - - def reload_daemon - # GitLab Pages daemon constantly watches for modification time of `pages.path` - # It reloads configuration when `pages.path` is modified - update_file(pages_update_file, SecureRandom.hex(64)) - end - - def pages_path - @pages_path ||= project.pages_path - end - - def pages_config_file - File.join(pages_path, 'config.json') - end - - def pages_update_file - File.join(::Settings.pages.path, '.update') - end - - def update_file(file, data) - temp_file = "#{file}.#{SecureRandom.hex(16)}" - File.open(temp_file, 'w') do |f| - f.write(data) - end - FileUtils.move(temp_file, file, force: true) - ensure - # In case if the updating fails - FileUtils.remove(temp_file, force: true) - end - - def file_equals?(file, data) - existing_data = read_file(file) - data == existing_data.to_s - end - - def read_file(file) - File.open(file, 'r') do |f| - f.read - end - rescue StandardError - nil - end - end -end diff --git a/app/services/projects/update_remote_mirror_service.rb b/app/services/projects/update_remote_mirror_service.rb index 898125c181c..f3ea0967a99 100644 --- a/app/services/projects/update_remote_mirror_service.rb +++ b/app/services/projects/update_remote_mirror_service.rb @@ -41,18 +41,49 @@ module Projects remote_mirror.update_start! # LFS objects must be sent first, or the push has dangling pointers - send_lfs_objects!(remote_mirror) + lfs_status = send_lfs_objects!(remote_mirror) response = remote_mirror.update_repository + failed, failure_message = failure_status(lfs_status, response, remote_mirror) + + # When the issue https://gitlab.com/gitlab-org/gitlab/-/issues/349262 is closed, + # we can move this block within failure_status. + if failed + remote_mirror.mark_as_failed!(failure_message) + else + remote_mirror.update_finish! + end + end + + def failure_status(lfs_status, response, remote_mirror) + message = '' + failed = false + lfs_sync_failed = false + + if lfs_status&.dig(:status) == :error + lfs_sync_failed = true + message += "Error synchronizing LFS files:" + message += "\n\n#{lfs_status[:message]}\n\n" + + failed = Feature.enabled?(:remote_mirror_fail_on_lfs, project, default_enabled: :yaml) + end if response.divergent_refs.any? - message = "Some refs have diverged and have not been updated on the remote:" + message += "Some refs have diverged and have not been updated on the remote:" message += "\n\n#{response.divergent_refs.join("\n")}" + failed = true + end - remote_mirror.mark_as_failed!(message) - else - remote_mirror.update_finish! + if message.present? + Gitlab::AppJsonLogger.info(message: "Error synching remote mirror", + project_id: project.id, + project_path: project.full_path, + remote_mirror_id: remote_mirror.id, + lfs_sync_failed: lfs_sync_failed, + divergent_ref_list: response.divergent_refs) end + + [failed, message] end def send_lfs_objects!(remote_mirror) diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb index b34ecf06e52..fb810af3e6b 100644 --- a/app/services/projects/update_service.rb +++ b/app/services/projects/update_service.rb @@ -104,7 +104,6 @@ module Projects system_hook_service.execute_hooks_for(project, :update) end - update_pages_config if changing_pages_related_config? update_pending_builds if runners_settings_toggled? end @@ -112,10 +111,6 @@ module Projects AfterRenameService.new(project, path_before: project.path_before_last_save, full_path_before: project.full_path_before_last_save) end - def changing_pages_related_config? - changing_pages_https_only? || changing_pages_access_level? - end - def update_failed! model_errors = project.errors.full_messages.to_sentence error_message = model_errors.presence || s_('UpdateProject|Project could not be updated!') @@ -143,10 +138,6 @@ module Projects params.dig(:project_feature_attributes, :wiki_access_level).to_i > ProjectFeature::DISABLED end - def changing_pages_access_level? - params.dig(:project_feature_attributes, :pages_access_level) - end - def ensure_wiki_exists return if project.create_wiki @@ -154,16 +145,6 @@ module Projects Gitlab::Metrics.counter(:wiki_can_not_be_created_total, 'Counts the times we failed to create a wiki').increment end - def update_pages_config - return unless project.pages_deployed? - - PagesUpdateConfigurationWorker.perform_async(project.id) - end - - def changing_pages_https_only? - project.previous_changes.include?(:pages_https_only) - end - def changing_repository_storage? new_repository_storage = params[:repository_storage] |