1
0
Fork 0
mirror of https://github.com/deanpcmad/sidekiq-limit_fetch.git synced 2022-11-09 13:54:36 -05:00

Correctly support redis namespace

This commit is contained in:
brainopia 2013-06-18 15:23:12 +04:00
parent 2801e06ba9
commit dd11381537
8 changed files with 40 additions and 21 deletions

View file

@ -2,4 +2,11 @@ require 'bundler/gem_tasks'
require 'rspec/core/rake_task' require 'rspec/core/rake_task'
RSpec::Core::RakeTask.new RSpec::Core::RakeTask.new
task default: :spec
task :default do
rspec = Rake::Task[:spec]
rspec.invoke
ENV['namespace'] = 'namespace'
rspec.reenable
rspec.invoke
end

View file

@ -21,7 +21,7 @@ class Sidekiq::LimitFetch
def initialize(options) def initialize(options)
Global::Monitor.start! Global::Monitor.start!
@queues = Queues.new options @queues = Queues.new options.merge(namespace: determine_namespace)
end end
def retrieve_work def retrieve_work
@ -39,6 +39,6 @@ class Sidekiq::LimitFetch
def redis_brpop(*args) def redis_brpop(*args)
return if args.size < 2 return if args.size < 2
redis {|it| it.brpop *args } nonblocking_redis {|it| it.brpop *args }
end end
end end

View file

@ -2,11 +2,11 @@ module Sidekiq::LimitFetch::Global
module Selector module Selector
extend self extend self
def acquire(queues) def acquire(queues, namespace)
redis_eval :acquire, [namespace, uuid, queues] redis_eval :acquire, [namespace, uuid, queues]
end end
def release(queues) def release(queues, namespace)
redis_eval :release, [namespace, uuid, queues] redis_eval :release, [namespace, uuid, queues]
end end
@ -22,13 +22,6 @@ module Sidekiq::LimitFetch::Global
private private
def namespace
@namespace ||= begin
namespace = Sidekiq.options[:namespace]
namespace + ':' if namespace
end
end
def redis_eval(script_name, args) def redis_eval(script_name, args)
Sidekiq.redis do |it| Sidekiq.redis do |it|
begin begin

View file

@ -1,7 +1,6 @@
module Sidekiq::LimitFetch::Global module Sidekiq::LimitFetch::Global
class Semaphore class Semaphore
extend Forwardable include Sidekiq::LimitFetch::Redis
def_delegator Sidekiq, :redis
PREFIX = 'limit_fetch' PREFIX = 'limit_fetch'
@ -19,7 +18,7 @@ module Sidekiq::LimitFetch::Global
end end
def acquire def acquire
Selector.acquire([@name]).size > 0 Selector.acquire([@name], determine_namespace).size > 0
end end
def release def release

View file

@ -3,7 +3,9 @@ class Sidekiq::LimitFetch
THREAD_KEY = :acquired_queues THREAD_KEY = :acquired_queues
def initialize(options) def initialize(options)
@queues = options[:queues] @queues = options[:queues]
@namespace = options[:namespace]
options[:strict] ? strict_order! : weighted_order! options[:strict] ? strict_order! : weighted_order!
set_limits options[:limits] set_limits options[:limits]
@ -11,7 +13,7 @@ class Sidekiq::LimitFetch
end end
def acquire def acquire
selector.acquire(ordered_queues) selector.acquire(ordered_queues, @namespace)
.tap {|it| save it } .tap {|it| save it }
.map {|it| "queue:#{it}" } .map {|it| "queue:#{it}" }
end end
@ -19,7 +21,7 @@ class Sidekiq::LimitFetch
def release_except(full_name) def release_except(full_name)
queues = restore queues = restore
queues.delete full_name[/queue:(.*)/, 1] if full_name queues.delete full_name[/queue:(.*)/, 1] if full_name
selector.release queues selector.release queues, @namespace
end end
private private

View file

@ -1,13 +1,27 @@
module Sidekiq::LimitFetch::Redis module Sidekiq::LimitFetch::Redis
extend self
# prevent blocking of fetcher # prevent blocking of fetcher
# more bullet-proof and faster (O_O) # more bullet-proof and faster (O_O)
# than using Celluloid::IO # than using Celluloid::IO
def redis def nonblocking_redis
Sidekiq.redis do |redis| redis do |redis|
begin begin
Celluloid::Future.new { yield redis }.value Celluloid::Future.new { yield redis }.value
end end
end end
rescue Celluloid::Task::TerminatedError rescue Celluloid::Task::TerminatedError
end end
def redis
Sidekiq.redis {|it| yield it }
end
def determine_namespace
redis do |it|
if it.respond_to?(:namespace) and it.namespace
it.namespace + ':'
end
end
end
end end

View file

@ -12,7 +12,8 @@ describe Sidekiq::LimitFetch::Queues do
{ queues: queues, { queues: queues,
limits: limits, limits: limits,
strict: strict, strict: strict,
blocking: blocking } blocking: blocking,
namespace: Sidekiq::LimitFetch::Redis.determine_namespace }
end end
it 'should acquire queues' do it 'should acquire queues' do

View file

@ -2,6 +2,9 @@ require 'sidekiq/limit_fetch'
require 'celluloid/autostart' require 'celluloid/autostart'
require 'sidekiq/fetch' require 'sidekiq/fetch'
Sidekiq.logger = nil
Sidekiq.redis = { namespace: ENV['namespace'] }
RSpec.configure do |config| RSpec.configure do |config|
config.before :each do config.before :each do
Sidekiq.redis do |it| Sidekiq.redis do |it|