خطأ Redis بعد التحديث

أتلقى خطأ Redis هذا باستمرار عند محاولة ترحيل قاعدة البيانات الخاصة بي. هذا تثبيت Discourse Docker. من فضلكم ساعدوني.

إعجاب واحد (1)

هل لديك تثبيت من حاويتين أو Redis مستضاف في مكان آخر؟ هل لديك Redis 6.2؟

إعجابَين (2)

هذه هي نسخة Redis الخاصة بي 6.2.6 ولدي حاوية redis واحدة فقط في دوكر الخاص بي ثم عدد قليل من حاويات discourse_dev أيضًا.

إعجابَين (2)

لقد طلبت المساعدة على جانب sidekiq github أيضًا.

هذا ما يظهر عند التشغيل في حاوية docker الخاصة بي
d/bundle show redis

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

هذا هو ملف discourse_redis.rb الخاص بي

#
#  A wrapper around redis that namespaces keys with the current site id
#

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
    # Only use this if you want to store and fetch data that's shared between 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

  # prefix the key with the namespace
  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

  # Proxy key methods through, but prefix the keys with the namespace
  [: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
إشعار إيقاف: تم تبديل enable_long_polling/long_polling_interval من إعدادات الموقع إلى الإعدادات العامة. قم بإزالة التجاوز من واجهة مستخدم إعدادات الموقع، واستخدم ملف تكوين أو متغيرات بيئة لتعيين الإعدادات العامة. (الإزالة في 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`
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تجاهل /src/db/schema_cache.yml لأنه انتهت صلاحيته. إصدار المخطط الحالي هو 20220124003259، ولكن الإصدار الموجود في ذاكرة التخزين المؤقت هو 20211011123651.
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إيقاف تجميع الأوامر على مثيل Redis وسيتم إزالته في Redis 5.0.0.

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

يجب استبداله بـ

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

(تم الاستدعاء من /src/lib/discourse_redis.rb:42:in `public_send')
تم إلغاء rake!
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
(انظر التتبع الكامل عن طريق تشغيل المهمة مع --trace)
natashaselvidge@Natashas-MacBook-Pro discourse % 

يبدو أنك قمت بتحديث جوهرة Redis يدويًا في بيئة التطوير الخاصة بك من 4.5.1 إلى 4.6.0. لا يعمل Discourse مع إصدار الجوهرة هذا، لذا تحتاج إلى العودة إلى الإصدار الذي نستخدمه في ملف Gemfile.lock.

نحن نعمل على الانتقال في النهاية إلى redis-rb 4.6.0، ولكن هذا الكثير من العمل:

4 إعجابات

أوه حسناً، شكراً جزيلاً لك! سأجرب ذلك :folded_hands:t3:

إعجاب واحد (1)

تحديث
لمن قد يحتاج هذا في المستقبل :hugs:
شكراً جزيلاً، لقد تم حل المشكلة! قمت بتحديث منصة discourse الخاصة بي، ولكن لم يتم تحديد الإصدار في ملف gem. أضفت رقم الإصدار في النهاية هكذا: gem ‘redis’, “~> 4.5.1”

نحددها في Gemfile.lock:

إعجاب واحد (1)

أعتقد أن ذلك بسبب أنني حذفت ملف Gemfile.lock وقمت بتجميعها. ثم كنت أتحدث مع الأشخاص الذين لديهم مشاكل مع redis و sidekiq على Github وكانوا يخبرونني أنه يجب أن أكون على الإصدار المحدث. شكراً مرة أخرى!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.