Commit 38758bb9 authored by Andreas Brandl's avatar Andreas Brandl

Do not reindex exclusion constraint indexes

Postgres exclusion constraints are based on indexes. Recreating those
will interfere with constraint checking.

For now, we only have one of this type.
parent 4fcec8a4
...@@ -14,6 +14,7 @@ class AddPostgresIndexView < ActiveRecord::Migration[6.0] ...@@ -14,6 +14,7 @@ class AddPostgresIndexView < ActiveRecord::Migration[6.0]
pg_index.indisunique as unique, pg_index.indisunique as unique,
pg_index.indisvalid as valid_index, pg_index.indisvalid as valid_index,
pg_class.relispartition as partitioned, pg_class.relispartition as partitioned,
pg_index.indisexclusion as exclusion,
pg_indexes.indexdef as definition, pg_indexes.indexdef as definition,
pg_relation_size(pg_class.oid) as ondisk_size_bytes pg_relation_size(pg_class.oid) as ondisk_size_bytes
FROM pg_index FROM pg_index
......
...@@ -14419,6 +14419,7 @@ CREATE VIEW postgres_indexes AS ...@@ -14419,6 +14419,7 @@ CREATE VIEW postgres_indexes AS
pg_index.indisunique AS "unique", pg_index.indisunique AS "unique",
pg_index.indisvalid AS valid_index, pg_index.indisvalid AS valid_index,
pg_class.relispartition AS partitioned, pg_class.relispartition AS partitioned,
pg_index.indisexclusion AS exclusion,
pg_indexes.indexdef AS definition, pg_indexes.indexdef AS definition,
pg_relation_size((pg_class.oid)::regclass) AS ondisk_size_bytes pg_relation_size((pg_class.oid)::regclass) AS ondisk_size_bytes
FROM (((pg_index FROM (((pg_index
......
...@@ -12,8 +12,10 @@ module Gitlab ...@@ -12,8 +12,10 @@ module Gitlab
find(identifier) find(identifier)
end end
scope :non_unique, -> { where(unique: false) } # A 'regular' index is a non-unique index,
scope :non_partitioned, -> { where(partitioned: false) } # that does not serve an exclusion constraint and
# is defined on a table that is not partitioned.
scope :regular, -> { where(unique: false, partitioned: false, exclusion: false)}
scope :random_few, ->(how_many) do scope :random_few, ->(how_many) do
limit(how_many).order(Arel.sql('RANDOM()')) limit(how_many).order(Arel.sql('RANDOM()'))
......
...@@ -23,6 +23,7 @@ module Gitlab ...@@ -23,6 +23,7 @@ module Gitlab
def perform def perform
raise ReindexError, 'UNIQUE indexes are currently not supported' if index.unique? raise ReindexError, 'UNIQUE indexes are currently not supported' if index.unique?
raise ReindexError, 'partitioned indexes are currently not supported' if index.partitioned? raise ReindexError, 'partitioned indexes are currently not supported' if index.partitioned?
raise ReindexError, 'indexes serving an exclusion constraint are currently not supported' if index.exclusion?
logger.info "Starting reindex of #{index}" logger.info "Starting reindex of #{index}"
......
...@@ -177,7 +177,7 @@ namespace :gitlab do ...@@ -177,7 +177,7 @@ namespace :gitlab do
indexes = if args[:index_name] indexes = if args[:index_name]
Gitlab::Database::PostgresIndex.by_identifier(args[:index_name]) Gitlab::Database::PostgresIndex.by_identifier(args[:index_name])
else else
Gitlab::Database::PostgresIndex.non_unique.non_partitioned.random_few(2) Gitlab::Database::PostgresIndex.regular.random_few(2)
end end
Gitlab::Database::Reindexing.perform(indexes) Gitlab::Database::Reindexing.perform(indexes)
......
...@@ -30,15 +30,17 @@ RSpec.describe Gitlab::Database::PostgresIndex do ...@@ -30,15 +30,17 @@ RSpec.describe Gitlab::Database::PostgresIndex do
end end
end end
describe '#non_unique' do describe '#regular' do
it 'only non-unique indexes' do it 'only non-unique indexes' do
expect(described_class.non_unique).to all(have_attributes(unique: false)) expect(described_class.regular).to all(have_attributes(unique: false))
end end
end
describe '#non_partitioned' do
it 'only non partitioned indexes ' do it 'only non partitioned indexes ' do
expect(described_class.non_partitioned).to all(have_attributes(partitioned: false)) expect(described_class.regular).to all(have_attributes(partitioned: false))
end
it 'only indexes that dont serve an exclusion constraint' do
expect(described_class.regular).to all(have_attributes(exclusion: false))
end end
end end
......
...@@ -8,7 +8,7 @@ RSpec.describe Gitlab::Database::Reindexing::ConcurrentReindex, '#perform' do ...@@ -8,7 +8,7 @@ RSpec.describe Gitlab::Database::Reindexing::ConcurrentReindex, '#perform' do
let(:table_name) { '_test_reindex_table' } let(:table_name) { '_test_reindex_table' }
let(:column_name) { '_test_column' } let(:column_name) { '_test_column' }
let(:index_name) { '_test_reindex_index' } let(:index_name) { '_test_reindex_index' }
let(:index) { instance_double(Gitlab::Database::PostgresIndex, indexrelid: 42, name: index_name, schema: 'public', partitioned?: false, unique?: false, definition: 'CREATE INDEX _test_reindex_index ON public._test_reindex_table USING btree (_test_column)') } let(:index) { instance_double(Gitlab::Database::PostgresIndex, indexrelid: 42, name: index_name, schema: 'public', partitioned?: false, unique?: false, exclusion?: false, definition: 'CREATE INDEX _test_reindex_index ON public._test_reindex_table USING btree (_test_column)') }
let(:logger) { double('logger', debug: nil, info: nil, error: nil ) } let(:logger) { double('logger', debug: nil, info: nil, error: nil ) }
let(:connection) { ActiveRecord::Base.connection } let(:connection) { ActiveRecord::Base.connection }
...@@ -46,6 +46,18 @@ RSpec.describe Gitlab::Database::Reindexing::ConcurrentReindex, '#perform' do ...@@ -46,6 +46,18 @@ RSpec.describe Gitlab::Database::Reindexing::ConcurrentReindex, '#perform' do
end end
end end
context 'when the index serves an exclusion constraint' do
before do
allow(index).to receive(:exclusion?).and_return(true)
end
it 'raises an error' do
expect do
subject.perform
end.to raise_error(described_class::ReindexError, /indexes serving an exclusion constraint are currently not supported/)
end
end
context 'replacing the original index with a rebuilt copy' do context 'replacing the original index with a rebuilt copy' do
let(:replacement_name) { 'tmp_reindex_42' } let(:replacement_name) { 'tmp_reindex_42' }
let(:replaced_name) { 'old_reindex_42' } let(:replaced_name) { 'old_reindex_42' }
......
...@@ -170,7 +170,7 @@ RSpec.describe 'gitlab:db namespace rake task' do ...@@ -170,7 +170,7 @@ RSpec.describe 'gitlab:db namespace rake task' do
context 'when no index_name is given' do context 'when no index_name is given' do
it 'rebuilds a random number of large indexes' do it 'rebuilds a random number of large indexes' do
expect(Gitlab::Database::PostgresIndex).to receive_message_chain('non_unique.non_partitioned.random_few').and_return(indexes) expect(Gitlab::Database::PostgresIndex).to receive_message_chain('regular.random_few').and_return(indexes)
expect(Gitlab::Database::Reindexing).to receive(:perform).with(indexes) expect(Gitlab::Database::Reindexing).to receive(:perform).with(indexes)
run_rake_task('gitlab:db:reindex') run_rake_task('gitlab:db:reindex')
......
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