summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/ci/runner.rb27
-rw-r--r--spec/models/ci/runner_spec.rb17
2 files changed, 30 insertions, 14 deletions
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index 44be247bcd3..8fe20622723 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -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
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 830f7cd68c5..14747a23c82 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -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