Record used SSH keys only once per day

Use Gitlab::ExclusiveLease to make sure that we enqueue Sidekiq job
at most once per day for given key.
This commit is contained in:
Adam Niedzielski 2017-01-20 11:42:46 +01:00
parent 5a41d92b9d
commit 8c41d5f5e1
3 changed files with 33 additions and 5 deletions

View File

@ -4,6 +4,8 @@ class Key < ActiveRecord::Base
include AfterCommitQueue
include Sortable
LAST_USED_AT_REFRESH_TIME = 1.day.to_i
belongs_to :user
before_validation :generate_fingerprint
@ -50,7 +52,10 @@ class Key < ActiveRecord::Base
end
def update_last_used_at
UseKeyWorker.perform_async(self.id)
lease = Gitlab::ExclusiveLease.new("key_update_last_used_at:#{id}", timeout: LAST_USED_AT_REFRESH_TIME)
return unless lease.try_obtain
UseKeyWorker.perform_async(id)
end
def add_to_shell

View File

@ -0,0 +1,4 @@
---
title: Record used SSH keys only once per day
merge_request: 8655
author:

View File

@ -30,11 +30,30 @@ describe Key, models: true do
end
describe "#update_last_used_at" do
it "enqueues a UseKeyWorker job" do
key = create(:key)
let(:key) { create(:key) }
expect(UseKeyWorker).to receive(:perform_async).with(key.id)
key.update_last_used_at
context 'when key was not updated during the last day' do
before do
allow_any_instance_of(Gitlab::ExclusiveLease).to receive(:try_obtain).
and_return('000000')
end
it 'enqueues a UseKeyWorker job' do
expect(UseKeyWorker).to receive(:perform_async).with(key.id)
key.update_last_used_at
end
end
context 'when key was updated during the last day' do
before do
allow_any_instance_of(Gitlab::ExclusiveLease).to receive(:try_obtain).
and_return(false)
end
it 'does not enqueue a UseKeyWorker job' do
expect(UseKeyWorker).not_to receive(:perform_async)
key.update_last_used_at
end
end
end
end