diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-20 16:18:24 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-09-20 16:18:24 +0300 |
commit | 0653e08efd039a5905f3fa4f6e9cef9f5d2f799c (patch) | |
tree | 4dcc884cf6d81db44adae4aa99f8ec1233a41f55 /lib/gitlab/database/load_balancing/primary_host.rb | |
parent | 744144d28e3e7fddc117924fef88de5d9674fe4c (diff) |
Add latest changes from gitlab-org/gitlab@14-3-stable-eev14.3.0-rc42
Diffstat (limited to 'lib/gitlab/database/load_balancing/primary_host.rb')
-rw-r--r-- | lib/gitlab/database/load_balancing/primary_host.rb | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/lib/gitlab/database/load_balancing/primary_host.rb b/lib/gitlab/database/load_balancing/primary_host.rb new file mode 100644 index 00000000000..e379652c260 --- /dev/null +++ b/lib/gitlab/database/load_balancing/primary_host.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +module Gitlab + module Database + module LoadBalancing + # A host that wraps the primary database connection. + # + # This class is used to always enable load balancing as if replicas exist, + # without the need for extra database connections. This ensures that code + # using the load balancer doesn't have to handle the case where load + # balancing is enabled, but no replicas have been configured (= the + # default case). + class PrimaryHost + def initialize(load_balancer) + @load_balancer = load_balancer + end + + def release_connection + # no-op as releasing primary connections isn't needed. + nil + end + + def enable_query_cache! + # This could mess up the primary connection, so we make this a no-op + nil + end + + def disable_query_cache! + # This could mess up the primary connection, so we make this a no-op + nil + end + + def query_cache_enabled + @load_balancer.pool.query_cache_enabled + end + + def connection + @load_balancer.pool.connection + end + + def disconnect!(timeout: 120) + nil + end + + def offline! + nil + end + + def online? + true + end + + def primary_write_location + @load_balancer.primary_write_location + end + + def database_replica_location + row = query_and_release(<<-SQL.squish) + SELECT pg_last_wal_replay_lsn()::text AS location + SQL + + row['location'] if row.any? + rescue *Host::CONNECTION_ERRORS + nil + end + + def caught_up?(_location) + true + end + + def query_and_release(sql) + connection.select_all(sql).first || {} + rescue StandardError + {} + ensure + release_connection + end + end + end + end +end |