Commit 885e2a9c authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'sh-terminate-pg-connections-on-setup' into 'master'

Kill all PostgreSQL connections for rake dev:setup

Closes gitlab-development-kit#450

See merge request gitlab-org/gitlab-ce!24743
parents be3de699 1dadfff3
...@@ -25,6 +25,11 @@ namespace :gitlab do ...@@ -25,6 +25,11 @@ namespace :gitlab do
puts "" puts ""
end end
# In production, we might want to prevent ourselves from shooting
# ourselves in the foot, so let's only do this in a test or
# development environment.
terminate_all_connections unless Rails.env.production?
Rake::Task["db:reset"].invoke Rake::Task["db:reset"].invoke
Rake::Task["add_limits_mysql"].invoke Rake::Task["add_limits_mysql"].invoke
Rake::Task["setup_postgresql"].invoke Rake::Task["setup_postgresql"].invoke
...@@ -33,4 +38,24 @@ namespace :gitlab do ...@@ -33,4 +38,24 @@ namespace :gitlab do
puts "Quitting...".color(:red) puts "Quitting...".color(:red)
exit 1 exit 1
end end
# If there are any clients connected to the DB, PostgreSQL won't let
# you drop the database. It's possible that Sidekiq, Unicorn, or
# some other client will be hanging onto a connection, preventing
# the DROP DATABASE from working. To workaround this problem, this
# method terminates all the connections so that a subsequent DROP
# will work.
def self.terminate_all_connections
return false unless Gitlab::Database.postgresql?
cmd = <<~SQL
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = current_database()
AND pid <> pg_backend_pid();
SQL
ActiveRecord::Base.connection.execute(cmd)&.result_status == PG::PGRES_TUPLES_OK
rescue ActiveRecord::NoDatabaseError
end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment