Merge branch '32851-fix-postgres-9-1' into 'master'
Resolve "GitLab 9.0 to 9.2 is incompatible with PostgreSQL 9.1" See merge request !11709
This commit is contained in:
commit
e20eb71203
|
@ -52,7 +52,7 @@ stages:
|
|||
|
||||
.use-pg: &use-pg
|
||||
services:
|
||||
- postgres:9.2
|
||||
- postgres:9.1
|
||||
- redis:alpine
|
||||
|
||||
.use-mysql: &use-mysql
|
||||
|
|
|
@ -21,9 +21,8 @@ class IndexRoutesPathForLike < ActiveRecord::Migration
|
|||
|
||||
def down
|
||||
return unless Gitlab::Database.postgresql?
|
||||
return unless index_exists?(:routes, :path, name: INDEX_NAME)
|
||||
|
||||
if index_exists?(:routes, :path, name: INDEX_NAME)
|
||||
execute("DROP INDEX CONCURRENTLY #{INDEX_NAME};")
|
||||
end
|
||||
remove_concurrent_index_by_name(:routes, INDEX_NAME)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -11,13 +11,7 @@ class RemoveIndexForUsersCurrentSignInAt < ActiveRecord::Migration
|
|||
disable_ddl_transaction!
|
||||
|
||||
def up
|
||||
if index_exists? :users, :current_sign_in_at
|
||||
if Gitlab::Database.postgresql?
|
||||
execute 'DROP INDEX CONCURRENTLY index_users_on_current_sign_in_at;'
|
||||
else
|
||||
remove_concurrent_index :users, :current_sign_in_at
|
||||
end
|
||||
end
|
||||
remove_concurrent_index :users, :current_sign_in_at
|
||||
end
|
||||
|
||||
def down
|
||||
|
|
|
@ -21,9 +21,8 @@ class IndexRedirectRoutesPathForLike < ActiveRecord::Migration
|
|||
|
||||
def down
|
||||
return unless Gitlab::Database.postgresql?
|
||||
return unless index_exists?(:redirect_routes, :path, name: INDEX_NAME)
|
||||
|
||||
if index_exists?(:redirect_routes, :path, name: INDEX_NAME)
|
||||
execute("DROP INDEX CONCURRENTLY #{INDEX_NAME};")
|
||||
end
|
||||
remove_concurrent_index_by_name(:redirect_routes, INDEX_NAME)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -42,7 +42,7 @@ module Gitlab
|
|||
'in the body of your migration class'
|
||||
end
|
||||
|
||||
if Database.postgresql?
|
||||
if supports_drop_index_concurrently?
|
||||
options = options.merge({ algorithm: :concurrently })
|
||||
disable_statement_timeout
|
||||
end
|
||||
|
@ -50,6 +50,39 @@ module Gitlab
|
|||
remove_index(table_name, options.merge({ column: column_name }))
|
||||
end
|
||||
|
||||
# Removes an existing index, concurrently when supported
|
||||
#
|
||||
# On PostgreSQL this method removes an index concurrently.
|
||||
#
|
||||
# Example:
|
||||
#
|
||||
# remove_concurrent_index :users, "index_X_by_Y"
|
||||
#
|
||||
# See Rails' `remove_index` for more info on the available arguments.
|
||||
def remove_concurrent_index_by_name(table_name, index_name, options = {})
|
||||
if transaction_open?
|
||||
raise 'remove_concurrent_index_by_name can not be run inside a transaction, ' \
|
||||
'you can disable transactions by calling disable_ddl_transaction! ' \
|
||||
'in the body of your migration class'
|
||||
end
|
||||
|
||||
if supports_drop_index_concurrently?
|
||||
options = options.merge({ algorithm: :concurrently })
|
||||
disable_statement_timeout
|
||||
end
|
||||
|
||||
remove_index(table_name, options.merge({ name: index_name }))
|
||||
end
|
||||
|
||||
# Only available on Postgresql >= 9.2
|
||||
def supports_drop_index_concurrently?
|
||||
return false unless Database.postgresql?
|
||||
|
||||
version = select_one("SELECT current_setting('server_version_num') AS v")['v'].to_i
|
||||
|
||||
version >= 90200
|
||||
end
|
||||
|
||||
# Adds a foreign key with only minimal locking on the tables involved.
|
||||
#
|
||||
# This method only requires minimal locking when using PostgreSQL. When
|
||||
|
|
|
@ -66,16 +66,23 @@ describe Gitlab::Database::MigrationHelpers, lib: true do
|
|||
|
||||
context 'using PostgreSQL' do
|
||||
before do
|
||||
allow(Gitlab::Database).to receive(:postgresql?).and_return(true)
|
||||
allow(model).to receive(:supports_drop_index_concurrently?).and_return(true)
|
||||
allow(model).to receive(:disable_statement_timeout)
|
||||
end
|
||||
|
||||
it 'removes the index concurrently' do
|
||||
it 'removes the index concurrently by column name' do
|
||||
expect(model).to receive(:remove_index).
|
||||
with(:users, { algorithm: :concurrently, column: :foo })
|
||||
|
||||
model.remove_concurrent_index(:users, :foo)
|
||||
end
|
||||
|
||||
it 'removes the index concurrently by index name' do
|
||||
expect(model).to receive(:remove_index).
|
||||
with(:users, { algorithm: :concurrently, name: "index_x_by_y" })
|
||||
|
||||
model.remove_concurrent_index_by_name(:users, "index_x_by_y")
|
||||
end
|
||||
end
|
||||
|
||||
context 'using MySQL' do
|
||||
|
|
Loading…
Reference in New Issue