diff options
Diffstat (limited to 'app/services/projects')
27 files changed, 185 insertions, 184 deletions
diff --git a/app/services/projects/after_import_service.rb b/app/services/projects/after_import_service.rb index ee2dde8aa7f..fad2290a47b 100644 --- a/app/services/projects/after_import_service.rb +++ b/app/services/projects/after_import_service.rb @@ -22,8 +22,12 @@ module Projects # causing GC to run every time. service.increment! rescue Projects::HousekeepingService::LeaseTaken => e - Rails.logger.info( # rubocop:disable Gitlab/RailsLogger - "Could not perform housekeeping for project #{@project.full_path} (#{@project.id}): #{e}") + Gitlab::Import::Logger.info( + message: 'Project housekeeping failed', + project_full_path: @project.full_path, + project_id: @project.id, + error: e.message + ) end private diff --git a/app/services/projects/alerting/notify_service.rb b/app/services/projects/alerting/notify_service.rb index 76c89e85f17..86c408aeec8 100644 --- a/app/services/projects/alerting/notify_service.rb +++ b/app/services/projects/alerting/notify_service.rb @@ -10,7 +10,7 @@ module Projects return forbidden unless alerts_service_activated? return unauthorized unless valid_token?(token) - alert = create_alert + alert = process_alert return bad_request unless alert.persisted? process_incident_issues(alert) if process_issues? @@ -26,11 +26,36 @@ module Projects delegate :alerts_service, :alerts_service_activated?, to: :project def am_alert_params - Gitlab::AlertManagement::AlertParams.from_generic_alert(project: project, payload: params.to_h) + strong_memoize(:am_alert_params) do + Gitlab::AlertManagement::AlertParams.from_generic_alert(project: project, payload: params.to_h) + end + end + + def process_alert + existing_alert = find_alert_by_fingerprint(am_alert_params[:fingerprint]) + + if existing_alert + process_existing_alert(existing_alert) + else + create_alert + end + end + + def process_existing_alert(alert) + alert.register_new_event! end def create_alert - AlertManagement::Alert.create(am_alert_params) + alert = AlertManagement::Alert.create(am_alert_params) + alert.execute_services if alert.persisted? + + alert + end + + def find_alert_by_fingerprint(fingerprint) + return unless fingerprint + + AlertManagement::Alert.for_fingerprint(project, fingerprint).first end def send_email? @@ -38,6 +63,8 @@ module Projects end def process_incident_issues(alert) + return if alert.issue + IncidentManagement::ProcessAlertWorker .perform_async(project.id, parsed_payload, alert.id) end diff --git a/app/services/projects/container_repository/cleanup_tags_service.rb b/app/services/projects/container_repository/cleanup_tags_service.rb index b53a9c1561e..c5809c11ea9 100644 --- a/app/services/projects/container_repository/cleanup_tags_service.rb +++ b/app/services/projects/container_repository/cleanup_tags_service.rb @@ -6,6 +6,7 @@ module Projects def execute(container_repository) return error('feature disabled') unless can_use? return error('access denied') unless can_destroy? + return error('invalid regex') unless valid_regex? tags = container_repository.tags tags = without_latest(tags) @@ -76,6 +77,17 @@ module Projects def can_use? Feature.enabled?(:container_registry_cleanup, project, default_enabled: true) end + + def valid_regex? + %w(name_regex_delete name_regex name_regex_keep).each do |param_name| + regex = params[param_name] + Gitlab::UntrustedRegexp.new(regex) unless regex.blank? + end + true + rescue RegexpError => e + Gitlab::ErrorTracking.log_exception(e, project_id: project.id) + false + end end end end diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 3233d1799b8..bffd443c49f 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -150,7 +150,7 @@ module Projects if @project.save unless @project.gitlab_project_import? - create_services_from_active_templates(@project) + create_services_from_active_instances_or_templates(@project) @project.create_labels end @@ -166,7 +166,7 @@ module Projects log_message = message.dup log_message << " Project ID: #{@project.id}" if @project&.id - Rails.logger.error(log_message) # rubocop:disable Gitlab/RailsLogger + Gitlab::AppLogger.error(log_message) if @project && @project.persisted? && @project.import_state @project.import_state.mark_as_failed(message) @@ -175,15 +175,6 @@ module Projects @project end - # rubocop: disable CodeReuse/ActiveRecord - def create_services_from_active_templates(project) - Service.where(template: true, active: true).each do |template| - service = Service.build_from_template(project.id, template) - service.save! - end - end - # rubocop: enable CodeReuse/ActiveRecord - def create_prometheus_service service = @project.find_or_initialize_service(::PrometheusService.to_param) @@ -225,6 +216,15 @@ module Projects private + # rubocop: disable CodeReuse/ActiveRecord + def create_services_from_active_instances_or_templates(project) + Service.active.where(instance: true).or(Service.active.where(template: true)).group_by(&:type).each do |type, records| + service = records.find(&:instance?) || records.find(&:template?) + Service.build_from_integration(project.id, service).save! + end + end + # rubocop: enable CodeReuse/ActiveRecord + def project_namespace @project_namespace ||= Namespace.find_by_id(@params[:namespace_id]) || current_user.namespace end @@ -249,9 +249,7 @@ module Projects end end -# rubocop: disable Cop/InjectEnterpriseEditionModule Projects::CreateService.prepend_if_ee('EE::Projects::CreateService') -# rubocop: enable Cop/InjectEnterpriseEditionModule # 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 fd1366d2c4a..2e949f2fc55 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -64,7 +64,7 @@ module Projects end def remove_snippets - response = Snippets::BulkDestroyService.new(current_user, project.snippets).execute + response = ::Snippets::BulkDestroyService.new(current_user, project.snippets).execute response.success? end diff --git a/app/services/projects/detect_repository_languages_service.rb b/app/services/projects/detect_repository_languages_service.rb index 942cd8162e4..c57773c3302 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.bulk_insert( + Gitlab::Database.bulk_insert( # rubocop:disable Gitlab/BulkInsert RepositoryLanguage.table_name, detection.insertions(matching_programming_languages) ) diff --git a/app/services/projects/group_links/create_service.rb b/app/services/projects/group_links/create_service.rb index 241948b335b..2ba3cd6694f 100644 --- a/app/services/projects/group_links/create_service.rb +++ b/app/services/projects/group_links/create_service.rb @@ -13,6 +13,7 @@ module Projects ) if link.save + group.refresh_members_authorized_projects success(link: link) else error(link.errors.full_messages.to_sentence, 409) diff --git a/app/services/projects/group_links/destroy_service.rb b/app/services/projects/group_links/destroy_service.rb index ea7d05551fd..229191e41f6 100644 --- a/app/services/projects/group_links/destroy_service.rb +++ b/app/services/projects/group_links/destroy_service.rb @@ -12,7 +12,9 @@ module Projects TodosDestroyer::ConfidentialIssueWorker.perform_in(Todo::WAIT_FOR_DELETE, nil, project.id) end - group_link.destroy + group_link.destroy.tap do |link| + link.group.refresh_members_authorized_projects + end end end end diff --git a/app/services/projects/group_links/update_service.rb b/app/services/projects/group_links/update_service.rb new file mode 100644 index 00000000000..7de4b7a211d --- /dev/null +++ b/app/services/projects/group_links/update_service.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module Projects + module GroupLinks + class UpdateService < BaseService + def initialize(group_link, user = nil) + super(group_link.project, user) + + @group_link = group_link + end + + def execute(group_link_params) + group_link.update!(group_link_params) + + if requires_authorization_refresh?(group_link_params) + group_link.group.refresh_members_authorized_projects + end + end + + private + + attr_reader :group_link + + def requires_authorization_refresh?(params) + params.include?(:group_access) + end + end + end +end diff --git a/app/services/projects/hashed_storage/base_attachment_service.rb b/app/services/projects/hashed_storage/base_attachment_service.rb index a2a7895ba17..d61a2af6c1c 100644 --- a/app/services/projects/hashed_storage/base_attachment_service.rb +++ b/app/services/projects/hashed_storage/base_attachment_service.rb @@ -19,7 +19,7 @@ module Projects def initialize(project:, old_disk_path:, logger: nil) @project = project @old_disk_path = old_disk_path - @logger = logger || Rails.logger # rubocop:disable Gitlab/RailsLogger + @logger = logger || Gitlab::AppLogger end # Return whether this operation was skipped or not diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb index 86cb4f35206..031b99753c3 100644 --- a/app/services/projects/import_export/export_service.rb +++ b/app/services/projects/import_export/export_service.rb @@ -9,6 +9,7 @@ module Projects super @shared = project.import_export_shared + @logger = Gitlab::Export::Logger.build end def execute(after_export_strategy = nil) @@ -115,11 +116,20 @@ module Projects end def notify_success - Rails.logger.info("Import/Export - Project #{project.name} with ID: #{project.id} successfully exported") # rubocop:disable Gitlab/RailsLogger + @logger.info( + message: 'Project successfully exported', + project_name: project.name, + project_id: project.id + ) end def notify_error - Rails.logger.error("Import/Export - Project #{project.name} with ID: #{project.id} export error - #{shared.errors.join(', ')}") # rubocop:disable Gitlab/RailsLogger + @logger.error( + message: 'Project export error', + export_errors: shared.errors.join(', '), + project_name: project.name, + project_id: project.id + ) notification_service.project_not_exported(project, current_user, shared.errors) end diff --git a/app/services/projects/import_service.rb b/app/services/projects/import_service.rb index 449c4c3de6b..b4abb5b6df7 100644 --- a/app/services/projects/import_service.rb +++ b/app/services/projects/import_service.rb @@ -149,9 +149,7 @@ module Projects end end -# rubocop: disable Cop/InjectEnterpriseEditionModule Projects::ImportService.prepend_if_ee('EE::Projects::ImportService') -# rubocop: enable Cop/InjectEnterpriseEditionModule # 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_link_service.rb b/app/services/projects/lfs_pointers/lfs_link_service.rb index 39cd553261f..e86106f0a09 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.bulk_insert(:lfs_objects_projects, rows) + Gitlab::Database.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/lsif_data_service.rb b/app/services/projects/lsif_data_service.rb deleted file mode 100644 index 5e7055b3309..00000000000 --- a/app/services/projects/lsif_data_service.rb +++ /dev/null @@ -1,101 +0,0 @@ -# frozen_string_literal: true - -module Projects - class LsifDataService - attr_reader :file, :project, :commit_id, :docs, - :doc_ranges, :ranges, :def_refs, :hover_refs - - CACHE_EXPIRE_IN = 1.hour - - def initialize(file, project, commit_id) - @file = file - @project = project - @commit_id = commit_id - - fetch_data! - end - - def execute(path) - doc_id = find_doc_id(docs, path) - dir_absolute_path = docs[doc_id]&.delete_suffix(path) - - doc_ranges[doc_id]&.map do |range_id| - location, ref_id = ranges[range_id].values_at('loc', 'ref_id') - line_data, column_data = location - - { - start_line: line_data.first, - end_line: line_data.last, - start_char: column_data.first, - end_char: column_data.last, - definition_url: definition_url_for(def_refs[ref_id], dir_absolute_path), - hover: highlighted_hover(hover_refs[ref_id]) - } - end - end - - private - - def fetch_data - Rails.cache.fetch("project:#{project.id}:lsif:#{commit_id}", expires_in: CACHE_EXPIRE_IN) do - data = nil - - file.open do |stream| - Zlib::GzipReader.wrap(stream) do |gz_stream| - data = Gitlab::Json.parse(gz_stream.read) - end - end - - data - end - end - - def fetch_data! - data = fetch_data - - @docs = data['docs'] - @doc_ranges = data['doc_ranges'] - @ranges = data['ranges'] - @def_refs = data['def_refs'] - @hover_refs = data['hover_refs'] - end - - def find_doc_id(docs, path) - docs.reduce(nil) do |doc_id, (id, doc_path)| - next doc_id unless doc_path =~ /#{path}$/ - - if doc_id.nil? || docs[doc_id].size > doc_path.size - doc_id = id - end - - doc_id - end - end - - def definition_url_for(ref_id, dir_absolute_path) - return unless range = ranges[ref_id] - - def_doc_id, location = range.values_at('doc_id', 'loc') - localized_doc_url = docs[def_doc_id].delete_prefix(dir_absolute_path) - - # location is stored as [[start_line, end_line], [start_char, end_char]] - start_line = location.first.first - - line_anchor = "L#{start_line + 1}" - definition_ref_path = [commit_id, localized_doc_url].join('/') - - Gitlab::Routing.url_helpers.project_blob_path(project, definition_ref_path, anchor: line_anchor) - end - - def highlighted_hover(hovers) - hovers&.map do |hover| - # Documentation for a method which is added as comments on top of the method - # is stored as a raw string value in LSIF file - next { value: hover } unless hover.is_a?(Hash) - - value = Gitlab::Highlight.highlight(nil, hover['value'], language: hover['language']) - { language: hover['language'], value: value } - end - end - end -end diff --git a/app/services/projects/move_deploy_keys_projects_service.rb b/app/services/projects/move_deploy_keys_projects_service.rb index 01419563538..51d84af249e 100644 --- a/app/services/projects/move_deploy_keys_projects_service.rb +++ b/app/services/projects/move_deploy_keys_projects_service.rb @@ -28,7 +28,7 @@ module Projects # rubocop: enable CodeReuse/ActiveRecord def remove_remaining_deploy_keys_projects - source_project.deploy_keys_projects.destroy_all # rubocop: disable DestroyAll + source_project.deploy_keys_projects.destroy_all # rubocop: disable Cop/DestroyAll end end end diff --git a/app/services/projects/move_lfs_objects_projects_service.rb b/app/services/projects/move_lfs_objects_projects_service.rb index 8cc420d7ba7..57a8d3d69c6 100644 --- a/app/services/projects/move_lfs_objects_projects_service.rb +++ b/app/services/projects/move_lfs_objects_projects_service.rb @@ -20,7 +20,7 @@ module Projects end def remove_remaining_lfs_objects_project - source_project.lfs_objects_projects.destroy_all # rubocop: disable DestroyAll + source_project.lfs_objects_projects.destroy_all # rubocop: disable Cop/DestroyAll end # rubocop: disable CodeReuse/ActiveRecord diff --git a/app/services/projects/move_notification_settings_service.rb b/app/services/projects/move_notification_settings_service.rb index 65a888fe26b..efe06f158cc 100644 --- a/app/services/projects/move_notification_settings_service.rb +++ b/app/services/projects/move_notification_settings_service.rb @@ -21,7 +21,7 @@ module Projects # Remove remaining notification settings from source_project def remove_remaining_notification_settings - source_project.notification_settings.destroy_all # rubocop: disable DestroyAll + source_project.notification_settings.destroy_all # rubocop: disable Cop/DestroyAll end # Get users of current notification_settings diff --git a/app/services/projects/move_project_group_links_service.rb b/app/services/projects/move_project_group_links_service.rb index d1aa9af2bcb..349953ff973 100644 --- a/app/services/projects/move_project_group_links_service.rb +++ b/app/services/projects/move_project_group_links_service.rb @@ -25,7 +25,7 @@ module Projects # Remove remaining project group links from source_project def remove_remaining_project_group_links - source_project.reset.project_group_links.destroy_all # rubocop: disable DestroyAll + source_project.reset.project_group_links.destroy_all # rubocop: disable Cop/DestroyAll end def group_links_in_target_project diff --git a/app/services/projects/move_project_members_service.rb b/app/services/projects/move_project_members_service.rb index de4e7e5a1e3..9a1b7c6d1b6 100644 --- a/app/services/projects/move_project_members_service.rb +++ b/app/services/projects/move_project_members_service.rb @@ -25,7 +25,7 @@ module Projects def remove_remaining_members # Remove remaining members and authorizations from source_project - source_project.project_members.destroy_all # rubocop: disable DestroyAll + source_project.project_members.destroy_all # rubocop: disable Cop/DestroyAll end def project_members_in_target_project diff --git a/app/services/projects/operations/update_service.rb b/app/services/projects/operations/update_service.rb index c06f572b52f..7aa7ea73639 100644 --- a/app/services/projects/operations/update_service.rb +++ b/app/services/projects/operations/update_service.rb @@ -41,9 +41,9 @@ module Projects attribs = params[:metrics_setting_attributes] return {} unless attribs - destroy = attribs[:external_dashboard_url].blank? + attribs[:external_dashboard_url] = attribs[:external_dashboard_url].presence - { metrics_setting_attributes: attribs.merge(_destroy: destroy) } + { metrics_setting_attributes: attribs } end def error_tracking_params diff --git a/app/services/projects/prometheus/alerts/create_events_service.rb b/app/services/projects/prometheus/alerts/create_events_service.rb index a29240947ff..4fcf841314b 100644 --- a/app/services/projects/prometheus/alerts/create_events_service.rb +++ b/app/services/projects/prometheus/alerts/create_events_service.rb @@ -40,17 +40,13 @@ module Projects def create_managed_prometheus_alert_event(parsed_alert) alert = find_alert(parsed_alert.metric_id) - payload_key = PrometheusAlertEvent.payload_key_for(parsed_alert.metric_id, parsed_alert.starts_at_raw) - - event = PrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, alert, payload_key) + event = PrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, alert, parsed_alert.gitlab_fingerprint) set_status(parsed_alert, event) end def create_self_managed_prometheus_alert_event(parsed_alert) - payload_key = SelfManagedPrometheusAlertEvent.payload_key_for(parsed_alert.starts_at_raw, parsed_alert.title, parsed_alert.full_query) - - event = SelfManagedPrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, payload_key) do |event| + event = SelfManagedPrometheusAlertEvent.find_or_initialize_by_payload_key(parsed_alert.project, parsed_alert.gitlab_fingerprint) do |event| event.environment = parsed_alert.environment event.title = parsed_alert.title event.query_expression = parsed_alert.full_query diff --git a/app/services/projects/prometheus/alerts/notify_service.rb b/app/services/projects/prometheus/alerts/notify_service.rb index 2583a6cae9f..877a4f99a94 100644 --- a/app/services/projects/prometheus/alerts/notify_service.rb +++ b/app/services/projects/prometheus/alerts/notify_service.rb @@ -7,9 +7,19 @@ module Projects include Gitlab::Utils::StrongMemoize include IncidentManagement::Settings + # This set of keys identifies a payload as a valid Prometheus + # payload and thus processable by this service. See also + # https://prometheus.io/docs/alerting/configuration/#webhook_config + REQUIRED_PAYLOAD_KEYS = %w[ + version groupKey status receiver groupLabels commonLabels + commonAnnotations externalURL alerts + ].to_set.freeze + + SUPPORTED_VERSION = '4' + def execute(token) return bad_request unless valid_payload_size? - return unprocessable_entity unless valid_version? + return unprocessable_entity unless self.class.processable?(params) return unauthorized unless valid_alert_manager_token?(token) process_prometheus_alerts @@ -20,6 +30,14 @@ module Projects ServiceResponse.success end + def self.processable?(params) + # Workaround for https://gitlab.com/gitlab-org/gitlab/-/issues/220496 + return false unless params + + REQUIRED_PAYLOAD_KEYS.subset?(params.keys.to_set) && + params['version'] == SUPPORTED_VERSION + end + private def valid_payload_size? @@ -42,12 +60,10 @@ module Projects params['alerts'] end - def valid_version? - params['version'] == '4' - end - def valid_alert_manager_token?(token) - valid_for_manual?(token) || valid_for_managed?(token) + valid_for_manual?(token) || + valid_for_alerts_endpoint?(token) || + valid_for_managed?(token) end def valid_for_manual?(token) @@ -61,6 +77,13 @@ module Projects end end + def valid_for_alerts_endpoint?(token) + return false unless project.alerts_service_activated? + + # Here we are enforcing the existence of the token + compare_token(token, project.alerts_service.token) + end + def valid_for_managed?(token) prometheus_application = available_prometheus_application(project) return false unless prometheus_application diff --git a/app/services/projects/propagate_service_template.rb b/app/services/projects/propagate_service_template.rb index 0483c951f1e..4adcda042d1 100644 --- a/app/services/projects/propagate_service_template.rb +++ b/app/services/projects/propagate_service_template.rb @@ -26,7 +26,7 @@ module Projects def propagate_projects_with_template loop do - batch = Project.uncached { project_ids_batch } + batch = Project.uncached { project_ids_without_integration } bulk_create_from_template(batch) unless batch.empty? @@ -35,40 +35,36 @@ module Projects end def bulk_create_from_template(batch) - service_list = batch.map do |project_id| - service_hash.values << project_id - end + service_list = ServiceList.new(batch, service_hash).to_array Project.transaction do - results = bulk_insert(Service, service_hash.keys << 'project_id', service_list) + results = bulk_insert(*service_list) if data_fields_present? - data_list = results.map { |row| data_hash.values << row['id'] } + data_list = DataList.new(results, data_fields_hash, template.data_fields.class).to_array - bulk_insert(template.data_fields.class, data_hash.keys << 'service_id', data_list) + bulk_insert(*data_list) end run_callbacks(batch) end end - def project_ids_batch - Project.connection.select_values( - <<-SQL - SELECT id - FROM projects - WHERE NOT EXISTS ( - SELECT true - FROM services - WHERE services.project_id = projects.id - AND services.type = #{ActiveRecord::Base.connection.quote(template.type)} - ) - AND projects.pending_delete = false - AND projects.archived = false - LIMIT #{BATCH_SIZE} - SQL - ) + # rubocop: disable CodeReuse/ActiveRecord + def project_ids_without_integration + services = Service + .select('1') + .where('services.project_id = projects.id') + .where(type: template.type) + + Project + .where('NOT EXISTS (?)', services) + .where(pending_delete: false) + .where(archived: false) + .limit(BATCH_SIZE) + .pluck(:id) end + # rubocop: enable CodeReuse/ActiveRecord def bulk_insert(klass, columns, values_array) items_to_insert = values_array.map { |array| Hash[columns.zip(array)] } @@ -77,11 +73,11 @@ module Projects end def service_hash - @service_hash ||= template.as_json(methods: :type, except: %w[id template project_id]) + @service_hash ||= template.to_service_hash end - def data_hash - @data_hash ||= template.data_fields.as_json(only: template.data_fields.class.column_names).except('id', 'service_id') + def data_fields_hash + @data_fields_hash ||= template.to_data_fields_hash end # rubocop: disable CodeReuse/ActiveRecord diff --git a/app/services/projects/update_remote_mirror_service.rb b/app/services/projects/update_remote_mirror_service.rb index e554bed6819..5f8ef75a8d7 100644 --- a/app/services/projects/update_remote_mirror_service.rb +++ b/app/services/projects/update_remote_mirror_service.rb @@ -27,7 +27,11 @@ module Projects remote_mirror.update_start! remote_mirror.ensure_remote! - repository.fetch_remote(remote_mirror.remote_name, ssh_auth: remote_mirror, no_tags: true) + + # https://gitlab.com/gitlab-org/gitaly/-/issues/2670 + if Feature.disabled?(:gitaly_ruby_remote_branches_ls_remote) + repository.fetch_remote(remote_mirror.remote_name, ssh_auth: remote_mirror, no_tags: true) + end response = remote_mirror.update_repository diff --git a/app/services/projects/update_repository_storage_service.rb b/app/services/projects/update_repository_storage_service.rb index 0632df6f6d7..fa8d4c5aa5f 100644 --- a/app/services/projects/update_repository_storage_service.rb +++ b/app/services/projects/update_repository_storage_service.rb @@ -24,7 +24,7 @@ module Projects mark_old_paths_for_archive repository_storage_move.finish! - project.update!(repository_storage: destination_storage_name, repository_read_only: false) + project.leave_pool_repository project.track_project_repository end @@ -34,10 +34,7 @@ module Projects ServiceResponse.success rescue StandardError => e - project.transaction do - repository_storage_move.do_fail! - project.update!(repository_read_only: false) - end + repository_storage_move.do_fail! Gitlab::ErrorTracking.track_exception(e, project_path: project.full_path) diff --git a/app/services/projects/update_service.rb b/app/services/projects/update_service.rb index e10dede632a..58c9bce963b 100644 --- a/app/services/projects/update_service.rb +++ b/app/services/projects/update_service.rb @@ -13,8 +13,12 @@ module Projects ensure_wiki_exists if enabling_wiki? - if changing_storage_size? - project.change_repository_storage(params.delete(:repository_storage)) + if changing_repository_storage? + storage_move = project.repository_storage_moves.build( + source_storage_name: project.repository_storage, + destination_storage_name: params.delete(:repository_storage) + ) + storage_move.schedule end yield if block_given? @@ -132,7 +136,7 @@ module Projects def ensure_wiki_exists ProjectWiki.new(project, project.owner).wiki - rescue ProjectWiki::CouldNotCreateWikiError + rescue Wiki::CouldNotCreateWikiError log_error("Could not create wiki for #{project.full_name}") Gitlab::Metrics.counter(:wiki_can_not_be_created_total, 'Counts the times we failed to create a wiki').increment end @@ -145,10 +149,11 @@ module Projects project.previous_changes.include?(:pages_https_only) end - def changing_storage_size? + def changing_repository_storage? new_repository_storage = params[:repository_storage] new_repository_storage && project.repository.exists? && + project.repository_storage != new_repository_storage && can?(current_user, :change_repository_storage, project) end end diff --git a/app/services/projects/update_statistics_service.rb b/app/services/projects/update_statistics_service.rb index cc6ffa9eafc..a0793cff2df 100644 --- a/app/services/projects/update_statistics_service.rb +++ b/app/services/projects/update_statistics_service.rb @@ -5,7 +5,7 @@ module Projects def execute return unless project - Rails.logger.info("Updating statistics for project #{project.id}") # rubocop:disable Gitlab/RailsLogger + Gitlab::AppLogger.info("Updating statistics for project #{project.id}") project.statistics.refresh!(only: statistics.map(&:to_sym)) end |