diff --git a/app/models/geo/base_registry.rb b/app/models/geo/base_registry.rb index 7d10b5db79314bbae5e6a681124dab359e3cfcf5..4f07388fe68e6eacd27ac16702e52c167d611316 100644 --- a/app/models/geo/base_registry.rb +++ b/app/models/geo/base_registry.rb @@ -1,7 +1,31 @@ class Geo::BaseRegistry < ActiveRecord::Base self.abstract_class = true - if Gitlab::Geo.configured? && (Gitlab::Geo.secondary? || Rails.env.test?) - establish_connection Rails.configuration.geo_database + # If Gitlab::Geo.secondary? changes, we need to reinitialize the connection + # properly in the model to avoid requiring a full unicorn restart. + def self.retrieve_connection + set_connection! if should_change_connection? + connection_handler.retrieve_connection(self) + end + + private + + def self.set_connection! + if Gitlab::Geo.tracking_connection_available? + establish_connection Rails.configuration.geo_database + else + establish_connection "#{Rails.env}".to_sym + end + end + + def self.should_change_connection? + using_master_connection? && Gitlab::Geo.tracking_connection_available? + end + + def self.using_master_connection? + master_connection = ActiveRecord::Base.connection_config[:database] + tracking_connection = Geo::BaseRegistry.connection_config[:database] + + master_connection === tracking_connection end end diff --git a/lib/gitlab/geo.rb b/lib/gitlab/geo.rb index f6661b03c11e72201839f627170bfaa6a17896ce..3d188bfbc9c2adc77efe6f9b5ca9480f8e0aef04 100644 --- a/lib/gitlab/geo.rb +++ b/lib/gitlab/geo.rb @@ -46,6 +46,10 @@ def self.configured? Rails.configuration.respond_to?(:geo_database) end + def self.tracking_connection_available? + self.cache_value(:tracking_connection_available) { self.configured? && (self.secondary? || Rails.env.test?) } + end + def self.license_allows? ::License.current&.feature_available?(:geo) end