Jobs::DownloadAvatarFromUrl 超时

您好,

我们刚开始通过 DiscourseConnect 使用 avatar_url。SSO 端已启用“覆盖头像”并将“强制更新头像”设置为 true。

登录功能正常,但头像无法同步。启用 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	*正确的hostname*
job	Jobs::DownloadAvatarFromUrl
problem_db	default
time	上午 10:58
opts	
url	*正确的url*
user_id	*正确的user id*
override_gravatar	true
current_site_id	default

堆栈跟踪:

/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'

编辑:内存和磁盘空间充足。我已经检查过这一点。

编辑2:这实际上可能是一个内存问题。我之前没有注意到宿主机内存与 Discourse 分配内存之间的区别。我们目前在 app.yml 中仅设置了 512MB,不过我还需要验证这是否是根本原因。

抱歉更新晚了。

我刚刚用分配了 1024MB 和 2048MB 内存进行了测试,但结果仍然相同。非常欢迎提供任何进一步的建议!

编辑: 在反复查看日志后,我检查了该任务的代码,发现这原本就不打算重试。当然,我确实做了重试。我编辑了文件,并在 Sidekiq 中发现我的问题实际上与网络有关。

重试任务给出的错误是:

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

这是一个我可以实际处理的错误。

给未来任何人的经验之谈是:如果在 Rails 控制台中 URI.open(your url).read 无法工作,这很可能是 Ruby 网络问题,而不是 Discourse 的问题。这个想法来自 Stack Overflow