Replace Makara with an initial Rails 6 role based splitting method.

This commit is contained in:
Free Speech Forever
2021-02-09 19:38:10 +00:00
committed by admin
parent 31922ea58b
commit 473c48b2aa
42 changed files with 3142 additions and 141 deletions

View File

@@ -6,21 +6,24 @@ default: &default
sslmode: <%= ENV['DB_SSLMODE'] || "prefer" %>
development:
<<: *default
adapter: postgresql_makara
prepared_statements: false
database: <%= ENV['DB_NAME'] || 'gabsocial_development' %>
username: <%= ENV['DB_USER'] %>
password: <%= ENV['DB_PASS'] %>
host: <%= ENV['DB_HOST'] %>
port: <%= ENV['DB_PORT'] %>
makara:
id: postgres
sticky: true
connections:
- role: master
blacklist_duration: 0
- role: slave
master:
adapter: postgresql
url: <%= ENV['DB_MASTER_URL'] %>
pool: <%= ENV['DB_POOL'] %>
timeout: 5000
encoding: unicode
slave1:
adapter: postgresql
url: <%= ENV['DB_SLAVE1_URL'] %>
pool: <%= ENV['DB_POOL'] %>
timeout: 5000
encoding: unicode
slave2:
adapter: postgresql
url: <%= ENV['DB_SLAVE1_URL'] %>
pool: <%= ENV['DB_POOL'] %>
timeout: 5000
encoding: unicode
# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
@@ -33,12 +36,34 @@ test:
host: <%= ENV['DB_HOST'] %>
port: <%= ENV['DB_PORT'] %>
production:
<<: *default
database: <%= ENV['DB_NAME'] || 'gabsocial_production' %>
username: <%= ENV['DB_USER'] || 'gabsocial' %>
password: <%= ENV['DB_PASS'] || '' %>
host: <%= ENV['DB_HOST'] || 'localhost' %>
port: <%= ENV['DB_PORT'] || 5432 %>
prepared_statements: <%= ENV['PREPARED_STATEMENTS'] || 'true' %>
#production:
# <<: *default
# database: <%= ENV['DB_NAME'] || 'gabsocial_production' %>
# username: <%= ENV['DB_USER'] || 'gabsocial' %>
# password: <%= ENV['DB_PASS'] || '' %>
# host: <%= ENV['DB_HOST'] || 'localhost' %>
# port: <%= ENV['DB_PORT'] || 5432 %>
# prepared_statements: <%= ENV['PREPARED_STATEMENTS'] || 'true' %>
production:
master:
adapter: postgresql
url: <%= ENV['DB_MASTER_URL'] %>
pool: <%= ENV['DB_POOL'] %>
timeout: 5000
encoding: unicode
slave1:
adapter: postgresql
url: <%= ENV['DB_SLAVE1_URL'] %>
pool: <%= ENV['DB_POOL'] %>
timeout: 5000
encoding: unicode
slave2:
adapter: postgresql
url: <%= ENV['DB_SLAVE1_URL'] %>
pool: <%= ENV['DB_POOL'] %>
timeout: 5000
encoding: unicode

View File

@@ -131,7 +131,7 @@ Rails.application.configure do
# DatabaseSelector middleware is designed as such you can define your own
# strategy for connection switching and pass that into the middleware through
# these configuration options.
# config.active_record.database_selector = { delay: 2.seconds }
# config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
# config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
config.active_record.database_selector = { delay: 2.seconds }
config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
end

View File

@@ -1,8 +1,11 @@
Warden::Manager.after_set_user except: :fetch do |user, warden|
if user.session_active?(warden.cookies.signed['_session_id'] || warden.raw_session['auth_id'])
session_id = warden.cookies.signed['_session_id'] || warden.raw_session['auth_id']
else
session_id = user.activate_session(warden.request)
session_id = nil
ActiveRecord::Base.connected_to(role: :writing) do
if user.session_active?(warden.cookies.signed['_session_id'] || warden.raw_session['auth_id'])
session_id = warden.cookies.signed['_session_id'] || warden.raw_session['auth_id']
else
session_id = user.activate_session(warden.request)
end
end
warden.cookies.signed['_session_id'] = {
@@ -14,17 +17,20 @@ Warden::Manager.after_set_user except: :fetch do |user, warden|
end
Warden::Manager.after_fetch do |user, warden|
if user.session_active?(warden.cookies.signed['_session_id'] || warden.raw_session['auth_id'])
warden.cookies.signed['_session_id'] = {
value: warden.cookies.signed['_session_id'] || warden.raw_session['auth_id'],
expires: 1.year.from_now,
httponly: true,
secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'),
}
else
warden.logout
throw :warden, message: :unauthenticated
ActiveRecord::Base.connected_to(role: :writing) do
if user.session_active?(warden.cookies.signed['_session_id'] || warden.raw_session['auth_id'])
warden.cookies.signed['_session_id'] = {
value: warden.cookies.signed['_session_id'] || warden.raw_session['auth_id'],
expires: 1.year.from_now,
httponly: true,
secure: (Rails.env.production? || ENV['LOCAL_HTTPS'] == 'true'),
}
else
warden.logout
throw :warden, message: :unauthenticated
end
end
warden.cookies.signed['_session_id']
end
Warden::Manager.before_logout do |_, warden|

View File

@@ -16,9 +16,6 @@ Rails.application.routes.draw do
mount PgHero::Engine, at: 'pghero', as: :pghero
end
Doorkeeper::AccessToken.connection.stick_to_master!
Doorkeeper::AccessGrant.connection.stick_to_master!
SessionActivation.connection.stick_to_master!
SessionActivation.record_timestamps = false
use_doorkeeper do