When migrating projects to a different storage type, sometimes it bails due to a validation error
Summary
- A project,
foo
, that is a fork of another,bar
, where projectbar
is now set to private after the forkfoo
was created, creates a situation where migrating the storage for projectfoo
fails validation.
Steps to reproduce
- Create a project on non hashed storage
- Fork that project on non hashed storage
- Move the original project to private visbility
- Attempt to migrate the fork to hashed storage
What is the current bug behavior?
Stack Trace:
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/validations.rb:78:in `raise_validation_error'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/validations.rb:50:in `save!'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/attribute_methods/dirty.rb:30:in `save!'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/transactions.rb:324:in `block in save!'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:230:in `transaction'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/connection_proxy.rb:77:in `block in write_using_load_balancer'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/load_balancer.rb:66:in `block in read_write'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/load_balancer.rb:116:in `retry_with_backoff'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/load_balancer.rb:65:in `read_write'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/connection_proxy.rb:71:in `write_using_load_balancer'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/connection_proxy.rb:45:in `block (2 levels) in <class:ConnectionProxy>'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/transactions.rb:211:in `transaction'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/transactions.rb:324:in `save!'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/suppressor.rb:45:in `save!'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/persistence.rb:288:in `block in update!'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/transactions.rb:395:in `block in with_transaction_returning_status'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `block in transaction'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/connection_adapters/abstract/transaction.rb:189:in `within_new_transaction'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/connection_adapters/abstract/database_statements.rb:232:in `transaction'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/connection_proxy.rb:77:in `block in write_using_load_balancer'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/load_balancer.rb:66:in `block in read_write'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/load_balancer.rb:116:in `retry_with_backoff'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/load_balancer.rb:65:in `read_write'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/connection_proxy.rb:71:in `write_using_load_balancer'
/opt/gitlab/embedded/service/gitlab-rails/ee/lib/gitlab/database/load_balancing/connection_proxy.rb:45:in `block (2 levels) in <class:ConnectionProxy>'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/transactions.rb:211:in `transaction'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/transactions.rb:392:in `with_transaction_returning_status'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/activerecord-5.0.7/lib/active_record/persistence.rb:286:in `update!'
/opt/gitlab/embedded/service/gitlab-rails/app/models/project.rb:1900:in `migrate_to_hashed_storage!'
/opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/metrics/instrumentation.rb:163:in `migrate_to_hashed_storage!'
/opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/hashed_storage/migrator.rb:43:in `migrate'
(irb):8:in `irb_binding'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb/workspace.rb:85:in `eval'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb/workspace.rb:85:in `evaluate'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb/context.rb:380:in `evaluate'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb.rb:491:in `block (2 levels) in eval_input'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb.rb:623:in `signal_status'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb.rb:488:in `block in eval_input'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb/ruby-lex.rb:246:in `block (2 levels) in each_top_level_statement'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb/ruby-lex.rb:232:in `loop'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb/ruby-lex.rb:232:in `block in each_top_level_statement'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb/ruby-lex.rb:231:in `catch'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb/ruby-lex.rb:231:in `each_top_level_statement'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb.rb:487:in `eval_input'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb.rb:428:in `block in run'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb.rb:427:in `catch'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb.rb:427:in `run'
/opt/gitlab/embedded/lib/ruby/2.5.0/irb.rb:383:in `start'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/railties-5.0.7/lib/rails/commands/console.rb:65:in `start'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/railties-5.0.7/lib/rails/commands/console_helper.rb:9:in `start'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/railties-5.0.7/lib/rails/commands/commands_tasks.rb:78:in `console'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/railties-5.0.7/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
/opt/gitlab/embedded/lib/ruby/gems/2.5.0/gems/railties-5.0.7/lib/rails/commands.rb:18:in `<top (required)>'
bin/rails:14:in `require'
bin/rails:14:in `<main>'
What is the expected correct behavior?
The migration should start. The only thing we care about in this case is the underlying storage of the project.
Output of checks
This bug happens on GitLab.com