Error de Redis después de la actualización

Recibo este error de Redis cada vez que intento migrar mi base de datos. Es una instalación de Discourse Docker. Por favor, ayúdenme.

¿Tienes una instalación de 2 contenedores o Redis alojado en otro lugar? ¿Tienes Redis 6.2?

Esta es mi versión de Redis 6.2.6 y solo tengo un contenedor de Redis en mi docker y luego algunos contenedores de discourse_dev también.

También he solicitado ayuda en el repositorio de Sidekiq en GitHub.

Esto es lo que aparece cuando ejecuto en mi contenedor de Docker:
d/bundle show redis

/Users/natashaselvidge/discourse/vendor/bundle/ruby/2.6.0/gems/redis-4.6.0

Aquí está mi archivo discourse_redis.rb:

#
#  Un envoltorio alrededor de redis que antepone el prefijo de espacio de nombres a las claves con el ID del sitio actual
#

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
    # Solo usa esto si quieres almacenar y recuperar datos que se comparten entre sitios
    @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

  # anteponer el prefijo del espacio de nombres a la clave
  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

  # Pasar métodos de clave proxy, pero anteponer el prefijo del espacio de nombres a las claves
  [: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
Aviso de depreciación: enable_long_polling/long_polling_interval han cambiado de la configuración del sitio a la configuración global. Elimine la anulación de la interfaz de Configuración del sitio y utilice un archivo de configuración o variables de entorno para establecer la configuración global. (eliminación en Discourse 2.9.0)
En /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`
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
Ignorando /src/db/schema_cache.yml porque ha expirado. La versión actual del esquema es 20220124003259, pero la de la caché es 20211011123651.
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
El pipelining de comandos en una instancia de Redis está obsoleto y se eliminará en Redis 5.0.0.

redis.multi do
  redis.get("key")
end

debería ser reemplazado por

redis.multi do |pipeline|
  pipeline.get("key")
end

(llamado desde /src/lib/discourse_redis.rb:42:in `public_send')
¡rake abortado!
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>'
Tareas: TOP => db:migrate
(Ver rastreo completo ejecutando la tarea con --trace)
natashaselvidge@Natashas-MacBook-Pro discourse %

Parece que actualizaste manualmente el gem de Redis en tu entorno de desarrollo de 4.5.1 a 4.6.0. Discourse no funciona con esa versión del gem, por lo que necesitas volver a la versión que usamos en el archivo Gemfile.lock.

Estamos trabajando para eventualmente pasar a redis-rb 4.6.0, pero eso es mucho trabajo:

Ohhhh, de acuerdo, ¡muchas gracias! Lo intentaré :folded_hands:t3:

Actualización
Para cualquiera que pueda necesitar esto en el futuro :hugs:
¡Muchas gracias, eso lo solucionó! Actualicé mi discourse, pero la versión no se especificó en el archivo gem. Agregué el número de versión al final así: gem ‘redis’, “~> 4.5.1”

Lo especificamos en el Gemfile.lock:

Creo que fue porque borré mi Gemfile.lock y ejecuté bundle. Luego estuve hablando con los chicos de Github sobre los problemas de redis y sidekiq y me dijeron que tenía que estar en la versión actualizada. ¡Gracias de nuevo!