Jobs::DownloadAvatarFromUrl falla por tiempo de espera agotado

Hola,

Acabamos de empezar a usar avatar_url a través de DiscourseConnect. La anulación de avatar está habilitada y la actualización forzada de avatar está configurada en true en el lado del SSO.

El inicio de sesión funciona como se esperaba, pero los avatares no se sincronizan. Al habilitar el modo detallado (verbose) para el inicio de sesión SSO, se muestran todos los parámetros correctos, pero siempre recibimos un error de Jobs::DownloadAvatarFromUrl que indica: “Job exception: execution expired”.

No sé qué podría estar causando esto. Lo probé en una instancia local de Discourse y funcionó sin problemas (es decir, los avatares se descargaron sin inconvenientes).

¿Alguna idea sobre cómo solucionarlo o qué podría estar causando esto?

Versión actual de Discourse: 2.8.0.beta1

Entorno:

hostname	docker-app
process_id	127
application_version	96fd202d9cdac98196abd952c53f583b4af9d8f2
current_db	default
current_hostname	*nombre de host correcto*
job	Jobs::DownloadAvatarFromUrl
problem_db	default
time	10:58 am
opts	
url	*URL correcta*
user_id	*ID de usuario correcto*
override_gravatar	true
current_site_id	default

Rastreo de la pila (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'

Edición: Hay suficiente RAM y espacio en disco. Ya lo verifiqué.

Edición 2: En realidad, podría ser un problema de memoria. No noté la diferencia entre la memoria de la máquina anfitriona y la memoria asignada a Discourse. Actualmente solo tenemos configurados 512 MB en nuestro app.yml, aunque todavía debo verificar que eso sea la causa.

Disculpa la actualización tardía.

Acabo de probar con 1024 MB y 2048 MB de memoria asignada, pero el resultado sigue siendo el mismo. ¡Cualquier otra sugerencia será muy apreciada!

Edición: Así que después de revisar los registros una y otra vez, revisé el código del trabajo y vi que no estaba pensado para reintentarse. Naturalmente, eso es exactamente lo que hice. Edité el archivo y descubrí en Sidekiq que mi problema en realidad está relacionado con la red.

El trabajo de reintento me devuelve:

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

como un error con el que realmente puedo trabajar.

La lección para cualquiera en el futuro es: si URI.open(tu_url).read en la consola de Rails no funciona, probablemente sea un problema de red de Ruby y no un problema de Discourse. Tuve la idea de Stack Overflow.