Je continue de recevoir cette erreur Redis lorsque j’essaie de migrer ma base de données. Il s’agit d’une installation Docker de Discourse. Aidez-moi s’il vous plaît.
Avez-vous une installation à 2 conteneurs ou du Redis hébergé ailleurs ? Avez-vous du Redis 6.2 ?
Ceci est ma version de Redis 6.2.6 et je n’ai qu’un seul conteneur Redis dans mon docker, puis quelques conteneurs discourse_dev également.
J’ai également demandé de l’aide sur le github de sidekiq.
Voici ce qui s’affiche lorsque j’exécute dans mon conteneur Docker :
d/bundle show redis
/Users/natashaselvidge/discourse/vendor/bundle/ruby/2.6.0/gems/redis-4.6.0
Voici mon fichier discourse_redis.rb :
#
# Un wrapper autour de redis qui préfixe les clés avec l'ID du site actuel
#
class DiscourseRedis
def self.raw_connection(config = nil)
config ||= self.config
Redis.new(config)
end
def self.config
GlobalSetting.redis_config
end
def initialize(config = nil, namespace: true)
@config = config || DiscourseRedis.config
@redis = DiscourseRedis.raw_connection(@config.dup)
@namespace = namespace
end
def without_namespace
# Utilisez ceci uniquement si vous souhaitez stocker et récupérer des données partagées entre les sites
@redis
end
def self.ignore_readonly
yield
rescue Redis::CommandError => ex
if ex.message =~ /READONLY/
Discourse.received_redis_readonly!
nil
else
raise ex
end
end
# préfixe la clé avec l'espace de noms
def method_missing(meth, *args, **kwargs, &block)
if @redis.respond_to?(meth)
DiscourseRedis.ignore_readonly { @redis.public_send(meth, *args, **kwargs, &block) }
else
super
end
end
# Transmet les méthodes de clé, mais préfixe les clés avec l'espace de noms
[: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,
:incrby, :incrbyfloat, :lindex, :linsert, :llen, :lpop, :lpush, :lpushx, :lrange, :lrem, :lset, :ltrim,
:mapped_hmset, :mapped_hmget, :mapped_mget, :mapped_mset, :mapped_msetnx, :move, :mset,
:msetnx, :persist, :pexpire, :pexpireat, :psetex, :pttl, :rename, :renamenx, :rpop, :rpoplpush, :rpush, :rpushx, :sadd, :scard,
:sdiff, :set, :setbit, :setex, :setnx, :setrange, :sinter, :sismember, :smembers, :sort, :spop, :srandmember, :srem, :strlen,
:sunion, :ttl, :type, :watch, :zadd, :zcard, :zcount, :zincrby, :zrange, :zrangebyscore, :zrank, :zrem, :zremrangebyrank,
:zremrangebyscore, :zrevrange, :zrevrangebyscore, :zrevrank, :zrangebyscore,
:dump, :restore].each do |m|
define_method m do |*args, **kwargs|
args[0] = "#{namespace}:#{args[0]}" if @namespace
DiscourseRedis.ignore_readonly { @redis.public_send(m, *args, **kwargs) }
end
end
def exists(*args)
args.map! { |a| "#{namespace}:#{a}" } if @namespace
DiscourseRedis.ignore_readonly { @redis.exists(*args) }
end
def exists?(*args)
args.map! { |a| "#{namespace}:#{a}" } if @namespace
DiscourseRedis.ignore_readonly { @redis.exists?(*args) }
end
def mget(*args)
args.map! { |a| "#{namespace}:#{a}" } if @namespace
DiscourseRedis.ignore_readonly { @redis.mget(*args) }
end
def del(*keys)
DiscourseRedis.ignore_readonly do
keys = keys.flatten(1)
keys.map! { |k| "#{namespace}:#{k}" } if @namespace
@redis.del(*keys)
end
end
def scan_each(options = {}, &block)
DiscourseRedis.ignore_readonly do
match = options[:match].presence || '*'
options[:match] =
if @namespace
"#{namespace}:#{match}"
else
match
end
if block
@redis.scan_each(**options) do |key|
key = remove_namespace(key) if @namespace
block.call(key)
end
else
@redis.scan_each(**options).map do |key|
key = remove_namespace(key) if @namespace
key
end
end
end
end
def keys(pattern = nil)
DiscourseRedis.ignore_readonly do
pattern = pattern || '*'
pattern = "#{namespace}:#{pattern}" if @namespace
keys = @redis.keys(pattern)
if @namespace
len = namespace.length + 1
keys.map! { |k| k[len..-1] }
end
keys
end
end
def delete_prefixed(prefix)
DiscourseRedis.ignore_readonly do
keys("#{prefix}*").each { |k| Discourse.redis.del(k) }
end
end
def reconnect
@redis._client.reconnect
end
def namespace_key(key)
if @namespace
"#{namespace}:#{key}"
else
key
end
end
def namespace
RailsMultisite::ConnectionManagement.current_db
end
def self.new_redis_store
Cache.new
end
private
def remove_namespace(key)
key[(namespace.length + 1)..-1]
end
class EvalHelper
def initialize(script)
@script = script
@sha1 = Digest::SHA1.hexdigest(script)
end
def eval(redis, *args, **kwargs)
redis.evalsha @sha1, *args, **kwargs
rescue ::Redis::CommandError => e
if e.to_s =~ /^NOSCRIPT/
redis.eval @script, *args, **kwargs
else
raise
end
end
end
end
natashaselvidge@Natashas-MacBook-Pro discourse % d/rake db:migrate
Avis de dépréciation : enable_long_polling/long_polling_interval sont passés des paramètres du site aux paramètres globaux. Supprimez la substitution de l'interface utilisateur des paramètres du site et utilisez un fichier de configuration ou des variables d'environnement pour définir les paramètres globaux. (suppression dans Discourse 2.9.0)
À /usr/local/lib/ruby/gems/2.7.0/gems/bootsnap-1.10.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:48:in `load`
L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')Ignoré /src/db/schema_cache.yml car il a expiré. La version actuelle du schéma est 20220124003259, mais celle dans le cache est 20211011123651.
L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')L'utilisation de commandes en pipeline sur une instance Redis est dépréciée et sera supprimée dans Redis 5.0.0.
redis.multi do
redis.get("key")
end
devrait être remplacé par
redis.multi do |pipeline|
pipeline.get("key")
end
(appelé depuis /src/lib/discourse_redis.rb:42:in `public_send')
rake aborted!
Redis::CommandError: ERR unknown command `synchronize`, with args beginning with:
/src/lib/distributed_mutex.rb:84:in `try_to_get_lock'
/src/lib/distributed_mutex.rb:61:in `get_lock'
/src/lib/distributed_mutex.rb:30:in `block in synchronize'
/src/lib/distributed_mutex.rb:29:in `synchronize'
/src/lib/distributed_mutex.rb:29:in `synchronize'
/src/lib/distributed_mutex.rb:14:in `synchronize'
/src/lib/tasks/db.rake:210:in `block in <main>'
Tasks: TOP => db:migrate
(Voir la trace complète en exécutant la tâche avec --trace)
natashaselvidge@Natashas-MacBook-Pro discourse %
Il semble que vous ayez mis à jour manuellement la gemme Redis dans votre environnement de développement de la version 4.5.1 à la version 4.6.0. Discourse ne fonctionne pas avec cette version de la gemme, vous devez donc revenir à la version que nous utilisons dans le fichier Gemfile.lock.
Nous travaillons à passer éventuellement à redis-rb 4.6.0, mais cela représente beaucoup de travail :
Ohhhh d’accord, merci beaucoup ! Je vais essayer ça ![]()
Mise à jour
Pour quiconque pourrait en avoir besoin à l’avenir ![]()
Merci beaucoup, ça a résolu le problème ! J’ai mis à jour mon discourse, mais la version n’était pas spécifiée dans le fichier gem. J’ai ajouté le numéro de version à la fin comme ceci : gem ‘redis’, “~> 4.5.1”
Nous le spécifions dans le Gemfile.lock :
Je pense que c’est parce que j’ai supprimé mon Gemfile.lock et que j’ai fait un bundle. Ensuite, je parlais aux gars de Github des problèmes de redis et de sidekiq et ils me disaient que je devais être sur la version mise à jour. Merci encore !
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
