diff options
-rw-r--r-- | lib/gitlab/database.rb | 11 | ||||
-rw-r--r-- | spec/lib/gitlab/database_spec.rb | 22 |
2 files changed, 27 insertions, 6 deletions
diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb index 68ed53cf64a..6d40e00c035 100644 --- a/lib/gitlab/database.rb +++ b/lib/gitlab/database.rb @@ -35,7 +35,6 @@ module Gitlab adapter_name.casecmp('postgresql').zero? end - # Overridden in EE def self.read_only? false end @@ -44,12 +43,14 @@ module Gitlab !self.read_only? end - # check whether the underlying database is in read-only mode + # 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' + pg_is_in_recovery = + ActiveRecord::Base.connection.execute('SELECT pg_is_in_recovery()') + .first.fetch('pg_is_in_recovery') + + Gitlab::Utils.to_boolean(pg_is_in_recovery) else false end diff --git a/spec/lib/gitlab/database_spec.rb b/spec/lib/gitlab/database_spec.rb index 7d76519dddd..fc295b2deff 100644 --- a/spec/lib/gitlab/database_spec.rb +++ b/spec/lib/gitlab/database_spec.rb @@ -443,11 +443,17 @@ describe Gitlab::Database do end end + describe '.read_only?' do + it 'returns false' do + expect(described_class.read_only?).to be_falsey + 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) + allow(described_class).to receive(:postgresql?).and_return(true) end it 'detects a read only database' do @@ -456,11 +462,25 @@ describe Gitlab::Database do expect(described_class.db_read_only?).to be_truthy end + # TODO: remove rails5-only tag after removing rails4 tests + it 'detects a read only database', :rails5 do + allow(ActiveRecord::Base.connection).to receive(:execute).with('SELECT pg_is_in_recovery()').and_return([{ "pg_is_in_recovery" => true }]) + + 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 + + # TODO: remove rails5-only tag after removing rails4 tests + it 'detects a read write database', :rails5 do + allow(ActiveRecord::Base.connection).to receive(:execute).with('SELECT pg_is_in_recovery()').and_return([{ "pg_is_in_recovery" => false }]) + + expect(described_class.db_read_only?).to be_falsey + end end context 'when using MySQL' do |