Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2019-12-03 00:06:51 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2019-12-03 00:06:51 +0300
commita19a376bf35b2009566e86b8190662c21ed7e2ba (patch)
tree46d3ea7f44a0a732b96fcbae0cf09d3cfd8ec9dc /spec/support/database_cleaner.rb
parent556c79d6cc3d7b24ecbba3a79f8432eb3fcf5c7e (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec/support/database_cleaner.rb')
-rw-r--r--spec/support/database_cleaner.rb33
1 files changed, 33 insertions, 0 deletions
diff --git a/spec/support/database_cleaner.rb b/spec/support/database_cleaner.rb
index 6f385d6e019..aaf408f6143 100644
--- a/spec/support/database_cleaner.rb
+++ b/spec/support/database_cleaner.rb
@@ -15,6 +15,39 @@ RSpec.configure do |config|
delete_from_all_tables!
end
+ config.append_after(:context, :migration) do
+ delete_from_all_tables!
+
+ # Postgres maximum number of columns in a table is 1600 (https://github.com/postgres/postgres/blob/de41869b64d57160f58852eab20a27f248188135/src/include/access/htup_details.h#L23-L47).
+ # And since:
+ # "The DROP COLUMN form does not physically remove the column, but simply makes
+ # it invisible to SQL operations. Subsequent insert and update operations in the
+ # table will store a null value for the column. Thus, dropping a column is quick
+ # but it will not immediately reduce the on-disk size of your table, as the space
+ # occupied by the dropped column is not reclaimed.
+ # The space will be reclaimed over time as existing rows are updated."
+ # according to https://www.postgresql.org/docs/current/sql-altertable.html.
+ # We drop and recreate the database if any table has more than 1200 columns, just to be safe.
+ max_allowed_columns = 1200
+ tables_with_more_than_allowed_columns =
+ ApplicationRecord.connection.execute("SELECT attrelid::regclass::text AS table, COUNT(*) AS column_count FROM pg_attribute GROUP BY attrelid HAVING COUNT(*) > #{max_allowed_columns}")
+
+ if tables_with_more_than_allowed_columns.any?
+ tables_with_more_than_allowed_columns.each do |result|
+ puts "The #{result['table']} table has #{result['column_count']} columns."
+ end
+ puts "Recreating the database"
+ start = Gitlab::Metrics::System.monotonic_time
+
+ ActiveRecord::Tasks::DatabaseTasks.drop_current
+ ActiveRecord::Tasks::DatabaseTasks.create_current
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_current
+ ActiveRecord::Tasks::DatabaseTasks.migrate
+
+ puts "Database re-creation done in #{Gitlab::Metrics::System.monotonic_time - start}"
+ end
+ end
+
config.around(:each, :delete) do |example|
self.class.use_transactional_tests = false