Jobs::DownloadAvatarFromUrl expira

Olá,

acabamos de começar a usar o avatar_url via discourseconnect. A substituição de avatar está ativada e a atualização forçada de avatar está definida como true no lado do SSO.

O login funciona conforme o esperado, mas os avatares não são sincronizados. Ativar o modo detalhado (verbose) para o login SSO mostra todos os parâmetros corretos, mas sempre recebemos um erro de Jobs::DownloadAvatarFromUrl que diz “Exceção de Job: execução expirada”.

Não sei o que pode estar causando isso. Testei em uma instância local do Discourse e funcionou perfeitamente (ou seja, os avatares foram baixados sem problemas).

Alguma ideia de como corrigir isso ou do que está causando o problema?

Versão atual do Discourse: 2.8.0.beta1

ambiente:

hostname	docker-app
process_id	127
application_version	96fd202d9cdac98196abd952c53f583b4af9d8f2
current_db	default
current_hostname	*hostname correto*
job	Jobs::DownloadAvatarFromUrl
problem_db	default
time	10:58 am
opts	
url	*url correta*
user_id	*ID de usuário correto*
override_gravatar	true
current_site_id	default

rastreio de chamada:

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

Edição: Há RAM e espaço em disco suficientes. Já verifiquei isso.

Edição 2: Na verdade, pode ser um problema de memória. Não percebi a diferença entre a memória da máquina host e a memória alocada para o Discourse. Atualmente, temos apenas 512 MB definidos no nosso app.yml, embora ainda precise verificar se essa é a causa.

Desculpe pela atualização tardia.

Acabei de testar com 1024 MB e 2048 MB de memória alocada, mas o resultado continua o mesmo. Qualquer outra sugestão seria muito apreciada!

Edição: Depois de revisar os logs várias vezes, verifiquei o código do trabalho e percebi que ele não foi projetado para ser reexecutado. Naturalmente, foi exatamente isso que fiz. Editei o arquivo e descobri no Sidekiq que meu problema está relacionado a questões de rede.

O trabalho de reexecução me retorna

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

como um erro com o qual realmente posso trabalhar.

A lição para qualquer pessoa no futuro é: Se URI.open(your url).read no console do Rails não funcionar, provavelmente é um problema de rede do Ruby e não do Discourse. Tive essa ideia a partir do stackoverflow