Skip to content

Rails changes - Allow configuration of Geo tracking database in database.yml

Problem

Currently, Geo manually manages additional DB connections. This results in a number of overwrites to provide this kind of support.

It should rather depend on Rails 6 many databases support to reduce complexity of the implementation. This conflicts to some extent with many databases support and causes additional complexity on dealing with Geo doing something unique.

module Geo
  class TrackingBase < ApplicationRecord
    self.abstract_class = true

    NOT_CONFIGURED_MSG     = 'Geo secondary database is not configured'
    SecondaryNotConfigured = Class.new(StandardError)

    if ::Gitlab::Geo.geo_database_configured?
      establish_connection Rails.configuration.geo_database
    end

    def self.connected?
      return false unless ::Gitlab::Geo.geo_database_configured?

      connection_handler.connected?(connection_specification_name)
    end

    def self.connection
      unless ::Gitlab::Geo.geo_database_configured?
        message = NOT_CONFIGURED_MSG
        message = "#{message}\nIn the GDK root, try running `make geo-setup`" if Rails.env.development?
        raise SecondaryNotConfigured, message
      end

      # Don't call super because LoadBalancing::ActiveRecordProxy will intercept it
      retrieve_connection
    rescue ActiveRecord::NoDatabaseError
      raise SecondaryNotConfigured, NOT_CONFIGURED_MSG
    end
  end
end

Use single database.yml instead of database_geo.yml:

production:
  main:
    host: postgres
    database: gitlabhq_production
    ...
  geo:
    host: postgres
    database: gitlabhq_geo_production
    ...
development:

Proposal

  • Configure tracking database in database.yml instead of custom database_geo.yml
  • Use connects_to to make Geo models use the tracking database instead of def self.connection override in Geo::TrackingBase
  • Use connected_to block to manually use the tracking database instead of Gitlab::Geo::DatabaseTasks#set_db_env
  • Ensure that Gitlab::Geo::HealthCheck still works
  • Deprecate custom rake geo:db:* rake tasks in favor of built-in tasks rake db:*:geo
  • Changes must be backwards compatible across updates

References

Edited by Douglas Barbosa Alexandre