diff --git a/config/deploy.production.yml b/config/deploy.production.yml index 844adc597..076c79ccb 100644 --- a/config/deploy.production.yml +++ b/config/deploy.production.yml @@ -42,6 +42,7 @@ env: MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-01.sc-chi-int.37signals.com df_iad: MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-101.df-iad-int.37signals.com + PRIMARY_DATACENTER: true df_ams: MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-401.df-ams-int.37signals.com diff --git a/config/deploy.staging.yml b/config/deploy.staging.yml index 0d472fff2..91a39cbba 100644 --- a/config/deploy.staging.yml +++ b/config/deploy.staging.yml @@ -42,6 +42,7 @@ env: MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-01.sc-chi-int.37signals.com df_iad: MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-101.df-iad-int.37signals.com + PRIMARY_DATACENTER: true df_ams: MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-401.df-ams-int.37signals.com diff --git a/config/initializers/multi_db.rb b/config/initializers/multi_db.rb index ae85d8527..b4d91085d 100644 --- a/config/initializers/multi_db.rb +++ b/config/initializers/multi_db.rb @@ -1,5 +1,7 @@ +require "deployment" + Rails.application.configure do config.active_record.database_selector = { delay: 1.second } - config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver + config.active_record.database_resolver = Deployment::DatabaseResolver config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session end diff --git a/lib/deployment.rb b/lib/deployment.rb new file mode 100644 index 000000000..8d2d6ef37 --- /dev/null +++ b/lib/deployment.rb @@ -0,0 +1 @@ +require_relative "deployment/database_resolver.rb" diff --git a/lib/deployment/database_resolver.rb b/lib/deployment/database_resolver.rb new file mode 100644 index 000000000..c52447c17 --- /dev/null +++ b/lib/deployment/database_resolver.rb @@ -0,0 +1,18 @@ +module Deployment + class DatabaseResolver < ActiveRecord::Middleware::DatabaseSelector::Resolver + def self.in_primary_datacenter? + ENV["PRIMARY_DATACENTER"].present? || Rails.env.local? + end + + def reading_request?(request) + # Disables writes (and so primary-DB stickiness) in non-primary datacenters + super || !DatabaseResolver.in_primary_datacenter? + end + + private + def read_from_primary? + # Only the primary datacenter can read from the primary database, non-primary DCs have local DB replicas + super && DatabaseResolver.in_primary_datacenter? + end + end +end