bf987af3ca로 업그레이드하고 모든 것을 다시 시도해 보았지만, 여전히 sidekiq 콘솔에 Jobs::HandledExceptionWrapper: Wrapped ActiveRecord::RecordInvalid: Validation failed: Post has already been taken가 최소 38개 이상 표시되고 있습니다.
추가 업데이트가 없으므로, 현재 30개까지 줄었습니다. 제 추측으로는 타임아웃이 발생하고 있는 것 같지만, 제 테스트 계정에는 (지연된) 주간 다이제스트가 도착했고, 이것이 관련이 있을 것으로 보입니다. 실제로 어떤 작업이 중단되는지 확인하기 위해 로그의 어디를 봐야 할지 확실하지 않습니다.
대부분 실패하지만 간혹 성공하는 경우가 있는데, 이는 어딘가에 레이스 컨디션(race condition)이 있는 것 같습니다.
제 백트레이스는 @RBoy와@md-misko가 본 것과 동일해 보이지만, “복사” 버튼에서 제공되는 절단된 버전이 아닌 전체 백트레이스를 여기에 공유합니다:
activerecord-7.0.3/lib/active_record/validations.rb:80:in `raise_validation_error'
activerecord-7.0.3/lib/active_record/validations.rb:53:in `save!'
activerecord-7.0.3/lib/active_record/transactions.rb:302:in `block in save!'
activerecord-7.0.3/lib/active_record/transactions.rb:354:in `block in with_transaction_returning_status'
activerecord-7.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:314:in `transaction'
activerecord-7.0.3/lib/active_record/transactions.rb:350:in `with_transaction_returning_status'
activerecord-7.0.3/lib/active_record/transactions.rb:302:in `save!'
activerecord-7.0.3/lib/active_record/suppressor.rb:54:in `save!'
activerecord-7.0.3/lib/active_record/persistence.rb:55:in `create!'
activerecord-7.0.3/lib/active_record/relation.rb:869:in `_create!'
activerecord-7.0.3/lib/active_record/relation.rb:115:in `block in create!'
activerecord-7.0.3/lib/active_record/relation.rb:880:in `_scoping'
activerecord-7.0.3/lib/active_record/relation.rb:428:in `scoping'
activerecord-7.0.3/lib/active_record/relation.rb:115:in `create!'
activerecord-7.0.3/lib/active_record/relation.rb:219:in `block in create_or_find_by!'
activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:319:in `block in within_new_transaction'
activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
activesupport-7.0.3/lib/active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
activerecord-7.0.3/lib/active_record/connection_adapters/abstract/transaction.rb:317:in `within_new_transaction'
activerecord-7.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:316:in `transaction'
activerecord-7.0.3/lib/active_record/transactions.rb:209:in `transaction'
activerecord-7.0.3/lib/active_record/relation/delegation.rb:67:in `block in transaction'
activerecord-7.0.3/lib/active_record/relation.rb:880:in `_scoping'
activerecord-7.0.3/lib/active_record/relation.rb:428:in `scoping'
activerecord-7.0.3/lib/active_record/relation/delegation.rb:67:in `transaction'
activerecord-7.0.3/lib/active_record/relation.rb:219:in `create_or_find_by!'
activerecord-7.0.3/lib/active_record/querying.rb:22:in `create_or_find_by!'
/var/www/discourse/lib/email/sender.rb:498:in `get_reply_key'
/var/www/discourse/lib/email/sender.rb:105:in `send'
/var/www/discourse/app/jobs/regular/user_email.rb:83:in `send_user_email'
/var/www/discourse/app/jobs/regular/user_email.rb:38:in `execute'
/var/www/discourse/app/jobs/base.rb:232:in `block (2 levels) in perform'
rails_multisite-4.0.1/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.4.2/lib/sidekiq/processor.rb:196:in `execute_job'
sidekiq-6.4.2/lib/sidekiq/processor.rb:164:in `block (2 levels) in process'
sidekiq-6.4.2/lib/sidekiq/middleware/chain.rb:138:in `block in invoke'
/var/www/discourse/lib/sidekiq/pausable.rb:138:in `call'
sidekiq-6.4.2/lib/sidekiq/middleware/chain.rb:140:in `block in invoke'
sidekiq-6.4.2/lib/sidekiq/middleware/chain.rb:143:in `invoke'
sidekiq-6.4.2/lib/sidekiq/processor.rb:163:in `block in process'
sidekiq-6.4.2/lib/sidekiq/processor.rb:136:in `block (6 levels) in dispatch'
sidekiq-6.4.2/lib/sidekiq/job_retry.rb:114:in `local'
sidekiq-6.4.2/lib/sidekiq/processor.rb:135:in `block (5 levels) in dispatch'
sidekiq-6.4.2/lib/sidekiq.rb:40:in `block in <module:Sidekiq>'
sidekiq-6.4.2/lib/sidekiq/processor.rb:131:in `block (4 levels) in dispatch'
sidekiq-6.4.2/lib/sidekiq/processor.rb:257:in `stats'
sidekiq-6.4.2/lib/sidekiq/processor.rb:126:in `block (3 levels) in dispatch'
sidekiq-6.4.2/lib/sidekiq/job_logger.rb:13:in `call'
sidekiq-6.4.2/lib/sidekiq/processor.rb:125:in `block (2 levels) in dispatch'
sidekiq-6.4.2/lib/sidekiq/job_retry.rb:81:in `global'
sidekiq-6.4.2/lib/sidekiq/processor.rb:124:in `block in dispatch'
sidekiq-6.4.2/lib/sidekiq/job_logger.rb:39:in `prepare'
sidekiq-6.4.2/lib/sidekiq/processor.rb:123:in `dispatch'
sidekiq-6.4.2/lib/sidekiq/processor.rb:162:in `process'
sidekiq-6.4.2/lib/sidekiq/processor.rb:78:in `process_one'
sidekiq-6.4.2/lib/sidekiq/processor.rb:68:in `run'
sidekiq-6.4.2/lib/sidekiq/util.rb:56:in `watchdog'
sidekiq-6.4.2/lib/sidekiq/util.rb:65:in `block in safe_thread'
메일 서버가 라운드 로빈에서 다른 서버의 인증서를 사용한다는 사실을 발견했고, 호스트명 불일치가 문제일 것이라고 기대했습니다. 인증서 불일치가 없는 서버로 전환하는 과정에서 b850c12793로 업데이트했지만, 문제는 해결되지 않았습니다. 일부 작업을 재시도해 보았지만, 어느 것도 성공적으로 완료되지 않았습니다. 따라서 이 버그는 숨겨진 인증서 불일치의 증상이 아닙니다.
이는 discourse_docker 2a9faf7e5680b9로 빌드되었습니다.
discourse_docker를 241a42ce718로, 그리고 discourse를 95e7e10417로 업데이트해도 문제가 해결되지 않았습니다. 여전히 이러한 실패가 30건 재시도되고 있습니다.
서버가 이메일 재시도(throttling)를 제한하지 않아 타임아웃이 발생하거나 메일 서버에 의해 거부되고 있을 수 있습니다. 하지만 인증서와 설정이 유효함에도 불구하고 이메일이 계속 전송되지 않는다면, 그 이면에는 다른 근본적인 문제가 있는 것입니다. 일부 사용자의 경우 디스크 공간이 계속 소모되는 현상도 보고되고 있습니다. 제 서버를 확인해 보았지만, 여기서는 그런 문제가 관찰되지 않았습니다.
29건의 실패한 이메일을 검토하여 중요한 내용이 있는지 확인해 보았는데, 내가 아는 한 그런 건 없었습니다. 그래서 이메일 작업이 업그레이드를 가로지르는 동안 발생하는 일시적인 문제 때문일 수도 있겠다는 생각에 sidekiq의 모든 작업을 삭제했습니다. 하지만 추가 업데이트를 적용하지 않은 상태에서 동일한 실패 사례가 다시 한 번 발생했습니다.
이것이 일시적인 이상 현상이 아니라 지속되고 있는 문제라는 정보를 공유하기 위해 이 글을 씁니다.