Commit df255455 authored by Matija Čupić's avatar Matija Čupić

Generelized cached attribute usage in runner

parent bdd3e39b
......@@ -68,6 +68,10 @@ module Ci
ONLINE_CONTACT_TIMEOUT.ago
end
def cached_contacted_at
runner_info_cache(:contacted_at) || self.contacted_at
end
def set_default_values
self.token = SecureRandom.hex(15) if self.token.blank?
end
......@@ -89,10 +93,7 @@ module Ci
end
def online?
Gitlab::Redis::SharedState.with do |redis|
last_seen = redis.get("#{runner_info_redis_cache_key}:contacted_at") || contacted_at
last_seen && last_seen > self.class.contact_time_deadline
end
cached_contacted_at && cached_contacted_at > self.class.contact_time_deadline
end
def status
......@@ -157,7 +158,7 @@ module Ci
end
def update_runner_info(params)
update_runner_info_cache
update_runner_info_cache(params)
# Use a 1h threshold to prevent beating DB updates.
return unless self.contacted_at.nil? ||
......@@ -184,10 +185,20 @@ module Ci
"runner:info:#{self.id}"
end
def update_runner_info_cache
def update_runner_info_cache(params)
Gitlab::Redis::SharedState.with do |redis|
redis.set("#{runner_info_redis_cache_key}:contacted_at", Time.now)
params.each do |key, value|
redis_key = "#{runner_info_redis_cache_key}:#{key}"
redis.set(redis_key, value)
end
end
end
def runner_info_cache(attribute)
Gitlab::Redis::SharedState.with do |redis|
redis_key = "#{runner_info_redis_cache_key}:contacted_at"
redis.set(redis_key, Time.now)
redis.get("#{runner_info_redis_cache_key}:#{attribute}")
end
end
......
......@@ -394,7 +394,7 @@ describe Ci::Runner do
describe '#update_runner_info' do
let(:runner) { create(:ci_runner) }
subject { runner.update_runner_info(contacted_at: Time.now) }
subject { runner.update_runner_info(name: 'testing_runner') }
context 'when database was updated recently' do
before do
......@@ -402,7 +402,7 @@ describe Ci::Runner do
end
it 'updates cache' do
expect_redis_update
expect_redis_update(:contacted_at, :name)
subject
end
......@@ -414,22 +414,27 @@ describe Ci::Runner do
end
it 'updates database' do
expect_redis_update
expect_redis_update(:contacted_at, :name)
expect { subject }.to change { runner.reload.contacted_at }
.and change { runner.reload.name }
end
it 'updates cache' do
expect_redis_update
expect_redis_update(:contacted_at, :name)
subject
end
end
def expect_redis_update
def expect_redis_update(*params)
redis = double
expect(Gitlab::Redis::SharedState).to receive(:with).and_yield(redis)
expect(redis).to receive(:set).with("#{runner.send(:runner_info_redis_cache_key)}:contacted_at", anything)
params.each do |param|
redis_key = "#{runner.send(:runner_info_redis_cache_key)}:#{param}"
expect(redis).to receive(:set).with(redis_key, anything)
end
end
end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment