Snippets API: request timeout error

Problem

The snippets API responds with 500 error. It's caused by PG::QueryCanceled exception.

Proposal

Review the performance of the SQL query and improve it to prevent a timeout.

Backtrace

PG::QueryCanceled: ERROR:  canceling statement due to statement timeout (PG::QueryCanceled)
  from active_record/connection_adapters/postgresql_adapter.rb:768:in `exec_params'
  from active_record/connection_adapters/postgresql_adapter.rb:768:in `block (2 levels) in exec_no_cache'
  from active_support/concurrency/share_lock.rb:187:in `yield_shares'
  from active_support/dependencies/interlock.rb:41:in `permit_concurrent_loads'
  from active_record/connection_adapters/postgresql_adapter.rb:767:in `block in exec_no_cache'
  from active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
  from active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
  from active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
  from active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
  from active_record/connection_adapters/abstract_adapter.rb:752:in `block in log'
  from active_support/notifications/instrumenter.rb:24:in `instrument'
  from active_record/connection_adapters/abstract_adapter.rb:743:in `log'
  from active_record/connection_adapters/postgresql_adapter.rb:766:in `exec_no_cache'
  from active_record/connection_adapters/postgresql_adapter.rb:745:in `execute_and_clear'
  from marginalia.rb:91:in `execute_and_clear_with_marginalia'
  from active_record/connection_adapters/postgresql/database_statements.rb:54:in `exec_query'
  from active_record/connection_adapters/abstract/database_statements.rb:560:in `select'
  from active_record/connection_adapters/abstract/database_statements.rb:66:in `select_all'
  from active_record/connection_adapters/abstract/query_cache.rb:107:in `block in select_all'
  from active_record/connection_adapters/abstract/query_cache.rb:137:in `block in cache_sql'
  from active_support/concurrency/load_interlock_aware_monitor.rb:25:in `handle_interrupt'
  from active_support/concurrency/load_interlock_aware_monitor.rb:25:in `block in synchronize'
  from active_support/concurrency/load_interlock_aware_monitor.rb:21:in `handle_interrupt'
  from active_support/concurrency/load_interlock_aware_monitor.rb:21:in `synchronize'
  from active_record/connection_adapters/abstract/query_cache.rb:128:in `cache_sql'
  from active_record/connection_adapters/abstract/query_cache.rb:107:in `select_all'
  from lib/gitlab/database/load_balancing/connection_proxy.rb:111:in `public_send'
  from lib/gitlab/database/load_balancing/connection_proxy.rb:111:in `block in read_using_load_balancer'
  from lib/gitlab/database/load_balancing/load_balancer.rb:65:in `read'
  from lib/gitlab/database/load_balancing/connection_proxy.rb:110:in `read_using_load_balancer'
  from lib/gitlab/database/load_balancing/connection_proxy.rb:48:in `select_all'
  from active_record/querying.rb:54:in `_query_by_sql'
  from active_record/relation.rb:942:in `block in exec_main_query'
  from active_record/relation.rb:962:in `skip_query_cache_if_necessary'
  from active_record/relation.rb:928:in `exec_main_query'
  from active_record/relation.rb:914:in `block in exec_queries'
  from active_record/relation.rb:962:in `skip_query_cache_if_necessary'
  from active_record/relation.rb:908:in `exec_queries'
  from active_record/gitlab_patches/rescue_from.rb:31:in `exec_queries'
  from active_record/relation.rb:695:in `load'
  from active_record/relation.rb:250:in `records'
  from active_record/relation/finder_methods.rb:520:in `find_take'
  from active_record/relation/finder_methods.rb:98:in `take'
  from active_record/relation/finder_methods.rb:81:in `find_by'
  from active_record/querying.rb:22:in `find_by'
  from active_record/core.rb:288:in `find_by'
  from active_record/dynamic_matchers.rb:66:in `find_by_id'
  from active_record/dynamic_matchers.rb:20:in `method_missing'
  from attr_encrypted.rb:310:in `method_missing'
  from attr_encrypted/adapters/active_record.rb:136:in `method_missing_with_attr_encrypted'
  from active_record/relation/delegation.rb:108:in `public_send'
  from active_record/relation/delegation.rb:108:in `block in method_missing'
  from active_record/relation.rb:881:in `_scoping'
  from active_record/relation.rb:428:in `scoping'
  from active_record/relation/delegation.rb:108:in `method_missing'
  from lib/api/snippets.rb:246:in `block (2 levels) in <class:Snippets>'
Edited by 🤖 GitLab Bot 🤖