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>2022-01-20 12:16:11 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2022-01-20 12:16:11 +0300
commitedaa33dee2ff2f7ea3fac488d41558eb5f86d68c (patch)
tree11f143effbfeba52329fb7afbd05e6e2a3790241 /app/services/projects
parentd8a5691316400a0f7ec4f83832698f1988eb27c1 (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.rb8
-rw-r--r--app/services/projects/fork_service.rb6
-rw-r--r--app/services/projects/overwrite_project_service.rb4
-rw-r--r--app/services/projects/prometheus/alerts/notify_service.rb31
-rw-r--r--app/services/projects/update_pages_configuration_service.rb109
-rw-r--r--app/services/projects/update_remote_mirror_service.rb41
-rw-r--r--app/services/projects/update_service.rb19
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]