influitive / apartment

Database multi-tenancy for Rack (and Rails) applications
2.67k stars 460 forks source link

Can we swallow ActiveRecord::NoDatabaseError in db:drop #589

Open liangjingyang opened 5 years ago

liangjingyang commented 5 years ago

Steps to reproduce

Run rake db:drop when we have no databases, and use_schemas = true.

Expected behavior

Do nothing just link Rails db:drop

Actual behavior

rake aborted!
ActiveRecord::NoDatabaseError: FATAL:  database "gitlabhq_test" does not exist
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/postgresql_adapter.rb:677:in `rescue in connect'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/postgresql_adapter.rb:672:in `connect'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/postgresql_adapter.rb:217:in `initialize'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/postgresql_adapter.rb:37:in `new'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/postgresql_adapter.rb:37:in `postgresql_connection'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:729:in `new_connection'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:773:in `checkout_new_connection'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:752:in `try_to_checkout_new_connection'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:713:in `acquire_connection'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:490:in `checkout'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:364:in `connection'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:883:in `retrieve_connection'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_handling.rb:128:in `retrieve_connection'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/activerecord-5.0.7.1/lib/active_record/connection_handling.rb:91:in `connection'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/apartment-2.2.0/lib/apartment/adapters/postgresql_adapter.rb:40:in `reset'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/apartment-2.2.0/lib/apartment/adapters/postgresql_adapter.rb:31:in `initialize'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/apartment-2.2.0/lib/apartment/adapters/postgresql_adapter.rb:10:in `new'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/apartment-2.2.0/lib/apartment/adapters/postgresql_adapter.rb:10:in `postgresql_adapter'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/apartment-2.2.0/lib/apartment/tenant.rb:47:in `adapter'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/apartment-2.2.0/lib/tasks/apartment.rake:23:in `block (3 levels) in <main>'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/apartment-2.2.0/lib/tasks/apartment.rake:20:in `each'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/apartment-2.2.0/lib/tasks/apartment.rake:20:in `block (2 levels) in <main>'
/builds/persper/gitlab-ce/vendor/ruby/2.5.0/gems/rake-12.3.2/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:30:in `block in <main>'
/usr/local/bin/bundle:22:in `<main>'

System configuration

Suggestion

Beacuse of PostgreSQL and use_schemas = true, Apartment::Tenant.drop(tenant) will connect to the target database and reset search_path before drop schemas, but the target isn't exists. Maybe we can swallow ActiveRecord::NoDatabaseError in db:drop: https://github.com/influitive/apartment/blob/5211eb43185c176d99a1c05167fa2e8cf3587c27/lib/tasks/apartment.rake#L24 just like: https://github.com/influitive/apartment/blob/5211eb43185c176d99a1c05167fa2e8cf3587c27/lib/apartment/railtie.rb#L36