diff options
Diffstat (limited to 'lib/gitlab/database.rb')
-rw-r--r-- | lib/gitlab/database.rb | 63 |
1 files changed, 54 insertions, 9 deletions
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb index 02005be1f6a..2bfb6c32886 100644 --- a/lib/gitlab/database.rb +++ b/lib/gitlab/database.rb @@ -4,6 +4,20 @@ module Gitlab module Database include Gitlab::Metrics::Methods + # Minimum PostgreSQL version requirement per documentation: + # https://docs.gitlab.com/ee/install/requirements.html#postgresql-requirements + MINIMUM_POSTGRES_VERSION = 11 + + # Upcoming PostgreSQL version requirements + # Allows a soft warning about an upcoming minimum version requirement + # so administrators can prepare to upgrade + UPCOMING_POSTGRES_VERSION_DETAILS = { + gl_version: '13.6.0', + gl_version_date: 'November 2020', + pg_version_minimum: 12, + url: 'https://gitlab.com/groups/gitlab-org/-/epics/2374' + }.freeze + # https://www.postgresql.org/docs/9.2/static/datatype-numeric.html MAX_INT_VALUE = 2147483647 @@ -22,6 +36,16 @@ module Gitlab MIN_SCHEMA_VERSION = 20190506135400 MIN_SCHEMA_GITLAB_VERSION = '11.11.0' + # Schema we store dynamically managed partitions in (e.g. for time partitioning) + DYNAMIC_PARTITIONS_SCHEMA = :gitlab_partitions_dynamic + + # Schema we store static partitions in (e.g. for hash partitioning) + STATIC_PARTITIONS_SCHEMA = :gitlab_partitions_static + + # This is an extensive list of postgres schemas owned by GitLab + # It does not include the default public schema + EXTRA_SCHEMAS = [DYNAMIC_PARTITIONS_SCHEMA, STATIC_PARTITIONS_SCHEMA].freeze + define_histogram :gitlab_database_transaction_seconds do docstring "Time spent in database transactions, in seconds" end @@ -87,16 +111,39 @@ module Gitlab version.to_f < 10 end - def self.replication_slots_supported? - version.to_f >= 9.4 + def self.postgresql_minimum_supported_version? + version.to_f >= MINIMUM_POSTGRES_VERSION end - def self.postgresql_minimum_supported_version? - version.to_f >= 9.6 + def self.postgresql_upcoming_deprecation? + version.to_f < UPCOMING_POSTGRES_VERSION_DETAILS[:pg_version_minimum] end - def self.upsert_supported? - version.to_f >= 9.5 + def self.check_postgres_version_and_print_warning + return if Gitlab::Database.postgresql_minimum_supported_version? + return if Gitlab::Runtime.rails_runner? + + Kernel.warn ERB.new(Rainbow.new.wrap(<<~EOS).red).result + + ██ ██ █████ ██████ ███ ██ ██ ███ ██ ██████ + ██ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██ ██ + ██ █ ██ ███████ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ███ + ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + ███ ███ ██ ██ ██ ██ ██ ████ ██ ██ ████ ██████ + + ****************************************************************************** + You are using PostgreSQL <%= Gitlab::Database.version %>, but PostgreSQL >= <%= Gitlab::Database::MINIMUM_POSTGRES_VERSION %> + is required for this version of GitLab. + <% if Rails.env.development? || Rails.env.test? %> + If using gitlab-development-kit, please find the relevant steps here: + https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/master/doc/howto/postgresql.md#upgrade-postgresql + <% end %> + Please upgrade your environment to a supported PostgreSQL version, see + https://docs.gitlab.com/ee/install/requirements.html#database for details. + ****************************************************************************** + EOS + rescue ActiveRecord::ActiveRecordError, PG::Error + # ignore - happens when Rake tasks yet have to create a database, e.g. for testing end # map some of the function names that changed between PostgreSQL 9 and 10 @@ -182,9 +229,7 @@ module Gitlab VALUES #{tuples.map { |tuple| "(#{tuple.join(', ')})" }.join(', ')} EOF - if upsert_supported? && on_conflict == :do_nothing - sql = "#{sql} ON CONFLICT DO NOTHING" - end + sql = "#{sql} ON CONFLICT DO NOTHING" if on_conflict == :do_nothing sql = "#{sql} RETURNING id" if return_ids |