diff --git a/lib/discourse_redis.rb b/lib/discourse_redis.rb index 0634cb36e31..0230eaf006a 100644 --- a/lib/discourse_redis.rb +++ b/lib/discourse_redis.rb @@ -151,22 +151,26 @@ class DiscourseRedis end def multi - if block_given? - @redis.multi do |transaction| - yield DiscourseRedis.new(@config, namespace: @namespace, raw_redis: transaction) + DiscourseRedis.ignore_readonly do + if block_given? + @redis.multi do |transaction| + yield DiscourseRedis.new(@config, namespace: @namespace, raw_redis: transaction) + end + else + @redis.multi end - else - @redis.multi end end def pipelined - if block_given? - @redis.pipelined do |transaction| - yield DiscourseRedis.new(@config, namespace: @namespace, raw_redis: transaction) + DiscourseRedis.ignore_readonly do + if block_given? + @redis.pipelined do |transaction| + yield DiscourseRedis.new(@config, namespace: @namespace, raw_redis: transaction) + end + else + @redis.pipelined end - else - @redis.pipelined end end diff --git a/spec/lib/discourse_redis_spec.rb b/spec/lib/discourse_redis_spec.rb index 3a82beed8e4..215ba35738e 100644 --- a/spec/lib/discourse_redis_spec.rb +++ b/spec/lib/discourse_redis_spec.rb @@ -52,7 +52,39 @@ describe DiscourseRedis do expect(redis.get('foo')).to eq("baz") expect(redis.get('baz')).to eq("1") + end + it 'should noop pipelined commands against a readonly redis' do + redis.without_namespace + .expects(:pipelined) + .raises(Redis::CommandError.new("READONLY")) + + set, incr = nil + + val = redis.pipelined do |pipeline| + set = pipeline.set "foo", "baz" + incr = pipeline.incr "baz" + end + + expect(val).to eq(nil) + expect(redis.get('foo')).to eq(nil) + expect(redis.get('baz')).to eq(nil) + end + + it 'should noop multi commands against a readonly redis' do + redis.without_namespace + .expects(:multi) + .raises(Redis::CommandError.new("READONLY")) + + val = redis.multi do |transaction| + transaction.set 'foo', 'bar' + transaction.set 'bar', 'foo' + transaction.get 'bar' + end + + expect(val).to eq(nil) + expect(redis.get('foo')).to eq(nil) + expect(redis.get('bar')).to eq(nil) end end