Commit eb8c2f47 authored by James Fargher's avatar James Fargher

Merge branch 'ab/postgres-warning' into 'master'

Add warning if on <PG11

Closes #224683

See merge request gitlab-org/gitlab!35509
parents 6b2259fa fd0ca47f
...@@ -2,3 +2,5 @@ ...@@ -2,3 +2,5 @@
raise "PostgreSQL is the only supported database from GitLab 12.1" unless raise "PostgreSQL is the only supported database from GitLab 12.1" unless
Gitlab::Database.postgresql? Gitlab::Database.postgresql?
Gitlab::Database.check_postgres_version_and_print_warning
...@@ -4,6 +4,8 @@ module Gitlab ...@@ -4,6 +4,8 @@ module Gitlab
module Database module Database
include Gitlab::Metrics::Methods include Gitlab::Metrics::Methods
MINIMUM_POSTGRES_VERSION = 11
# https://www.postgresql.org/docs/9.2/static/datatype-numeric.html # https://www.postgresql.org/docs/9.2/static/datatype-numeric.html
MAX_INT_VALUE = 2147483647 MAX_INT_VALUE = 2147483647
...@@ -102,13 +104,40 @@ module Gitlab ...@@ -102,13 +104,40 @@ module Gitlab
end end
def self.postgresql_minimum_supported_version? def self.postgresql_minimum_supported_version?
version.to_f >= 9.6 version.to_f >= MINIMUM_POSTGRES_VERSION
end end
def self.upsert_supported? def self.upsert_supported?
version.to_f >= 9.5 version.to_f >= 9.5
end end
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 # map some of the function names that changed between PostgreSQL 9 and 10
# https://wiki.postgresql.org/wiki/New_in_postgres_10 # https://wiki.postgresql.org/wiki/New_in_postgres_10
def self.pg_wal_lsn_diff def self.pg_wal_lsn_diff
......
...@@ -96,19 +96,66 @@ RSpec.describe Gitlab::Database do ...@@ -96,19 +96,66 @@ RSpec.describe Gitlab::Database do
expect(described_class.postgresql_minimum_supported_version?).to eq(false) expect(described_class.postgresql_minimum_supported_version?).to eq(false)
end end
it 'returns true when using PostgreSQL 9.6' do it 'returns false when using PostgreSQL 9.6' do
allow(described_class).to receive(:version).and_return('9.6') allow(described_class).to receive(:version).and_return('9.6')
expect(described_class.postgresql_minimum_supported_version?).to eq(true) expect(described_class.postgresql_minimum_supported_version?).to eq(false)
end end
it 'returns true when using PostgreSQL 10 or newer' do it 'returns false when using PostgreSQL 10' do
allow(described_class).to receive(:version).and_return('10') allow(described_class).to receive(:version).and_return('10')
expect(described_class.postgresql_minimum_supported_version?).to eq(false)
end
it 'returns true when using PostgreSQL 11 or newer' do
allow(described_class).to receive(:version).and_return('11.0')
expect(described_class.postgresql_minimum_supported_version?).to eq(true) expect(described_class.postgresql_minimum_supported_version?).to eq(true)
end end
end end
describe '.check_postgres_version_and_print_warning' do
subject { described_class.check_postgres_version_and_print_warning }
it 'prints a warning if not compliant with minimum postgres version' do
allow(described_class).to receive(:postgresql_minimum_supported_version?).and_return(false)
expect(Kernel).to receive(:warn).with(/You are using PostgreSQL/)
subject
end
it 'doesnt print a warning if compliant with minimum postgres version' do
allow(described_class).to receive(:postgresql_minimum_supported_version?).and_return(true)
expect(Kernel).not_to receive(:warn).with(/You are using PostgreSQL/)
subject
end
it 'doesnt print a warning in Rails runner environment' do
allow(described_class).to receive(:postgresql_minimum_supported_version?).and_return(false)
allow(Gitlab::Runtime).to receive(:rails_runner?).and_return(true)
expect(Kernel).not_to receive(:warn).with(/You are using PostgreSQL/)
subject
end
it 'ignores ActiveRecord errors' do
allow(described_class).to receive(:postgresql_minimum_supported_version?).and_raise(ActiveRecord::ActiveRecordError)
expect { subject }.not_to raise_error
end
it 'ignores Postgres errors' do
allow(described_class).to receive(:postgresql_minimum_supported_version?).and_raise(PG::Error)
expect { subject }.not_to raise_error
end
end
describe '.replication_slots_supported?' do describe '.replication_slots_supported?' do
it 'returns false when using PostgreSQL 9.3' do it 'returns false when using PostgreSQL 9.3' do
allow(described_class).to receive(:version).and_return('9.3.1') allow(described_class).to receive(:version).and_return('9.3.1')
......
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