BulkImport model causes database query during Rails application initialization
## Problem The `BulkImport` model causes a database query to be issued during Rails application initialization (boot time). This is detected by the `InitializerConnections` guard and produces noisy warning output in application logs, making it harder to diagnose actual startup issues. Support tickets: * https://gitlab.zendesk.com/agent/tickets/701368 * https://gitlab.zendesk.com/agent/tickets/703625 * https://gitlab.zendesk.com/agent/tickets/703854 * https://gitlab.zendesk.com/agent/tickets/704521 ## Root Cause During application boot, the following chain triggers a SELECT against `pg_attribute` for the `bulk_imports` table: 1. `config/routes.rb` draws all routes inside `InitializerConnections.warn_if_database_connection` 2. Route loading causes `lib/api/bulk_imports.rb` to be evaluated 3. This autoloads `BulkImport` (app/models/bulk_import.rb) 4. The `state_machine :status` block at line 31 triggers ActiveRecord column introspection at class evaluation time 5. `SchemaCacheWithRenamedTable#columns` and `#columns_hash` execute a schema introspection query The `InitializerConnections` guard logs the full query and backtrace as a warning to STDERR. While this does not block the query or prevent startup on its own, it produces significant log noise, and repeated warnings when opening the rails console. ## Stacktrace ``` InitializerConnections Query: SELECT a.attname, format_type(a.atttypid, a.atttypmod), pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod, c.collname, col_description(a.attrelid, a.attnum) AS comment, attidentity AS identity, attgenerated as attgenerated FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum LEFT JOIN pg_type t ON a.atttypid = t.oid LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation WHERE a.attrelid = '"bulk_imports"'::regclass AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum InitializerConnections Backtrace: lib/gitlab/database/schema_cache_with_renamed_table.rb:26:in `columns' InitializerConnections Backtrace: lib/gitlab/database/schema_cache_with_renamed_table.rb:30:in `columns_hash' InitializerConnections Backtrace: app/models/bulk_import.rb:31:in `<class:BulkImport>' InitializerConnections Backtrace: app/models/bulk_import.rb:6:in `<top (required)>' InitializerConnections Backtrace: lib/api/bulk_imports.rb:140:in `block (2 levels) in <class:BulkImports>' InitializerConnections Backtrace: lib/api/bulk_imports.rb:136:in `block in <class:BulkImports>' InitializerConnections Backtrace: lib/api/bulk_imports.rb:42:in `<class:BulkImports>' InitializerConnections Backtrace: lib/api/bulk_imports.rb:4:in `<module:API>' InitializerConnections Backtrace: lib/api/bulk_imports.rb:3:in `<top (required)>' InitializerConnections Backtrace: lib/api/api.rb:229:in `block (2 levels) in <class:API>' InitializerConnections Backtrace: lib/api/api.rb:211:in `block in <class:API>' InitializerConnections Backtrace: lib/api/api.rb:205:in `<class:API>' InitializerConnections Backtrace: lib/api/api.rb:4:in `<module:API>' InitializerConnections Backtrace: lib/api/api.rb:3:in `<top (required)>' InitializerConnections Backtrace: config/routes/api.rb:8:in `draw_route' InitializerConnections Backtrace: config/routes.rb:332:in `draw_all_routes' InitializerConnections Backtrace: config/routes.rb:376:in `block (2 levels) in <top (required)>' InitializerConnections Backtrace: config/routes.rb:7:in `block in <top (required)>' InitializerConnections Backtrace: lib/initializer_connections.rb:19:in `block in warn_if_database_connection' InitializerConnections Backtrace: lib/initializer_connections.rb:18:in `warn_if_database_connection' InitializerConnections Backtrace: config/routes.rb:6:in `<top (required)>' InitializerConnections Backtrace: config/environment.rb:7:in `<top (required)>' ``` ## Expected Behavior No database queries should be issued during application initialization. The `state_machine` definition in the `BulkImport` model should defer column introspection until the model is actually used at runtime. ## Possible Fix Directions (Duo Agent Platform) 1. Defer the `state_machine` status value resolution so it doesn't trigger schema lookups at class load time (e.g., use lazy evaluation for transition targets) 2. Ensure the API endpoint definition in `lib/api/bulk_imports.rb` does not eagerly reference the model class during route definition 3. Wrap column-dependent logic in `ActiveSupport.on_load(:active_record)` or similar deferred execution ## Relevant Files - `app/models/bulk_import.rb` (line 31 - state_machine block) - `lib/api/bulk_imports.rb` (API endpoint that triggers model autoload) - `lib/initializer_connections.rb` (the guard that detects the issue) - `lib/gitlab/database/schema_cache_with_renamed_table.rb` (where the query originates)
issue