diff options
author | Shinya Maeda <shinya@gitlab.com> | 2018-04-23 16:49:14 +0900 |
---|---|---|
committer | Shinya Maeda <shinya@gitlab.com> | 2018-04-23 16:49:14 +0900 |
commit | a2ccfa79cd75a5e710c47c6e532219d8006a29ea (patch) | |
tree | f34ee535071c0238e3b86815294eea8438b81b2b | |
parent | 8a7654a52b75fadedbb374ef87e04668bef0ee48 (diff) | |
download | gitlab-ce-live-trace-v2-ttl-refresh-worker.tar.gz |
Add TTL refresh workerlive-trace-v2-ttl-refresh-worker
-rw-r--r-- | app/models/ci/job_trace_chunk.rb | 13 | ||||
-rw-r--r-- | app/workers/build_trace_ttl_extend_worker.rb | 12 | ||||
-rw-r--r-- | app/workers/build_trace_ttl_refresh_worker.rb | 15 |
3 files changed, 36 insertions, 4 deletions
diff --git a/app/models/ci/job_trace_chunk.rb b/app/models/ci/job_trace_chunk.rb index aeab4d0c87c..7de95fa6b52 100644 --- a/app/models/ci/job_trace_chunk.rb +++ b/app/models/ci/job_trace_chunk.rb @@ -4,14 +4,13 @@ module Ci belongs_to :job, class_name: "Ci::Build", foreign_key: :job_id - after_destroy :redis_delete_data, if: :redis? - default_value_for :data_store, :redis WriteError = Class.new(StandardError) CHUNK_SIZE = 128.kilobytes - CHUNK_REDIS_TTL = 1.week + CHUNK_REDIS_TTL = 1.day + CHUNK_REDIS_TTL_REFRESH = 6.hours LOCK_RETRY = 100 LOCK_SLEEP = 1 LOCK_TTL = 5.minutes @@ -87,6 +86,12 @@ module Ci end end + def redis_extend_ttl + Gitlab::Redis::SharedState.with do |redis| + redis.setex(redis_data_key, CHUNK_REDIS_TTL, data) + end + end + private def schedule_to_db @@ -115,7 +120,7 @@ module Ci Gitlab::Redis::SharedState.with do |redis| redis.del(redis_data_key) end - end + end def redis_data_key "gitlab:ci:trace:#{job_id}:chunks:#{chunk_index}:data" diff --git a/app/workers/build_trace_ttl_extend_worker.rb b/app/workers/build_trace_ttl_extend_worker.rb new file mode 100644 index 00000000000..1a483c2c2c2 --- /dev/null +++ b/app/workers/build_trace_ttl_extend_worker.rb @@ -0,0 +1,12 @@ +class BuildTraceTTLRefreshWorker + include ApplicationWorker + include PipelineQueue + + queue_namespace :pipeline_processing + + def perform(job_trace_chunk_id_min, job_trace_chunk_id_max) + Ci::JobTraceChunk.redis + .where(:id => (job_trace_chunk_id_min..job_trace_chunk_id_max)) + .map(&:redis_extend_ttl) + end +end diff --git a/app/workers/build_trace_ttl_refresh_worker.rb b/app/workers/build_trace_ttl_refresh_worker.rb new file mode 100644 index 00000000000..870eeef02f7 --- /dev/null +++ b/app/workers/build_trace_ttl_refresh_worker.rb @@ -0,0 +1,15 @@ +class BuildTraceTTLRefreshWorker + include ApplicationWorker + include CronjobQueue + + def perform + Ci::JobTraceChunk.redis # Stored in redis + .joins(:ci_builds) + .where('NOT EXISTS (?)', # If the trace has not been archived yet + Ci::JobArtifact.select(1).trace.where('ci_builds.id = ci_job_artifacts.job_id')) + .where('ci_builds.update_at < ?', CHUNK_REDIS_TTL_REFRESH.ago) # If the live-trace has not been updated over 6h + .find_in_batches(batch_size: 1000) do |job_trace_chunks| + BuildTraceTTLExtendWorker.perform_async(job_trace_chunks.minimum(:id), job_trace_chunks.maximum(:id)) + end + end +end |