로그에서 데드락 오류가 발생합니다

Job exception: PG::TRDeadlockDetected: ERROR:  deadlock detected
DETAIL:  Process 29659 waits for ShareLock on transaction 892416679; blocked by process 29650.
Process 29650 waits for ShareLock on transaction 892416541; blocked by process 29659.
HINT:  See server log for query details.
CONTEXT:  while rechecking updated tuple (36923,3) in relation "discourse_activity_pub_actors"

/logs에 이러한 오류가 표시되고 있습니다. @angus, 사용자 측면에서 문제가 발생하는지 확실하지 않습니다. 스택 트레이스는 전달(delivery)을 처리하는 작업을 가리키고 있습니다:

rack-mini-profiler-3.3.1/lib/patches/db/pg.rb:69:in `exec_params'  
rack-mini-profiler-3.3.1/lib/patches/db/pg.rb:69:in `exec_params'  
(eval at /var/www/discourse/lib/method_profiler.rb:38):105:in `exec_params'
activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:894:in `block (2 levels) in exec_no_cache'  
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:1004:in `block in with_raw_connection'  
activesupport-7.2.2.1/lib/active_support/concurrency/null_lock.rb:9:in `synchronize'  
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:976:in `with_raw_connection'  
activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:893:in `block in exec_no_cache'  
activesupport-7.2.2.1/lib/active_support/notifications/instrumenter.rb:58:in `instrument'  
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract_adapter.rb:1119:in `log'  
activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:892:in `exec_no_cache'  
activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:872:in `execute_and_clear'  
activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:79:in `exec_delete'  
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/database_statements.rb:208:in `update'  
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/query_cache.rb:27:in `update'  
activerecord-7.2.2.1/lib/active_record/relation.rb:610:in `block in update_all'  
activerecord-7.2.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:421:in `with_connection'  
activerecord-7.2.2.1/lib/active_record/connection_handling.rb:296:in `with_connection'  
activerecord-7.2.2.1/lib/active_record/relation.rb:598:in `update_all'  
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_failure_tracker.rb:36:in `set_domain_actors_as_available'  
/var/www/discourse/plugins/discourse-activity-pub/lib/discourse_activity_pub/delivery_failure_tracker.rb:22:in `track_success'  
/var/www/discourse/plugins/discourse-activity-pub/app/jobs/discourse_activity_pub_deliver.rb:50:in `perform_request'  
/var/www/discourse/plugins/discourse-activity-pub/app/jobs/discourse_activity_pub_deliver.rb:15:in `execute'  
/var/www/discourse/app/jobs/base.rb:316:in `block (2 levels) in perform'  

이것이 문제를 해결할 것입니다

음, 불행히도 그 방법으로 문제가 해결되지 않는 것 같습니다 @angus. 데이터베이스에 많은 수의 액터(actors)가 존재할 수 있으며, 배치 처리가 여전히 충분하지 않은 것 같습니다.

예를 들어 메타(meta)의 경우, 해당 모델에 90,000건 이상의 행이 있습니다:

discourse(prod)> DiscourseActivityPubActor.where(domain: 'mastodon.social').size
=> 90264

모든 전달(delivery) 시마다 그들의 available 컬럼을 업데이트하는 것이 정말로 필수적인가요?

알겠습니다. 이 변경 사항과 이전 변경 사항이 함께 적용되면 문제가 해결될 것으로 보입니다: