Class: Gitlab::Database::Transaction::Context

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab/database/transaction/context.rb

Constant Summary collapse

LOG_SAVEPOINTS_THRESHOLD =

1 ‘SAVEPOINT` created in a transaction

1
LOG_DURATION_S_THRESHOLD =

transaction that is running for 2 minutes or longer

120
LOG_EXTERNAL_HTTP_COUNT_THRESHOLD =

50 external HTTP requests executed within transaction

50
LOG_EXTERNAL_HTTP_DURATION_S_THRESHOLD =

1 second spent in HTTP requests in total within transaction

1
LOG_THROTTLE_DURATION =
1

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeContext

Returns a new instance of Context.



15
16
17
# File 'lib/gitlab/database/transaction/context.rb', line 15

def initialize
  @context = {}
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



7
8
9
# File 'lib/gitlab/database/transaction/context.rb', line 7

def context
  @context
end

Instance Method Details

#backtracesObject



87
88
89
# File 'lib/gitlab/database/transaction/context.rb', line 87

def backtraces
  @context[:backtraces].to_a
end

#commitObject



79
80
81
# File 'lib/gitlab/database/transaction/context.rb', line 79

def commit
  log(:commit)
end

#durationObject



53
54
55
56
57
# File 'lib/gitlab/database/transaction/context.rb', line 53

def duration
  return unless @context[:start_time].present?

  current_timestamp - @context[:start_time]
end

#duration_threshold_exceeded?Boolean

Returns:

  • (Boolean)


63
64
65
# File 'lib/gitlab/database/transaction/context.rb', line 63

def duration_threshold_exceeded?
  duration.to_i >= LOG_DURATION_S_THRESHOLD
end

#external_http_requests_countObject



91
92
93
# File 'lib/gitlab/database/transaction/context.rb', line 91

def external_http_requests_count
  @requests_count ||= external_http_requests_count_total - @context[:external_http_count_start].to_i
end

#external_http_requests_durationObject



95
96
97
# File 'lib/gitlab/database/transaction/context.rb', line 95

def external_http_requests_duration
  @requests_duration ||= external_http_requests_duration_total - @context[:external_http_duration_start].to_f
end

#external_http_requests_threshold_exceeded?Boolean

Returns:

  • (Boolean)


67
68
69
70
# File 'lib/gitlab/database/transaction/context.rb', line 67

def external_http_requests_threshold_exceeded?
  external_http_requests_count >= LOG_EXTERNAL_HTTP_COUNT_THRESHOLD ||
    external_http_requests_duration >= LOG_EXTERNAL_HTTP_DURATION_S_THRESHOLD
end

#increment_releasesObject



35
36
37
# File 'lib/gitlab/database/transaction/context.rb', line 35

def increment_releases
  @context[:releases] = @context[:releases].to_i + 1
end

#increment_rollbacksObject



31
32
33
# File 'lib/gitlab/database/transaction/context.rb', line 31

def increment_rollbacks
  @context[:rollbacks] = @context[:rollbacks].to_i + 1
end

#increment_savepointsObject



27
28
29
# File 'lib/gitlab/database/transaction/context.rb', line 27

def increment_savepoints
  @context[:savepoints] = @context[:savepoints].to_i + 1
end

#initialize_external_http_trackingObject



48
49
50
51
# File 'lib/gitlab/database/transaction/context.rb', line 48

def initialize_external_http_tracking
  @context[:external_http_count_start] = external_http_requests_count_total
  @context[:external_http_duration_start] = external_http_requests_duration_total
end

#rollbackObject



83
84
85
# File 'lib/gitlab/database/transaction/context.rb', line 83

def rollback
  log(:rollback)
end

#savepoints_threshold_exceeded?Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/gitlab/database/transaction/context.rb', line 59

def savepoints_threshold_exceeded?
  @context[:savepoints].to_i >= LOG_SAVEPOINTS_THRESHOLD
end

#set_depth(depth) ⇒ Object



23
24
25
# File 'lib/gitlab/database/transaction/context.rb', line 23

def set_depth(depth)
  @context[:depth] = [@context[:depth].to_i, depth].max
end

#set_start_timeObject



19
20
21
# File 'lib/gitlab/database/transaction/context.rb', line 19

def set_start_time
  @context[:start_time] = current_timestamp
end

#should_log?Boolean

Returns:

  • (Boolean)


72
73
74
75
76
77
# File 'lib/gitlab/database/transaction/context.rb', line 72

def should_log?
  return false if logged_already?

  savepoints_threshold_exceeded? || duration_threshold_exceeded? ||
    external_http_requests_threshold_exceeded?
end

#track_backtrace(backtrace) ⇒ Object



43
44
45
46
# File 'lib/gitlab/database/transaction/context.rb', line 43

def track_backtrace(backtrace)
  cleaned_backtrace = Gitlab::BacktraceCleaner.clean_backtrace(backtrace)
  (@context[:backtraces] ||= []).push(cleaned_backtrace)
end

#track_sql(sql) ⇒ Object



39
40
41
# File 'lib/gitlab/database/transaction/context.rb', line 39

def track_sql(sql)
  (@context[:queries] ||= []).push(sql)
end