From 26e522ac55d4147b0418abcf7e16bb70cd3f0af5 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Mon, 17 Jul 2023 08:26:52 +0200
Subject: [PATCH] Fix not actually connecting to the configured replica
 (#25977)

---
 app/helpers/database_helper.rb   |  4 +--
 app/models/application_record.rb |  2 ++
 config/database.yml              | 42 +++++++++++++++++++++++---------
 3 files changed, 34 insertions(+), 14 deletions(-)

diff --git a/app/helpers/database_helper.rb b/app/helpers/database_helper.rb
index 965eeaf41d..79227bb109 100644
--- a/app/helpers/database_helper.rb
+++ b/app/helpers/database_helper.rb
@@ -2,10 +2,10 @@
 
 module DatabaseHelper
   def with_read_replica(&block)
-    ApplicationRecord.connected_to(role: :read, prevent_writes: true, &block)
+    ApplicationRecord.connected_to(role: :reading, prevent_writes: true, &block)
   end
 
   def with_primary(&block)
-    ApplicationRecord.connected_to(role: :primary, &block)
+    ApplicationRecord.connected_to(role: :writing, &block)
   end
 end
diff --git a/app/models/application_record.rb b/app/models/application_record.rb
index 5d7d3a0961..23e0af3a2a 100644
--- a/app/models/application_record.rb
+++ b/app/models/application_record.rb
@@ -5,6 +5,8 @@ class ApplicationRecord < ActiveRecord::Base
 
   include Remotable
 
+  connects_to database: { writing: :primary, reading: :read }
+
   class << self
     def update_index(_type_name, *_args, &_block)
       super if Chewy.enabled?
diff --git a/config/database.yml b/config/database.yml
index f7ecbd9814..d1fd65a0fb 100644
--- a/config/database.yml
+++ b/config/database.yml
@@ -8,23 +8,41 @@ default: &default
   application_name: ''
 
 development:
-  <<: *default
-  database: <%= ENV['DB_NAME'] || 'mastodon_development' %>
-  username: <%= ENV['DB_USER'] %>
-  password: <%= (ENV['DB_PASS'] || '').to_json %>
-  host: <%= ENV['DB_HOST'] %>
-  port: <%= ENV['DB_PORT'] %>
+  primary:
+    <<: *default
+    database: <%= ENV['DB_NAME'] || 'mastodon_development' %>
+    username: <%= ENV['DB_USER'] %>
+    password: <%= (ENV['DB_PASS'] || '').to_json %>
+    host: <%= ENV['DB_HOST'] %>
+    port: <%= ENV['DB_PORT'] %>
+  read:
+    <<: *default
+    database: <%= ENV['DB_NAME'] || 'mastodon_development' %>
+    username: <%= ENV['DB_USER'] %>
+    password: <%= (ENV['DB_PASS'] || '').to_json %>
+    host: <%= ENV['DB_HOST'] %>
+    port: <%= ENV['DB_PORT'] %>
+    replica: true
 
 # Warning: The database defined as "test" will be erased and
 # re-generated from your development database when you run "rake".
 # Do not set this db to the same as development or production.
 test:
-  <<: *default
-  database: <%= ENV['DB_NAME'] || 'mastodon' %>_test<%= ENV['TEST_ENV_NUMBER'] %>
-  username: <%= ENV['DB_USER'] %>
-  password: <%= (ENV['DB_PASS'] || '').to_json %>
-  host: <%= ENV['DB_HOST'] %>
-  port: <%= ENV['DB_PORT'] %>
+  primary:
+    <<: *default
+    database: <%= ENV['DB_NAME'] || 'mastodon' %>_test<%= ENV['TEST_ENV_NUMBER'] %>
+    username: <%= ENV['DB_USER'] %>
+    password: <%= (ENV['DB_PASS'] || '').to_json %>
+    host: <%= ENV['DB_HOST'] %>
+    port: <%= ENV['DB_PORT'] %>
+  read:
+    <<: *default
+    database: <%= ENV['DB_NAME'] || 'mastodon' %>_test<%= ENV['TEST_ENV_NUMBER'] %>
+    username: <%= ENV['DB_USER'] %>
+    password: <%= (ENV['DB_PASS'] || '').to_json %>
+    host: <%= ENV['DB_HOST'] %>
+    port: <%= ENV['DB_PORT'] %>
+    replica: true
 
 production:
   primary:
-- 
GitLab