Don't blow up if Redis switches to READONLY

This commit is contained in:
Robin Ward
2015-04-24 13:10:43 -04:00
parent 8129cce104
commit 5b3f99aa50
56 changed files with 194 additions and 147 deletions

View File

@ -20,8 +20,8 @@ class DiscourseRedis
"redis://#{(':' + config['password'] + '@') if config['password']}#{config['host']}:#{config['port']}/#{config['db']}"
end
def initialize
@config = DiscourseRedis.config
def initialize(config=nil)
@config = config || DiscourseRedis.config
@redis = DiscourseRedis.raw_connection(@config)
end
@ -34,10 +34,20 @@ class DiscourseRedis
self.class.url(@config)
end
def self.ignore_readonly
yield
rescue Redis::CommandError => ex
if ex.message =~ /READONLY/
STDERR.puts "WARN: Redis is in a readonly state. Performed a noop"
else
raise ex
end
end
# prefix the key with the namespace
def method_missing(meth, *args, &block)
if @redis.respond_to?(meth)
@redis.send(meth, *args, &block)
DiscourseRedis.ignore_readonly { @redis.send(meth, *args, &block) }
else
super
end
@ -54,28 +64,36 @@ class DiscourseRedis
:zremrangebyscore, :zrevrange, :zrevrangebyscore, :zrevrank, :zrangebyscore].each do |m|
define_method m do |*args|
args[0] = "#{DiscourseRedis.namespace}:#{args[0]}"
@redis.send(m, *args)
DiscourseRedis.ignore_readonly { @redis.send(m, *args) }
end
end
def del(k)
k = "#{DiscourseRedis.namespace}:#{k}"
@redis.del k
DiscourseRedis.ignore_readonly do
k = "#{DiscourseRedis.namespace}:#{k}"
@redis.del k
end
end
def keys(pattern=nil)
len = DiscourseRedis.namespace.length + 1
@redis.keys("#{DiscourseRedis.namespace}:#{pattern || '*'}").map{
|k| k[len..-1]
}
DiscourseRedis.ignore_readonly do
len = DiscourseRedis.namespace.length + 1
@redis.keys("#{DiscourseRedis.namespace}:#{pattern || '*'}").map{
|k| k[len..-1]
}
end
end
def delete_prefixed(prefix)
keys("#{prefix}*").each { |k| $redis.del(k) }
DiscourseRedis.ignore_readonly do
keys("#{prefix}*").each { |k| $redis.del(k) }
end
end
def flushdb
keys.each{|k| del(k)}
DiscourseRedis.ignore_readonly do
keys.each{|k| del(k)}
end
end
def reconnect