parent
98bc28cea2
commit
a3dfd553a1
|
@ -310,7 +310,7 @@ GEM
|
||||||
msgpack (>= 0.4.3)
|
msgpack (>= 0.4.3)
|
||||||
optimist (>= 3.0.0)
|
optimist (>= 3.0.0)
|
||||||
rchardet (1.8.0)
|
rchardet (1.8.0)
|
||||||
redis (4.2.0)
|
redis (4.1.4)
|
||||||
redis-namespace (1.7.0)
|
redis-namespace (1.7.0)
|
||||||
redis (>= 3.0.4)
|
redis (>= 3.0.4)
|
||||||
regexp_parser (1.7.1)
|
regexp_parser (1.7.1)
|
||||||
|
|
|
@ -65,7 +65,7 @@ if ENV["ACTIVE_RECORD_RAILS_FAILOVER"]
|
||||||
end
|
end
|
||||||
|
|
||||||
RailsFailover::ActiveRecord.register_force_reading_role_callback do
|
RailsFailover::ActiveRecord.register_force_reading_role_callback do
|
||||||
Discourse.redis.exists?(
|
Discourse.redis.exists(
|
||||||
Discourse::PG_READONLY_MODE_KEY,
|
Discourse::PG_READONLY_MODE_KEY,
|
||||||
Discourse::PG_FORCE_READONLY_MODE_KEY
|
Discourse::PG_FORCE_READONLY_MODE_KEY
|
||||||
)
|
)
|
||||||
|
|
|
@ -43,7 +43,7 @@ class AdminConfirmation
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.exists_for?(user_id)
|
def self.exists_for?(user_id)
|
||||||
Discourse.redis.exists? "admin-confirmation:#{user_id}"
|
Discourse.redis.exists "admin-confirmation:#{user_id}"
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.find_by_code(token)
|
def self.find_by_code(token)
|
||||||
|
|
|
@ -489,7 +489,7 @@ module Discourse
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.readonly_mode?(keys = READONLY_KEYS)
|
def self.readonly_mode?(keys = READONLY_KEYS)
|
||||||
recently_readonly? || Discourse.redis.exists?(*keys)
|
recently_readonly? || Discourse.redis.exists(*keys)
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.pg_readonly_mode?
|
def self.pg_readonly_mode?
|
||||||
|
|
|
@ -193,7 +193,7 @@ class DiscourseRedis
|
||||||
end
|
end
|
||||||
|
|
||||||
# Proxy key methods through, but prefix the keys with the namespace
|
# Proxy key methods through, but prefix the keys with the namespace
|
||||||
[:append, :blpop, :brpop, :brpoplpush, :decr, :decrby, :expire, :expireat, :exists, :exists?, :get, :getbit, :getrange, :getset,
|
[:append, :blpop, :brpop, :brpoplpush, :decr, :decrby, :expire, :expireat, :get, :getbit, :getrange, :getset,
|
||||||
:hdel, :hexists, :hget, :hgetall, :hincrby, :hincrbyfloat, :hkeys, :hlen, :hmget, :hmset, :hset, :hsetnx, :hvals, :incr,
|
:hdel, :hexists, :hget, :hgetall, :hincrby, :hincrbyfloat, :hkeys, :hlen, :hmget, :hmset, :hset, :hsetnx, :hvals, :incr,
|
||||||
:incrby, :incrbyfloat, :lindex, :linsert, :llen, :lpop, :lpush, :lpushx, :lrange, :lrem, :lset, :ltrim,
|
:incrby, :incrbyfloat, :lindex, :linsert, :llen, :lpop, :lpush, :lpushx, :lrange, :lrem, :lset, :ltrim,
|
||||||
:mapped_hmset, :mapped_hmget, :mapped_mget, :mapped_mset, :mapped_msetnx, :move, :mset,
|
:mapped_hmset, :mapped_hmget, :mapped_mget, :mapped_mset, :mapped_msetnx, :move, :mset,
|
||||||
|
@ -207,6 +207,19 @@ class DiscourseRedis
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Implement our own because https://github.com/redis/redis-rb/issues/698 has stalled
|
||||||
|
def exists(*keys)
|
||||||
|
keys.map! { |a| "#{namespace}:#{a}" } if @namespace
|
||||||
|
|
||||||
|
DiscourseRedis.ignore_readonly do
|
||||||
|
@redis.synchronize do |client|
|
||||||
|
client.call([:exists, *keys]) do |value|
|
||||||
|
value > 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def mget(*args)
|
def mget(*args)
|
||||||
args.map! { |a| "#{namespace}:#{a}" } if @namespace
|
args.map! { |a| "#{namespace}:#{a}" } if @namespace
|
||||||
DiscourseRedis.ignore_readonly { @redis.mget(*args) }
|
DiscourseRedis.ignore_readonly { @redis.mget(*args) }
|
||||||
|
|
|
@ -87,6 +87,31 @@ describe DiscourseRedis do
|
||||||
expect(Discourse.recently_readonly?).to eq(true)
|
expect(Discourse.recently_readonly?).to eq(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '.exists' do
|
||||||
|
it 'should return false when key is not present' do
|
||||||
|
expect(Discourse.redis.exists('test')).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should return false when keys are not present' do
|
||||||
|
expect(Discourse.redis.exists('test', 'test2')).to eq(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should return true when key is present' do
|
||||||
|
Discourse.redis.set('test', 1)
|
||||||
|
|
||||||
|
expect(Discourse.redis.exists('test')).to eq(true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should return true when any key is present' do
|
||||||
|
Discourse.redis.set('test', 1)
|
||||||
|
Discourse.redis.set('test2', 1)
|
||||||
|
|
||||||
|
expect(Discourse.redis.exists('test')).to eq(true)
|
||||||
|
expect(Discourse.redis.exists('test', 'test2')).to eq(true)
|
||||||
|
expect(Discourse.redis.exists('test2', 'test3')).to eq(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context '.slave_host' do
|
context '.slave_host' do
|
||||||
|
|
Loading…
Reference in New Issue