diff --git a/lib/gitlab/database.rb b/lib/gitlab/database.rb index 68ed53cf64ab59cc8cc410a381873498cc3c7b97..6d40e00c0356009373b996b92f78a3508db49f61 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 7d76519dddd6f44781edd18f8a48b3f51d9c43f7..fc295b2deff91cc2e5082a3e863964139b897eb1 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