Prevent pinning writes in non-primary DCs

This commit is contained in:
Kevin McConnell
2025-11-17 16:03:05 +00:00
parent b335eab6de
commit 9b3b2f5d29
5 changed files with 24 additions and 1 deletions
+1
View File
@@ -42,6 +42,7 @@ env:
MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-01.sc-chi-int.37signals.com MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-01.sc-chi-int.37signals.com
df_iad: df_iad:
MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-101.df-iad-int.37signals.com MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-101.df-iad-int.37signals.com
PRIMARY_DATACENTER: true
df_ams: df_ams:
MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-401.df-ams-int.37signals.com MYSQL_SOLID_CACHE_HOST: fizzy-solidcache-db-401.df-ams-int.37signals.com
+1
View File
@@ -42,6 +42,7 @@ env:
MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-01.sc-chi-int.37signals.com MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-01.sc-chi-int.37signals.com
df_iad: df_iad:
MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-101.df-iad-int.37signals.com MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-101.df-iad-int.37signals.com
PRIMARY_DATACENTER: true
df_ams: df_ams:
MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-401.df-ams-int.37signals.com MYSQL_SOLID_CACHE_HOST: fizzy-staging-solidcache-db-401.df-ams-int.37signals.com
+3 -1
View File
@@ -1,5 +1,7 @@
require "deployment"
Rails.application.configure do Rails.application.configure do
config.active_record.database_selector = { delay: 1.second } 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 config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
end end
+1
View File
@@ -0,0 +1 @@
require_relative "deployment/database_resolver.rb"
+18
View File
@@ -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