Commit 37ddbe2f authored by Andreas Brandl's avatar Andreas Brandl

Report reindexing metrics in log

parent 7415574f
...@@ -32,6 +32,8 @@ module Gitlab ...@@ -32,6 +32,8 @@ module Gitlab
where('NOT EXISTS (?)', recent_actions) where('NOT EXISTS (?)', recent_actions)
end end
alias_method :reset, :reload
def bloat_size def bloat_size
strong_memoize(:bloat_size) { bloat_estimate&.bloat_size || 0 } strong_memoize(:bloat_size) { bloat_estimate&.bloat_size || 0 }
end end
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
module Gitlab module Gitlab
module Database module Database
module Reindexing module Reindexing
# This is a >= PG12 reindexing strategy based on `REINDEX CONCURRENTLY`
class ReindexConcurrently class ReindexConcurrently
include Gitlab::Utils::StrongMemoize include Gitlab::Utils::StrongMemoize
...@@ -39,17 +40,47 @@ module Gitlab ...@@ -39,17 +40,47 @@ module Gitlab
# While this has been backpatched, we continue to disable expression indexes until further review. # While this has been backpatched, we continue to disable expression indexes until further review.
raise ReindexError, 'expression indexes are currently not supported' if index.expression? raise ReindexError, 'expression indexes are currently not supported' if index.expression?
logger.info "Starting reindex of #{index}" with_logging do
set_statement_timeout do
set_statement_timeout do execute("REINDEX INDEX CONCURRENTLY #{quote_table_name(index.schema)}.#{quote_table_name(index.name)}")
execute("REINDEX INDEX CONCURRENTLY #{quote_table_name(index.schema)}.#{quote_table_name(index.name)}") end
end end
ensure ensure
cleanup_dangling_indexes cleanup_dangling_indexes
end end
private private
def with_logging
bloat_size = index.bloat_size
ondisk_size_before = index.ondisk_size_bytes
logger.info(
message: "Starting reindex of #{index}",
index: index.identifier,
table: index.tablename,
estimated_bloat_bytes: bloat_size,
index_size_before_bytes: ondisk_size_before
)
duration = Benchmark.realtime do
yield
end
index.reset
logger.info(
message: "Finished reindex of #{index}",
index: index.identifier,
table: index.tablename,
estimated_bloat_bytes: bloat_size,
index_size_before_bytes: ondisk_size_before,
index_size_after_bytes: index.ondisk_size_bytes,
duration_s: duration.round(2)
)
end
def cleanup_dangling_indexes def cleanup_dangling_indexes
Gitlab::Database::PostgresIndex.match("#{Regexp.escape(index.name)}#{TEMPORARY_INDEX_PATTERN}").each do |lingering_index| Gitlab::Database::PostgresIndex.match("#{Regexp.escape(index.name)}#{TEMPORARY_INDEX_PATTERN}").each do |lingering_index|
remove_index(lingering_index) remove_index(lingering_index)
......
...@@ -8,7 +8,7 @@ RSpec.describe Gitlab::Database::Reindexing::ReindexConcurrently, '#perform' do ...@@ -8,7 +8,7 @@ RSpec.describe Gitlab::Database::Reindexing::ReindexConcurrently, '#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', tablename: table_name, partitioned?: false, unique?: false, exclusion?: false, expression?: false, definition: 'CREATE INDEX _test_reindex_index ON public._test_reindex_table USING btree (_test_column)') } let(:index) { Gitlab::Database::PostgresIndex.by_identifier("public.#{index_name}") }
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 }
...@@ -18,7 +18,7 @@ RSpec.describe Gitlab::Database::Reindexing::ReindexConcurrently, '#perform' do ...@@ -18,7 +18,7 @@ RSpec.describe Gitlab::Database::Reindexing::ReindexConcurrently, '#perform' do
id serial NOT NULL PRIMARY KEY, id serial NOT NULL PRIMARY KEY,
#{column_name} integer NOT NULL); #{column_name} integer NOT NULL);
CREATE INDEX #{index.name} ON #{table_name} (#{column_name}); CREATE INDEX #{index_name} ON #{table_name} (#{column_name});
SQL SQL
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