Welcome to mirror list, hosted at ThFree Co, Russian Federation.

import_failure_service.rb « import_export « gitlab « lib - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: bf7200726a1faf04a1b2bd14c8fc1d7cc201562b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# frozen_string_literal: true

module Gitlab
  module ImportExport
    class ImportFailureService
      RETRIABLE_EXCEPTIONS = [GRPC::DeadlineExceeded, ActiveRecord::QueryCanceled].freeze

      attr_reader :importable

      def initialize(importable)
        @importable = importable
        @association = importable.association(:import_failures)
      end

      def with_retry(action:, relation_key: nil, relation_index: nil)
        on_retry = -> (exception, retry_count, *_args) do
          log_import_failure(
            source: action,
            relation_key: relation_key,
            relation_index: relation_index,
            exception: exception,
            retry_count: retry_count)
        end

        Retriable.with_context(:relation_import, on_retry: on_retry) do
          yield
        end
      end

      def log_import_failure(source:, relation_key: nil, relation_index: nil, exception:, retry_count: 0)
        attributes = {
          relation_index: relation_index,
          source: source,
          retry_count: retry_count,
          importable_column_name => importable.id
        }

        Gitlab::ErrorTracking.track_exception(
          exception,
          attributes.merge(relation_name: relation_key)
        )

        ImportFailure.create(
          attributes.merge(
            exception_class: exception.class.to_s,
            exception_message: exception.message.truncate(255),
            correlation_id_value: Labkit::Correlation::CorrelationId.current_or_new_id,
            relation_key: relation_key
          )
        )
      end

      private

      def importable_column_name
        @importable_column_name ||= @association.reflection.foreign_key.to_sym
      end
    end
  end
end