Skip to content

Raise Exception instead of StandardError for early transaction exits

Peter Leitzen requested to merge pl-raise-exception-exit-transaction into master

What does this MR do and why?

Raising an Exception instead of DeprecationException or StandardError increases the probability that this exception is not caught in application code.

Follow-up of !122585 (merged). Refs to #410086 (closed).

How to set up and validate locally

bin/rspec --order defined  spec/requests/api/commit_statuses_spec.rb -e 'when the `state` parameter is sent the same'

Failures:

  1) API::CommitStatuses POST /projects/:id/statuses/:sha developer user with all optional parameters when updating a commit status when the `state` parameter is sent the same does not update the commit status
     Failure/Error: connection.public_send(...)

     Exception:
       DEPRECATION WARNING: Using `return`, `break` or `throw` to exit a transaction block is
       deprecated without replacement. If the `throw` came from
       `Timeout.timeout(duration)`, pass an exception class as a second
       argument so it doesn't use `throw` to abort its block. This results
       in the transaction being committed, but in the next release of Rails
       it will rollback.
        (called from public_send at /home/peter/devel/gitlab/gdk/gitlab/lib/gitlab/database/load_balancing/connection_proxy.rb:127)
     # ./config/initializers/00_deprecations.rb:26:in `block in <main>'
     # ./lib/gitlab/database/load_balancing/connection_proxy.rb:127:in `public_send'
     # ./lib/gitlab/database/load_balancing/connection_proxy.rb:127:in `block in write_using_load_balancer'
     # ./lib/gitlab/database/load_balancing/load_balancer.rb:127:in `block in read_write'
     # ./lib/gitlab/database/load_balancing/load_balancer.rb:198:in `retry_with_backoff'
     # ./lib/gitlab/database/load_balancing/load_balancer.rb:116:in `read_write'
     # ./lib/gitlab/database/load_balancing/connection_proxy.rb:126:in `write_using_load_balancer'
     # ./lib/gitlab/database/load_balancing/connection_proxy.rb:78:in `transaction'
     # ./lib/gitlab/database.rb:385:in `block in transaction'
     # ./lib/gitlab/database.rb:384:in `transaction'
     # ./app/models/concerns/cross_database_modification.rb:83:in `transaction'
     # ./app/services/ci/pipelines/add_job_service.rb:20:in `block in execute!'
     # ./lib/gitlab/exclusive_lease_helpers.rb:38:in `in_lock'
     # ./app/services/ci/pipelines/add_job_service.rb:19:in `execute!'
     # ./lib/api/commit_statuses.rb:137:in `block (2 levels) in <class:CommitStatuses>'
     # ./ee/lib/gitlab/middleware/ip_restrictor.rb:14:in `block in call'
     # ./ee/lib/gitlab/ip_address_state.rb:10:in `with'
     # ./ee/lib/gitlab/middleware/ip_restrictor.rb:13:in `call'
     # ./lib/api/api_guard.rb:219:in `call'
     # ./lib/gitlab/middleware/memory_report.rb:13:in `call'
     # ./lib/gitlab/middleware/speedscope.rb:13:in `call'
     # ./lib/gitlab/query_limiting/middleware.rb:17:in `block in call'
     # ./lib/gitlab/query_limiting/transaction.rb:45:in `run'
     # ./lib/gitlab/query_limiting/middleware.rb:16:in `call'
     # ./lib/gitlab/database/load_balancing/rack_middleware.rb:23:in `call'
     # ./lib/gitlab/jira/middleware.rb:19:in `call'
     # ./lib/gitlab/middleware/go.rb:20:in `call'
     # ./lib/gitlab/etag_caching/middleware.rb:21:in `call'
     # ./lib/gitlab/middleware/query_analyzer.rb:11:in `block in call'
     # ./lib/gitlab/database/query_analyzer.rb:37:in `within'
     # ./lib/gitlab/middleware/query_analyzer.rb:11:in `call'
     # ./lib/gitlab/middleware/multipart.rb:173:in `call'
     # ./lib/gitlab/middleware/read_only/controller.rb:50:in `call'
     # ./lib/gitlab/middleware/read_only.rb:18:in `call'
     # ./lib/gitlab/middleware/same_site_cookies.rb:27:in `call'
     # ./lib/gitlab/middleware/basic_health_check.rb:25:in `call'
     # ./lib/gitlab/middleware/handle_malformed_strings.rb:21:in `call'
     # ./lib/gitlab/middleware/handle_ip_spoof_attack_error.rb:25:in `call'
     # ./lib/gitlab/middleware/request_context.rb:15:in `call'
     # ./lib/gitlab/middleware/webhook_recursion_detection.rb:15:in `call'
     # ./config/initializers/fix_local_cache_middleware.rb:11:in `call'
     # ./lib/gitlab/middleware/compressed_json.rb:45:in `call'
     # ./lib/gitlab/middleware/static.rb:11:in `call'
     # ./lib/gitlab/webpack/dev_server_middleware.rb:34:in `perform_request'
     # ./lib/gitlab/testing/clear_process_memory_cache_middleware.rb:13:in `call'
     # ./lib/gitlab/testing/request_inspector_middleware.rb:35:in `call'
     # ./lib/gitlab/testing/robots_blocker_middleware.rb:30:in `call'
     # ./lib/gitlab/testing/request_blocker_middleware.rb:47:in `call'
     # ./lib/gitlab/middleware/rack_multipart_tempfile_factory.rb:19:in `call'
     # ./lib/gitlab/middleware/sidekiq_web_static.rb:20:in `call'
     # ./lib/gitlab/metrics/requests_rack_middleware.rb:79:in `call'
     # ./spec/requests/api/commit_statuses_spec.rb:332:in `block (6 levels) in <top (required)>'
     # ./spec/requests/api/commit_statuses_spec.rb:365:in `block (7 levels) in <top (required)>'
     # ./spec/spec_helper.rb:415:in `block (3 levels) in <top (required)>'
     # ./spec/support/sidekiq_middleware.rb:18:in `with_sidekiq_server_middleware'
     # ./spec/spec_helper.rb:406:in `block (2 levels) in <top (required)>'
     # ./spec/spec_helper.rb:402:in `block (3 levels) in <top (required)>'
     # ./lib/gitlab/application_context.rb:61:in `with_raw_context'
     # ./spec/spec_helper.rb:402:in `block (2 levels) in <top (required)>'
     # ./spec/spec_helper.rb:243:in `block (2 levels) in <top (required)>'
     # ./spec/support/system_exit_detected.rb:7:in `block (2 levels) in <main>'
     # ./spec/support/database/prevent_cross_joins.rb:108:in `block (3 levels) in <main>'
     # ./spec/support/database/prevent_cross_joins.rb:62:in `with_cross_joins_prevented'
     # ./spec/support/database/prevent_cross_joins.rb:108:in `block (2 levels) in <main>'

Finished in 12.34 seconds (files took 10.69 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec/requests/api/commit_statuses_spec.rb:364 # API::CommitStatuses POST /projects/:id/statuses/:sha developer user with all optional parameters when updating a commit status when the `state` parameter is sent the same does not update the commit status

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Peter Leitzen

Merge request reports