class CI::Queue::Redis::Base

Constants

CONNECTION_ERRORS

Attributes

redis[R]
redis_url[R]

Public Class Methods

new(redis_url, config) click to toggle source
# File lib/ci/queue/redis/base.rb, line 13
def initialize(redis_url, config)
  @redis_url = redis_url
  @redis = ::Redis.new(url: redis_url)
  @config = config
end

Public Instance Methods

exhausted?() click to toggle source
# File lib/ci/queue/redis/base.rb, line 19
def exhausted?
  queue_initialized? && size == 0
end
increment_test_failed() click to toggle source
# File lib/ci/queue/redis/base.rb, line 64
def increment_test_failed
  redis.incr(key('test_failed_count'))
end
max_test_failed?() click to toggle source
# File lib/ci/queue/redis/base.rb, line 72
def max_test_failed?
  return false if config.max_test_failed.nil?

  test_failed >= config.max_test_failed
end
progress() click to toggle source
# File lib/ci/queue/redis/base.rb, line 37
def progress
  total - size
end
queue_initialized?() click to toggle source
# File lib/ci/queue/redis/base.rb, line 57
def queue_initialized?
  @queue_initialized ||= begin
    status = master_status
    status == 'ready' || status == 'finished'
  end
end
size() click to toggle source
# File lib/ci/queue/redis/base.rb, line 23
def size
  redis.multi do
    redis.llen(key('queue'))
    redis.zcard(key('running'))
  end.inject(:+)
end
test_failed() click to toggle source
# File lib/ci/queue/redis/base.rb, line 68
def test_failed
  redis.get(key('test_failed_count')).to_i
end
to_a() click to toggle source
# File lib/ci/queue/redis/base.rb, line 30
def to_a
  redis.multi do
    redis.lrange(key('queue'), 0, -1)
    redis.zrange(key('running'), 0, -1)
  end.flatten.reverse.map { |k| index.fetch(k) }
end
wait_for_master(timeout: 30) click to toggle source
# File lib/ci/queue/redis/base.rb, line 41
def wait_for_master(timeout: 30)
  return true if master?
  (timeout * 10 + 1).to_i.times do
    if queue_initialized?
      return true
    else
      sleep 0.1
    end
  end
  raise LostMaster, "The master worker is still `#{master_status}` after #{timeout} seconds waiting."
end
workers_count() click to toggle source
# File lib/ci/queue/redis/base.rb, line 53
def workers_count
  redis.scard(key('workers'))
end

Private Instance Methods

build_id() click to toggle source
# File lib/ci/queue/redis/base.rb, line 86
def build_id
  config.build_id
end
eval_script(script, *args) click to toggle source
# File lib/ci/queue/redis/base.rb, line 94
def eval_script(script, *args)
  redis.evalsha(load_script(script), *args)
end
key(*args) click to toggle source
# File lib/ci/queue/redis/base.rb, line 82
def key(*args)
  ['build', build_id, *args].join(':')
end
load_script(script) click to toggle source
# File lib/ci/queue/redis/base.rb, line 98
def load_script(script)
  @scripts_cache ||= {}
  @scripts_cache[script] ||= redis.script(:load, read_script(script))
end
master_status() click to toggle source
# File lib/ci/queue/redis/base.rb, line 90
def master_status
  redis.get(key('master-status'))
end
read_script(name) click to toggle source
# File lib/ci/queue/redis/base.rb, line 103
def read_script(name)
  ::File.read(::File.join(CI::Queue::DEV_SCRIPTS_ROOT, "#{name}.lua"))
rescue SystemCallError
  ::File.read(::File.join(CI::Queue::RELEASE_SCRIPTS_ROOT, "#{name}.lua"))
end