Make SidekiqStatus able to count number of jobs completed/running

This commit is contained in:
Stan Hu 2017-03-03 14:12:35 -08:00
parent 312137c6a5
commit ffd970d97d
2 changed files with 55 additions and 6 deletions

View file

@ -44,19 +44,42 @@ module Gitlab
# Returns true if all the given job have been completed.
#
# jids - The Sidekiq job IDs to check.
# job_ids - The Sidekiq job IDs to check.
#
# Returns true or false.
def self.all_completed?(jids)
keys = jids.map { |jid| key_for(jid) }
def self.all_completed?(job_ids)
self.num_running(job_ids).zero?
end
responses = Sidekiq.redis do |redis|
# Returns the number of jobs that are running.
#
# job_ids - The Sidekiq job IDs to check.
def self.num_running(job_ids)
responses = self.job_status(job_ids)
responses.select(&:present?).count
end
# Returns the number of jobs that have completed.
#
# job_ids - The Sidekiq job IDs to check.
def self.num_completed(job_ids)
job_ids.size - self.num_running(job_ids)
end
# Returns the job status for each of the given job IDs.
#
# job_ids - The Sidekiq job IDs to check.
#
# Returns an array of true or false indicating job completion.
def self.job_status(job_ids)
keys = job_ids.map { |jid| key_for(jid) }
Sidekiq.redis do |redis|
redis.pipelined do
keys.each { |key| redis.exists(key) }
end
end
responses.all? { |value| !value }
end
def self.key_for(jid)

View file

@ -39,6 +39,32 @@ describe Gitlab::SidekiqStatus do
end
end
describe '.num_running', :redis do
it 'returns 0 if all jobs have been completed' do
expect(described_class.num_running(%w(123))).to eq(0)
end
it 'returns 2 if two jobs are still running' do
described_class.set('123')
described_class.set('456')
expect(described_class.num_running(%w(123 456 789))).to eq(2)
end
end
describe '.num_completed', :redis do
it 'returns 1 if all jobs have been completed' do
expect(described_class.num_completed(%w(123))).to eq(1)
end
it 'returns 1 if a job has not yet been completed' do
described_class.set('123')
described_class.set('456')
expect(described_class.num_completed(%w(123 456 789))).to eq(1)
end
end
describe '.key_for' do
it 'returns the key for a job ID' do
key = described_class.key_for('123')