Class: Ci::BuildTraceMetadata

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

Constant Summary collapse

MAX_ATTEMPTS =
5

Constants included from Partitionable

Partitionable::MUTEX

Constants inherited from ApplicationRecord

ApplicationRecord::MAX_PLUCK

Constants included from ResetOnUnionError

ResetOnUnionError::MAX_RESET_PERIOD

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ApplicationRecord

model_name, table_name_prefix

Methods inherited from ApplicationRecord

cached_column_list, #create_or_load_association, declarative_enum, default_select_columns, id_in, id_not_in, iid_in, pluck_primary_key, 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 SensitiveSerializableHash

#serializable_hash

Class Method Details

.find_or_upsert_for!(build_id, partition_id) ⇒ Object



22
23
24
25
26
27
28
# File 'app/models/ci/build_trace_metadata.rb', line 22

def self.find_or_upsert_for!(build_id, partition_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 }, unique_by: :build_id)
  find_by!(build_id: build_id, partition_id: partition_id)
end

Instance Method Details

#archival_attempts_available?Boolean

Returns:

  • (Boolean)


39
40
41
# File 'app/models/ci/build_trace_metadata.rb', line 39

def archival_attempts_available?
  archival_attempts <= MAX_ATTEMPTS
end

#archival_attempts_messageObject



51
52
53
54
55
56
57
# File 'app/models/ci/build_trace_metadata.rb', line 51

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)


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

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

  last_archival_attempt_at + backoff < Time.current
end

#increment_archival_attempts!Object



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

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

#remote_checksum_valid?Boolean

Returns:

  • (Boolean)


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

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

#track_archival!(trace_artifact_id, checksum) ⇒ Object



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

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