Jobs::DownloadAvatarFromUrl ينتهي وقتها

مرحباً،

بدأنا للتو في استخدام avatar_url عبر discourseconnect. تم تمكين تجاوز الصورة الرمزية (Override avatar)، وتم تعيين تحديث الصورة الرمزية القسري (force avatar update) على “true” في جانب SSO.

تعمل عملية تسجيل الدخول كما هو متوقع، لكن الصور الرمزية لا تتم مزامنتها. عند تمكين وضع التفصيل (verbose) لتسجيل دخول SSO، تظهر جميع المعاملات الصحيحة، لكننا نحصل دائماً على خطأ من Jobs::DownloadAvatarFromUrl يقول: “Job exception: execution expired”.

لا أعرف ما الذي قد يسبب ذلك. جربت الأمر على نسخة Discourse محلية وعمل دون أي مشاكل (أي أن الصور الرمزية تم تحميلها دون عوائق).

هل لديكم أي أفكار حول كيفية إصلاح ذلك أو ما الذي يسببه؟

إصدار Discourse الحالي: 2.8.0.beta1

البيئة:

hostname	docker-app
process_id	127
application_version	96fd202d9cdac98196abd952c53f583b4af9d8f2
current_db	default
current_hostname	*correct hostname*
job	Jobs::DownloadAvatarFromUrl
problem_db	default
time	10:58 am
opts	
url	*correct url*
user_id	*correct user id*
override_gravatar	true
current_site_id	default

مسار التتبع (backtrace):

/usr/local/lib/ruby/2.7.0/net/http.rb:960:in `initialize'
/usr/local/lib/ruby/2.7.0/net/http.rb:960:in `open'
/usr/local/lib/ruby/2.7.0/net/http.rb:960:in `block in connect'
/usr/local/lib/ruby/2.7.0/timeout.rb:105:in `timeout'
/usr/local/lib/ruby/2.7.0/net/http.rb:958:in `connect'
/usr/local/lib/ruby/2.7.0/net/http.rb:943:in `do_start'
/usr/local/lib/ruby/2.7.0/net/http.rb:932:in `start'
/usr/local/lib/ruby/2.7.0/net/http.rb:606:in `start'
/var/www/discourse/lib/final_destination.rb:443:in `safe_session'
/var/www/discourse/lib/final_destination.rb:394:in `safe_get'
/var/www/discourse/lib/final_destination.rb:133:in `get'
/var/www/discourse/lib/file_helper.rb:56:in `download'
/var/www/discourse/app/models/user_avatar.rb:98:in `import_url_for_user'
/var/www/discourse/app/jobs/regular/download_avatar_from_url.rb:18:in `execute'
/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'
rails_multisite-3.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/app/jobs/base.rb:221:in `block in perform'
/var/www/discourse/app/jobs/base.rb:217:in `each'
/var/www/discourse/app/jobs/base.rb:217:in `perform'
sidekiq-6.2.1/lib/sidekiq/processor.rb:196:in `execute_job'
sidekiq-6.2.1/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'
sidekiq-6.2.1/lib/sidekiq/middleware/chain.rb:138:in `block in invoke'
/var/www/discourse/lib/sidekiq/pausable.rb:138:in `call'
sidekiq-6.2.1/lib/sidekiq/middleware/chain.rb:140:in `block in invoke'
sidekiq-6.2.1/lib/sidekiq/middleware/chain.rb:143:in `invoke'
sidekiq-6.2.1/lib/sidekiq/processor.rb:163:in `block in process'
sidekiq-6.2.1/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
sidekiq-6.2.1/lib/sidekiq/job_retry.rb:112:in `local'
sidekiq-6.2.1/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
sidekiq-6.2.1/lib/sidekiq.rb:38:in `block in <module:Sidekiq>'
sidekiq-6.2.1/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
sidekiq-6.2.1/lib/sidekiq/processor.rb:257:in `stats'
sidekiq-6.2.1/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
sidekiq-6.2.1/lib/sidekiq/job_logger.rb:13:in `call'
sidekiq-6.2.1/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
sidekiq-6.2.1/lib/sidekiq/job_retry.rb:79:in `global'
sidekiq-6.2.1/lib/sidekiq/processor.rb:124:in `block in dispatch'
sidekiq-6.2.1/lib/sidekiq/logger.rb:11:in `with'
sidekiq-6.2.1/lib/sidekiq/job_logger.rb:33:in `prepare'
sidekiq-6.2.1/lib/sidekiq/processor.rb:123:in `dispatch'
sidekiq-6.2.1/lib/sidekiq/processor.rb:162:in `process'
sidekiq-6.2.1/lib/sidekiq/processor.rb:78:in `process_one'
sidekiq-6.2.1/lib/sidekiq/processor.rb:68:in `run'
sidekiq-6.2.1/lib/sidekiq/util.rb:43:in `watchdog'
sidekiq-6.2.1/lib/sidekiq/util.rb:52:in `block in safe_thread'

تعديل: يوجد ذاكرة RAM ومساحة قرص كافية. لقد تحققت من ذلك بالفعل.

تعديل 2: قد يكون الأمر في الواقع مشكلة ذاكرة. لم ألاحظ الفرق بين الذاكرة على جهاز المضيف والذاكرة المخصصة لـ Discourse. حاليًا، لدينا فقط 512 ميجابايت مضبوطة في ملف app.yml، رغم أنني ما زلت بحاجة للتحقق مما إذا كان هذا هو السبب.

آسف على التحديث المتأخر.

لقد قمت للتو باختبار تخصيص 1024 ميجابايت و2048 ميجابايت من الذاكرة، لكن النتيجة لا تزال نفسها. أي اقتراحات إضافية ستكون موضع تقدير كبير!

تعديل: لذا، بعد مراجعة السجلات مرارًا وتكرارًا، تفحصت كود المهمة ووجدت أن إعادة المحاولة ليست مقصودة. بطبيعة الحال، هذا بالضبط ما فعلته. عدلت الملف ووجدت في Sidekiq أن مشكلتي مرتبطة في الواقع بأشياء متعلقة بالشبكة.

تعمل إعادة المحاولة للمهمة على إظهار

Jobs::HandledExceptionWrapper: Wrapped Net::OpenTimeout: execution expired

كخطأ يمكنني التعامل معه فعليًا.

الخلاصة لأي شخص في المستقبل: إذا لم يعمل URI.open(your url).read في وحدة تحكم Rails، فمن المرجح أن تكون المشكلة متعلقة بشبكة Ruby بدلاً من مشكلة في Discourse. لقد حصلت على الفكرة من stackoverflow