summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShinya Maeda <shinya@gitlab.com>2018-04-23 16:49:14 +0900
committerShinya Maeda <shinya@gitlab.com>2018-04-23 16:49:14 +0900
commita2ccfa79cd75a5e710c47c6e532219d8006a29ea (patch)
treef34ee535071c0238e3b86815294eea8438b81b2b
parent8a7654a52b75fadedbb374ef87e04668bef0ee48 (diff)
downloadgitlab-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.rb13
-rw-r--r--app/workers/build_trace_ttl_extend_worker.rb12
-rw-r--r--app/workers/build_trace_ttl_refresh_worker.rb15
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