First pass at multi-database for read replica using Rails native adapter (#25693)

Co-authored-by: emilweth <7402764+emilweth@users.noreply.github.com>
local
Kurtis Rainbolt-Greene 10 months ago committed by GitHub
parent 4534498a8e
commit e4cfe4b3db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      .rubocop_todo.yml
  2. 1
      Gemfile
  3. 3
      Gemfile.lock
  4. 7
      app/controllers/api/v1/timelines/home_controller.rb
  5. 24
      app/workers/feed_insert_worker.rb
  6. 24
      config/database.yml
  7. 2
      config/initializers/makara.rb

@ -809,7 +809,6 @@ Style/FrozenStringLiteralComment:
- 'config/initializers/httplog.rb'
- 'config/initializers/inflections.rb'
- 'config/initializers/mail_delivery_job.rb'
- 'config/initializers/makara.rb'
- 'config/initializers/mime_types.rb'
- 'config/initializers/oj.rb'
- 'config/initializers/omniauth.rb'

@ -11,7 +11,6 @@ gem 'rack', '~> 2.2.7'
gem 'haml-rails', '~>2.0'
gem 'pg', '~> 1.5'
gem 'makara', '~> 0.5'
gem 'pghero'
gem 'dotenv-rails', '~> 2.8'

@ -399,8 +399,6 @@ GEM
net-imap
net-pop
net-smtp
makara (0.5.1)
activerecord (>= 5.2.0)
marcel (1.0.2)
mario-redis-lock (1.2.1)
redis (>= 3.0.5)
@ -815,7 +813,6 @@ DEPENDENCIES
letter_opener_web (~> 2.0)
link_header (~> 0.0)
lograge (~> 0.12)
makara (~> 0.5)
mario-redis-lock (~> 1.2)
memory_profiler
mime-types (~> 3.4.1)

@ -6,11 +6,14 @@ class Api::V1::Timelines::HomeController < Api::BaseController
after_action :insert_pagination_headers, unless: -> { @statuses.empty? }
def show
@statuses = load_statuses
ApplicationRecord.connected_to(role: :read, prevent_writes: true) do
@statuses = load_statuses
@relationships = StatusRelationshipsPresenter.new(@statuses, current_user&.account_id)
end
render json: @statuses,
each_serializer: REST::StatusSerializer,
relationships: StatusRelationshipsPresenter.new(@statuses, current_user&.account_id),
relationships: @relationships,
status: account_home_feed.regenerating? ? 206 : 200
end

@ -4,19 +4,23 @@ class FeedInsertWorker
include Sidekiq::Worker
def perform(status_id, id, type = 'home', options = {})
@type = type.to_sym
@status = Status.find(status_id)
@options = options.symbolize_keys
ApplicationRecord.connected_to(role: :primary) do
@type = type.to_sym
@status = Status.find(status_id)
@options = options.symbolize_keys
case @type
when :home, :tags
@follower = Account.find(id)
when :list
@list = List.find(id)
@follower = @list.account
case @type
when :home, :tags
@follower = Account.find(id)
when :list
@list = List.find(id)
@follower = @list.account
end
end
check_and_insert
ApplicationRecord.connected_to(role: :read, prevent_writes: true) do
check_and_insert
end
rescue ActiveRecord::RecordNotFound
true
end

@ -27,10 +27,20 @@ test:
port: <%= ENV['DB_PORT'] %>
production:
<<: *default
database: <%= ENV['DB_NAME'] || 'mastodon_production' %>
username: <%= ENV['DB_USER'] || 'mastodon' %>
password: <%= (ENV['DB_PASS'] || '').to_json %>
host: <%= ENV['DB_HOST'] || 'localhost' %>
port: <%= ENV['DB_PORT'] || 5432 %>
prepared_statements: <%= ENV['PREPARED_STATEMENTS'] || 'true' %>
primary:
<<: *default
database: <%= ENV['DB_NAME'] || 'mastodon_production' %>
username: <%= ENV['DB_USER'] || 'mastodon' %>
password: <%= (ENV['DB_PASS'] || '').to_json %>
host: <%= ENV['DB_HOST'] || 'localhost' %>
port: <%= ENV['DB_PORT'] || 5432 %>
prepared_statements: <%= ENV['PREPARED_STATEMENTS'] || 'true' %>
read:
<<: *default
database: <%= ENV['DB_REPLICA_NAME'] ||ENV['DB_NAME'] || 'mastodon_production' %>
username: <%= ENV['DB_REPLICA_USER'] ||ENV['DB_USER'] || 'mastodon' %>
password: <%= (ENV['DB_REPLICA_PASS'] || ENV['DB_PASS'] || '').to_json %>
host: <%= ENV['DB_REPLICA_HOST'] ||ENV['DB_HOST'] || 'localhost' %>
port: <%= ENV['DB_REPLICA_PORT'] ||ENV['DB_PORT'] || 5432 %>
prepared_statements: <%= ENV['PREPARED_STATEMENTS'] || 'true' %>
replica: true

@ -1,2 +0,0 @@
Makara::Cookie::DEFAULT_OPTIONS[:same_site] = :lax
Makara::Cookie::DEFAULT_OPTIONS[:secure] = Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'
Loading…
Cancel
Save