diff options
author | Robert Speicher <robert@gitlab.com> | 2018-07-06 17:07:49 +0000 |
---|---|---|
committer | Robert Speicher <robert@gitlab.com> | 2018-07-06 17:07:49 +0000 |
commit | 4b225b1ab3110242a3e9ba2c3cd7d345d9bf4e19 (patch) | |
tree | 9f340ba9e375c1e49c5a1bd23971185fa73af794 | |
parent | 0b1543e1c9b850ec35a6dfc0586f6b9588e9b953 (diff) | |
parent | fd2ea94f60cb7ed81a666f321a8449449611bd2e (diff) | |
download | gitlab-ce-4b225b1ab3110242a3e9ba2c3cd7d345d9bf4e19.tar.gz |
Merge branch 'bw-add-database-readonly' into 'master'
Ability to check if underlying database is read only
See merge request gitlab-org/gitlab-ce!20345
-rw-r--r-- | lib/gitlab/database.rb | 15 | ||||
-rw-r--r-- | spec/lib/gitlab/database_spec.rb | 29 |
2 files changed, 44 insertions, 0 deletions
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb index 4ad106e7b0a..872e70f9a5d 100644 --- a/lib/gitlab/database.rb +++ b/lib/gitlab/database.rb @@ -42,6 +42,21 @@ module Gitlab !self.read_only? end + # check whether the underlying database is in read-only mode + def self.db_read_only? + if postgresql? + ActiveRecord::Base.connection.execute('SELECT pg_is_in_recovery()') + .first + .fetch('pg_is_in_recovery') == 't' + else + false + end + end + + def self.db_read_write? + !self.db_read_only? + end + def self.version @version ||= database_version.match(/\A(?:PostgreSQL |)([^\s]+).*\z/)[1] end diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb index 8bb246aa4bd..782e4e45a91 100644 --- a/spec/lib/gitlab/database_spec.rb +++ b/spec/lib/gitlab/database_spec.rb @@ -357,6 +357,35 @@ describe Gitlab::Database do end end + describe '.db_read_only?' do + context 'when using PostgreSQL' do + before do + allow(ActiveRecord::Base.connection).to receive(:execute).and_call_original + expect(described_class).to receive(:postgresql?).and_return(true) + end + + it 'detects a read only database' do + allow(ActiveRecord::Base.connection).to receive(:execute).with('SELECT pg_is_in_recovery()').and_return([{ "pg_is_in_recovery" => "t" }]) + + expect(described_class.db_read_only?).to be_truthy + end + + it 'detects a read write database' do + allow(ActiveRecord::Base.connection).to receive(:execute).with('SELECT pg_is_in_recovery()').and_return([{ "pg_is_in_recovery" => "f" }]) + + expect(described_class.db_read_only?).to be_falsey + end + end + + context 'when using MySQL' do + before do + expect(described_class).to receive(:postgresql?).and_return(false) + end + + it { expect(described_class.db_read_only?).to be_falsey } + end + end + describe '#sanitize_timestamp' do let(:max_timestamp) { Time.at((1 << 31) - 1) } |