Class: CrossDatabaseModification::TransactionStackTrackRecord

Inherits:
Object
  • Object
show all
Defined in:
app/models/concerns/cross_database_modification.rb

Constant Summary collapse

DEBUG_STACK =
Rails.env.test? && ENV['DEBUG_GITLAB_TRANSACTION_STACK']
LOG_FILENAME =
Rails.root.join("log", "gitlab_transaction_stack.log")
EXCLUDE_DEBUG_TRACE =
%w[
  lib/gitlab/database/query_analyzer
  app/models/concerns/cross_database_modification.rb
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(subject, gitlab_schema) ⇒ TransactionStackTrackRecord

Returns a new instance of TransactionStackTrackRecord.



38
39
40
41
42
43
44
# File 'app/models/concerns/cross_database_modification.rb', line 38

def initialize(subject, gitlab_schema)
  @subject = subject
  @gitlab_schema = gitlab_schema
  @subject.gitlab_transactions_stack.push(gitlab_schema)

  self.class.log_gitlab_transactions_stack(action: :after_push)
end

Class Method Details

.log_gitlab_transactions_stack(action: nil, example: nil) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'app/models/concerns/cross_database_modification.rb', line 19

def self.log_gitlab_transactions_stack(action: nil, example: nil)
  return unless DEBUG_STACK

  message = "gitlab_transactions_stack performing #{action}"
  message += " in example #{example}" if example

  cleaned_backtrace = Gitlab::BacktraceCleaner.clean_backtrace(caller)
    .reject { |line| EXCLUDE_DEBUG_TRACE.any? { |exclusion| line.include?(exclusion) } }
    .first(5)

  logger.warn({
    message: message,
    action: action,
    gitlab_transactions_stack: ::ApplicationRecord.gitlab_transactions_stack,
    caller: cleaned_backtrace,
    thread: Thread.current.object_id
  })
end

.loggerObject



15
16
17
# File 'app/models/concerns/cross_database_modification.rb', line 15

def self.logger
  @logger ||= Logger.new(LOG_FILENAME, formatter: ->(_, _, _, msg) { Gitlab::Json.dump(msg) + "\n" })
end

Instance Method Details

#before_committed!Object



61
62
# File 'app/models/concerns/cross_database_modification.rb', line 61

def before_committed!
end

#committed!(should_run_callbacks: true) ⇒ Object



68
69
70
# File 'app/models/concerns/cross_database_modification.rb', line 68

def committed!(should_run_callbacks: true)
  done!
end

#done!Object



46
47
48
49
50
51
52
53
54
55
# File 'app/models/concerns/cross_database_modification.rb', line 46

def done!
  unless @done
    @done = true

    self.class.log_gitlab_transactions_stack(action: :before_pop)
    @subject.gitlab_transactions_stack.pop
  end

  true
end

#rolledback!(force_restore_state: false, should_run_callbacks: true) ⇒ Object



64
65
66
# File 'app/models/concerns/cross_database_modification.rb', line 64

def rolledback!(force_restore_state: false, should_run_callbacks: true)
  done!
end

#trigger_transactional_callbacks?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'app/models/concerns/cross_database_modification.rb', line 57

def trigger_transactional_callbacks?
  false
end