Prevent pinning writes in non-primary DCs
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
require_relative "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
|
||||
Reference in New Issue
Block a user