Erreur Redis après la mise à jour

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.

1 « J'aime »

Avez-vous une installation à 2 conteneurs ou du Redis hébergé ailleurs ? Avez-vous du Redis 6.2 ?

2 « J'aime »

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.

2 « J'aime »

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 :

4 « J'aime »

Ohhhh d’accord, merci beaucoup ! Je vais essayer ça :folded_hands:t3:

1 « J'aime »

Mise à jour
Pour quiconque pourrait en avoir besoin à l’avenir :hugs:
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 :

1 « J'aime »

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.