diff --git a/lib/gitlab/database/migration_helpers/wraparound_vacuum_helpers.rb b/lib/gitlab/database/migration_helpers/wraparound_vacuum_helpers.rb index 01ff3dcbfb85630290a73b0a4990e68858c17759..2a9d37452bdcdc46c528c5d8e353458744ac8e00 100644 --- a/lib/gitlab/database/migration_helpers/wraparound_vacuum_helpers.rb +++ b/lib/gitlab/database/migration_helpers/wraparound_vacuum_helpers.rb @@ -22,10 +22,8 @@ def execute log "This process prevents the migration from acquiring the necessary locks" log "Query: `#{wraparound_vacuum[:query]}`" log "Current duration: #{wraparound_vacuum[:duration].inspect}" - log "Process id: #{wraparound_vacuum[:pid]}" - log "You can wait until it completes or if absolutely necessary interrupt it using: " \ - "`select pg_cancel_backend(#{wraparound_vacuum[:pid]});`" - log "Be aware that a new process will kick in immediately, so multiple interruptions " \ + log "You can wait until it completes or if absolutely necessary interrupt it, " \ + "but be aware that a new process will kick in immediately, so multiple interruptions " \ "might be required to time it right with the locks retry mechanism" end @@ -48,10 +46,9 @@ def transform_wraparound_vacuum def raw_wraparound_vacuum connection.select_all(<<~SQL.squish) - SELECT pid, state, age(clock_timestamp(), query_start) as duration, query - FROM pg_stat_activity + SELECT age(clock_timestamp(), query_start) as duration, query + FROM postgres_pg_stat_activity_autovacuum() WHERE query ILIKE '%VACUUM%' || #{quoted_table_name} || '%(to prevent wraparound)' - AND backend_type = 'autovacuum worker' LIMIT 1 SQL end diff --git a/spec/lib/gitlab/database/migration_helpers/wraparound_vacuum_helpers_spec.rb b/spec/lib/gitlab/database/migration_helpers/wraparound_vacuum_helpers_spec.rb index eb67e81f677baa05d5b17c7c68d067e868d23bcd..f7d11184ac7d3ed9874f4d9c13c9a451107f0372 100644 --- a/spec/lib/gitlab/database/migration_helpers/wraparound_vacuum_helpers_spec.rb +++ b/spec/lib/gitlab/database/migration_helpers/wraparound_vacuum_helpers_spec.rb @@ -36,7 +36,7 @@ context 'with wraparound vacuuum running' do before do - swapout_view_for_table(:pg_stat_activity, connection: migration.connection) + swapout_view_for_table(:pg_stat_activity, connection: migration.connection, schema: 'pg_temp') migration.connection.execute(<<~SQL.squish) INSERT INTO pg_stat_activity ( @@ -44,7 +44,7 @@ state_change, wait_event_type, wait_event, state, backend_xmin, query, backend_type) VALUES ( - 16401, 'gitlabhq_dblab', 178, '2023-03-30 08:10:50.851322+00', + 16401, current_database(), 178, '2023-03-30 08:10:50.851322+00', '2023-03-30 08:10:50.890485+00', now() - '150 minutes'::interval, '2023-03-30 08:10:50.890485+00', 'IO', 'DataFileRead', 'active','3214790381'::xid, 'autovacuum: VACUUM public.ci_builds (to prevent wraparound)', 'autovacuum worker') @@ -58,8 +58,6 @@ it { expect { subject }.to output(/autovacuum: VACUUM public.ci_builds \(to prevent wraparound\)/).to_stdout } it { expect { subject }.to output(/Current duration: 2 hours, 30 minutes/).to_stdout } - it { expect { subject }.to output(/Process id: 178/).to_stdout } - it { expect { subject }.to output(/`select pg_cancel_backend\(178\);`/).to_stdout } context 'when GITLAB_MIGRATIONS_DISABLE_WRAPAROUND_CHECK is set' do before do diff --git a/spec/support/helpers/database/database_helpers.rb b/spec/support/helpers/database/database_helpers.rb index a7f6b4e5cc26effc073d62186b31a7c0bea0ce8c..ff694bcd15b8bff672450c256503ecdc7450b70f 100644 --- a/spec/support/helpers/database/database_helpers.rb +++ b/spec/support/helpers/database/database_helpers.rb @@ -4,11 +4,13 @@ module Database module DatabaseHelpers # In order to directly work with views using factories, # we can swapout the view for a table of identical structure. - def swapout_view_for_table(view, connection:) + def swapout_view_for_table(view, connection:, schema: nil) + table_name = [schema, "_test_#{view}_copy"].compact.join('.') + connection.execute(<<~SQL.squish) - CREATE TABLE _test_#{view}_copy (LIKE #{view}); + CREATE TABLE #{table_name} (LIKE #{view}); DROP VIEW #{view}; - ALTER TABLE _test_#{view}_copy RENAME TO #{view}; + ALTER TABLE #{table_name} RENAME TO #{view}; SQL end