Class: Ci::BuildTraceMetadata

Inherits:
ApplicationRecord show all
Includes:
Partitionable
Defined in:
app/models/ci/build_trace_metadata.rb

Constant Summary collapse

MAX_ATTEMPTS =
5

Constants inherited from ApplicationRecord

ApplicationRecord::MAX_PLUCK

Constants included from HasCheckConstraints

HasCheckConstraints::NOT_NULL_CHECK_PATTERN

Constants included from ResetOnColumnErrors

ResetOnColumnErrors::MAX_RESET_PERIOD

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Partitionable

registered_models

Methods inherited from ApplicationRecord

model_name, table_name_prefix

Methods inherited from ApplicationRecord

===, cached_column_list, #create_or_load_association, current_transaction, declarative_enum, default_select_columns, delete_all_returning, #deleted_from_database?, id_in, id_not_in, iid_in, nullable_column?, primary_key_in, #readable_by?, safe_ensure_unique, safe_find_or_create_by, safe_find_or_create_by!, #to_ability_name, underscore, where_exists, where_not_exists, with_fast_read_statement_timeout, without_order

Methods included from Organizations::Sharding

#sharding_organization

Methods included from ResetOnColumnErrors

#reset_on_union_error, #reset_on_unknown_attribute_error

Methods included from Gitlab::SensitiveSerializableHash

#serializable_hash

Class Method Details

.find_or_upsert_for!(build_id, partition_id, project_id) ⇒ Object



29
30
31
32
33
34
35
36
# File 'app/models/ci/build_trace_metadata.rb', line 29

def self.find_or_upsert_for!(build_id, partition_id, project_id)
  record = find_by(build_id: build_id, partition_id: partition_id)
  return record if record

  upsert({ build_id: build_id, partition_id: partition_id, project_id: project_id },
    unique_by: %w[build_id partition_id])
  find_by!(build_id: build_id, partition_id: partition_id)
end

Instance Method Details

#archival_attempts_available?Boolean

Returns:

  • (Boolean)


47
48
49
# File 'app/models/ci/build_trace_metadata.rb', line 47

def archival_attempts_available?
  archival_attempts <= MAX_ATTEMPTS
end

#archival_attempts_messageObject



59
60
61
62
63
64
65
# File 'app/models/ci/build_trace_metadata.rb', line 59

def archival_attempts_message
  if archival_attempts_available?
    'The job can not be archived right now.'
  else
    'The job is out of archival attempts.'
  end
end

#can_attempt_archival_now?Boolean

The job is retried around 5 times during the 7 days retention period for trace chunks as defined in Ci::BuildTraceChunks::RedisBase::CHUNK_REDIS_TTL

Returns:

  • (Boolean)


40
41
42
43
44
45
# File 'app/models/ci/build_trace_metadata.rb', line 40

def can_attempt_archival_now?
  return false unless archival_attempts_available?
  return true unless last_archival_attempt_at

  (last_archival_attempt_at + backoff).past?
end

#increment_archival_attempts!Object



51
52
53
# File 'app/models/ci/build_trace_metadata.rb', line 51

def increment_archival_attempts!
  increment!(:archival_attempts, touch: :last_archival_attempt_at)
end

#remote_checksum_valid?Boolean

Returns:

  • (Boolean)


67
68
69
70
# File 'app/models/ci/build_trace_metadata.rb', line 67

def remote_checksum_valid?
  checksum.present? &&
    checksum == remote_checksum
end

#successfully_archived?Boolean

Returns:

  • (Boolean)


72
73
74
75
76
# File 'app/models/ci/build_trace_metadata.rb', line 72

def successfully_archived?
  return false unless archived_at

  remote_checksum.nil? || remote_checksum_valid?
end

#track_archival!(trace_artifact_id, checksum) ⇒ Object



55
56
57
# File 'app/models/ci/build_trace_metadata.rb', line 55

def track_archival!(trace_artifact_id, checksum)
  update!(trace_artifact_id: trace_artifact_id, checksum: checksum, archived_at: Time.current)
end