Commit dcd07428 authored by Sean McGivern's avatar Sean McGivern

Merge branch 'bvl-deduplication-hash-in-job' into 'master'

Add the deduplication hash to the job payload

See merge request gitlab-org/gitlab!62842
parents fb7dc6db 88ace86e
...@@ -51,6 +51,8 @@ module Gitlab ...@@ -51,6 +51,8 @@ module Gitlab
end end
end end
job['idempotency_key'] = idempotency_key
self.existing_jid = read_jid.value self.existing_jid = read_jid.value
end end
...@@ -117,7 +119,7 @@ module Gitlab ...@@ -117,7 +119,7 @@ module Gitlab
end end
def idempotency_key def idempotency_key
@idempotency_key ||= "#{namespace}:#{idempotency_hash}" @idempotency_key ||= job['idempotency_key'] || "#{namespace}:#{idempotency_hash}"
end end
def idempotency_hash def idempotency_hash
...@@ -129,6 +131,10 @@ module Gitlab ...@@ -129,6 +131,10 @@ module Gitlab
end end
def idempotency_string def idempotency_string
# TODO: dump the argument's JSON using `Sidekiq.dump_json` instead
# this should be done in the next release so all jobs are written
# with their idempotency key.
# see https://gitlab.com/gitlab-com/gl-infra/scalability/-/issues/1090
"#{worker_class_name}:#{arguments.join('-')}" "#{worker_class_name}:#{arguments.join('-')}"
end end
end end
......
...@@ -51,6 +51,10 @@ RSpec.describe Gitlab::SidekiqMiddleware::DuplicateJobs::DuplicateJob, :clean_gi ...@@ -51,6 +51,10 @@ RSpec.describe Gitlab::SidekiqMiddleware::DuplicateJobs::DuplicateJob, :clean_gi
.from([nil, -2]) .from([nil, -2])
.to(['123', be_within(1).of(described_class::DUPLICATE_KEY_TTL)]) .to(['123', be_within(1).of(described_class::DUPLICATE_KEY_TTL)])
end end
it "adds the idempotency key to the jobs payload" do
expect { duplicate_job.check! }.to change { job['idempotency_key'] }.from(nil).to(idempotency_key)
end
end end
context 'when there was already a job with same arguments in the same queue' do context 'when there was already a job with same arguments in the same queue' do
...@@ -81,14 +85,39 @@ RSpec.describe Gitlab::SidekiqMiddleware::DuplicateJobs::DuplicateJob, :clean_gi ...@@ -81,14 +85,39 @@ RSpec.describe Gitlab::SidekiqMiddleware::DuplicateJobs::DuplicateJob, :clean_gi
context 'when the key exists in redis' do context 'when the key exists in redis' do
before do before do
set_idempotency_key(idempotency_key, 'existing-key') set_idempotency_key(idempotency_key, 'existing-jid')
end end
it 'removes the key from redis' do shared_examples 'deleting the duplicate job' do
expect { duplicate_job.delete! } it 'removes the key from redis' do
.to change { read_idempotency_key_with_ttl(idempotency_key) } expect { duplicate_job.delete! }
.from(['existing-key', -1]) .to change { read_idempotency_key_with_ttl(idempotency_key) }
.to([nil, -2]) .from(['existing-jid', -1])
.to([nil, -2])
end
end
context 'when the idempotency key is not part of the job' do
it_behaves_like 'deleting the duplicate job'
it 'recalculates the idempotency hash' do
expect(duplicate_job).to receive(:idempotency_hash).and_call_original
duplicate_job.delete!
end
end
context 'when the idempotency key is part of the job' do
let(:idempotency_key) { 'not the same as what we calculate' }
let(:job) { super().merge('idempotency_key' => idempotency_key) }
it_behaves_like 'deleting the duplicate job'
it 'does not recalculate the idempotency hash' do
expect(duplicate_job).not_to receive(:idempotency_hash)
duplicate_job.delete!
end
end end
end 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