From 685cc4a61043af3b758547df7969d0de3f1012c7 Mon Sep 17 00:00:00 2001 From: Douglas Barbosa Alexandre <dbalexandre@gmail.com> Date: Wed, 5 Aug 2020 14:26:57 -0300 Subject: [PATCH] Remove Gitlab::Geo::Fdw class Since Gitlab 13.2, Geo don't rely on FDW --- .rubocop_todo.yml | 1 - ee/lib/gitlab/geo/fdw.rb | 113 --------------------- ee/spec/lib/gitlab/geo/fdw_spec.rb | 156 ----------------------------- 3 files changed, 270 deletions(-) delete mode 100644 ee/lib/gitlab/geo/fdw.rb delete mode 100644 ee/spec/lib/gitlab/geo/fdw_spec.rb diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index a73b9dbf61ac6..903dc5fdcd02c 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -257,7 +257,6 @@ Performance/Count: Exclude: - 'app/helpers/groups_helper.rb' - 'app/services/merge_requests/add_context_service.rb' - - 'ee/lib/gitlab/geo/fdw.rb' - 'ee/lib/gitlab/graphql/aggregations/epics/epic_node.rb' - 'ee/spec/controllers/projects/feature_flags_controller_spec.rb' - 'ee/spec/requests/api/feature_flags_spec.rb' diff --git a/ee/lib/gitlab/geo/fdw.rb b/ee/lib/gitlab/geo/fdw.rb deleted file mode 100644 index 65f5dd5954fc7..0000000000000 --- a/ee/lib/gitlab/geo/fdw.rb +++ /dev/null @@ -1,113 +0,0 @@ -# frozen_string_literal: true - -module Gitlab - module Geo - class Fdw - DEFAULT_SCHEMA = 'public' - FOREIGN_SERVER = 'gitlab_secondary' - FOREIGN_SCHEMA = 'gitlab_secondary' - - class << self - # Return if FDW is enabled for this instance - # - # @return [Boolean] whether FDW is enabled - def enabled? - return false unless fdw_capable? - - # FDW is enabled by default, disable it by setting `fdw: false` in config/database_geo.yml - value = Rails.configuration.geo_database['fdw'] - value.nil? ? true : value - end - - def disabled? - !enabled? - end - - # Return full table name with foreign schema - # - # @param [String] table_name - def foreign_table_name(table_name) - FOREIGN_SCHEMA + ".#{table_name}" - end - - # Number of existing tables - # - # @return [Integer] number of tables - def foreign_schema_tables_count - Gitlab::Geo.cache_value(:geo_fdw_count_tables) do - sql = <<~SQL - SELECT COUNT(*) - FROM information_schema.foreign_tables - WHERE foreign_table_schema = '#{FOREIGN_SCHEMA}' - AND foreign_table_name NOT LIKE 'pg_%' - SQL - - ::Geo::TrackingBase.connection.execute(sql).first.fetch('count').to_i - end - end - - private - - def fdw_capable? - has_foreign_server? && has_foreign_schema? && foreign_schema_tables_count > 0 - rescue ::Geo::TrackingBase::SecondaryNotConfigured - false - end - - # Check if there is at least one foreign server configured - # - # @return [Boolean] whether any foreign server exists - def has_foreign_server? - ::Geo::TrackingBase.connection.execute( - "SELECT 1 FROM pg_foreign_server" - ).count > 0 - end - - def has_foreign_schema? - Gitlab::Geo.cache_value(:geo_FOREIGN_SCHEMA_exist) do - sql = <<~SQL - SELECT 1 - FROM information_schema.schemata - WHERE schema_name='#{FOREIGN_SCHEMA}' - SQL - - ::Geo::TrackingBase.connection.execute(sql).count > 0 - end - end - - # Check if foreign schema has exact the same tables and fields defined on secondary database - # - # @return [Boolean] whether schemas match and are not empty - def foreign_schema_tables_match? - Gitlab::Geo.cache_value(:geo_foreign_schema_tables_match) do - gitlab_schema_tables = retrieve_gitlab_schema_tables.to_set - foreign_schema_tables = retrieve_foreign_schema_tables.to_set - - gitlab_schema_tables.present? && (gitlab_schema_tables == foreign_schema_tables) - end - end - - def retrieve_foreign_schema_tables - retrieve_schema_tables(::Geo::TrackingBase, Rails.configuration.geo_database['database'], FOREIGN_SCHEMA).to_a - end - - def retrieve_gitlab_schema_tables - retrieve_schema_tables(ActiveRecord::Base, ActiveRecord::Base.connection_config[:database], DEFAULT_SCHEMA).to_a - end - - def retrieve_schema_tables(adapter, database, schema) - sql = <<~SQL - SELECT table_name, column_name, data_type - FROM information_schema.columns - WHERE table_catalog = '#{database}' - AND table_schema = '#{schema}' - AND table_name NOT LIKE 'pg_%' - ORDER BY table_name, column_name, data_type - SQL - - adapter.connection.select_all(sql) - end - end - end - end -end diff --git a/ee/spec/lib/gitlab/geo/fdw_spec.rb b/ee/spec/lib/gitlab/geo/fdw_spec.rb deleted file mode 100644 index d1ccb4b500547..0000000000000 --- a/ee/spec/lib/gitlab/geo/fdw_spec.rb +++ /dev/null @@ -1,156 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Gitlab::Geo::Fdw, :geo do - describe '.enabled?' do - it 'returns false when Geo secondary database is not configured' do - allow(Gitlab::Geo).to receive(:geo_database_configured?).and_return(false) - - expect(described_class.enabled?).to eq false - end - - it 'returns false when foreign server does not exist' do - drop_foreign_server - - expect(described_class.enabled?).to eq false - end - - it 'returns false when foreign server exists but foreign schema does not exist' do - drop_foreign_schema - - expect(described_class.enabled?).to eq false - end - - it 'returns false when foreign server and schema exists but foreign tables are empty' do - drop_foreign_schema - create_foreign_schema - - expect(described_class.enabled?).to eq false - end - - it 'returns false when fdw is disabled in `config/database_geo.yml`' do - allow(Rails.configuration).to receive(:geo_database).and_return('fdw' => false) - - expect(described_class.enabled?).to be_falsey - end - - it 'returns true when fdw is set in `config/database_geo.yml`' do - allow(Rails.configuration).to receive(:geo_database).and_return('fdw' => true) - - expect(described_class.enabled?).to be_truthy - end - - it 'returns true when fdw is nil in `config/database_geo.yml`' do - allow(Rails.configuration).to receive(:geo_database).and_return('fdw' => nil) - - expect(described_class.enabled?).to be_truthy - end - - it 'returns true with a functional fdw environment' do - expect(described_class.enabled?).to be_truthy - end - end - - describe '.disabled?' do - it 'returns true when foreign server does not exist' do - drop_foreign_server - - expect(described_class.disabled?).to eq true - end - - it 'returns true when foreign server exists but foreign schema does not exist' do - drop_foreign_schema - - expect(described_class.disabled?).to eq true - end - - it 'returns true when foreign server and schema exists but foreign tables are empty' do - drop_foreign_schema - create_foreign_schema - - expect(described_class.disabled?).to eq true - end - - it 'returns true when fdw is disabled in `config/database_geo.yml`' do - allow(Rails.configuration).to receive(:geo_database).and_return('fdw' => false) - - expect(described_class.disabled?).to eq true - end - - it 'returns true when Geo secondary database is not configured' do - allow(Gitlab::Geo).to receive(:geo_database_configured?).and_return(false) - - expect(described_class.disabled?).to eq true - end - - it 'returns false when fdw is set in `config/database_geo.yml`' do - allow(Rails.configuration).to receive(:geo_database).and_return('fdw' => true) - - expect(described_class.disabled?).to eq false - end - - it 'returns false when fdw is nil in `config/database_geo.yml`' do - allow(Rails.configuration).to receive(:geo_database).and_return('fdw' => nil) - - expect(described_class.disabled?).to eq false - end - - it 'returns false with a functional fdw environment' do - expect(described_class.disabled?).to eq false - end - end - - describe '.foreign_schema_tables_count' do - before do - drop_foreign_schema - create_foreign_schema - end - - it 'returns the number of tables in the foreign schema' do - create_foreign_table(:gitlab_test) - - expect(described_class.foreign_schema_tables_count).to eq(1) - end - - it 'excludes tables that start with `pg_`' do - create_foreign_table(:pg_gitlab_test) - - expect(described_class.foreign_schema_tables_count).to eq(0) - end - end - - def with_foreign_connection - Geo::TrackingBase.connection - end - - def drop_foreign_server - with_foreign_connection.execute <<-SQL - DROP SERVER IF EXISTS #{described_class::FOREIGN_SERVER} CASCADE - SQL - end - - def drop_foreign_schema - with_foreign_connection.execute <<-SQL - DROP SCHEMA IF EXISTS #{described_class::FOREIGN_SCHEMA} CASCADE - SQL - end - - def create_foreign_schema - with_foreign_connection.execute <<-SQL - CREATE SCHEMA IF NOT EXISTS #{described_class::FOREIGN_SCHEMA} - SQL - - with_foreign_connection.execute <<-SQL - GRANT USAGE ON FOREIGN SERVER #{described_class::FOREIGN_SERVER} TO current_user - SQL - end - - def create_foreign_table(table_name) - with_foreign_connection.execute <<-SQL - CREATE FOREIGN TABLE IF NOT EXISTS #{described_class::FOREIGN_SCHEMA}.#{table_name} ( - id int - ) SERVER #{described_class::FOREIGN_SERVER} - SQL - end -end -- GitLab