Remove uses of the read replica database.
https://danbooru.donmai.us/forum_topics/9127?page=283#forum_post_160508 There was a recent outage that was caused by the read replica (yukinoshita.donmai.us) being temporarily unavailable. The pg driver in rails got hardstuck trying to connect to the replica, which brought down the whole site. The app servers stopped responding and could only be brought down with SIGKILL. Even try to boot the rails console didn't work. We only really used this to calculate tag counts inside Post.fast_count, which wasn't really beneficial since the read replica is slower than the main database.
This commit is contained in:
@@ -22,7 +22,7 @@ class TagBatchChangeJob < ApplicationJob
|
||||
|
||||
def self.estimate_update_count(antecedent, consequent)
|
||||
CurrentUser.without_safe_mode do
|
||||
PostReadOnly.tag_match(antecedent).count
|
||||
Post.tag_match(antecedent).count
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
class PostQueryBuilder
|
||||
attr_accessor :query_string, :read_only
|
||||
attr_accessor :query_string
|
||||
|
||||
def initialize(query_string, read_only: false)
|
||||
def initialize(query_string)
|
||||
@query_string = query_string
|
||||
@read_only = read_only
|
||||
end
|
||||
|
||||
def add_range_relation(arr, field, relation)
|
||||
@@ -117,7 +116,7 @@ class PostQueryBuilder
|
||||
q = Tag.parse_query(query_string)
|
||||
end
|
||||
|
||||
relation = read_only ? PostReadOnly.all : Post.all
|
||||
relation = Post.all
|
||||
|
||||
if q[:tag_count].to_i > Danbooru.config.tag_query_limit
|
||||
raise ::Post::SearchError
|
||||
|
||||
@@ -1129,8 +1129,8 @@ class Post < ApplicationRecord
|
||||
end
|
||||
|
||||
def fast_count_search(tags, timeout:, raise_on_timeout:)
|
||||
count = PostReadOnly.with_timeout(timeout, nil, tags: tags) do
|
||||
PostReadOnly.tag_match(tags).count
|
||||
count = Post.with_timeout(timeout, nil, tags: tags) do
|
||||
Post.tag_match(tags).count
|
||||
end
|
||||
|
||||
if count.nil?
|
||||
@@ -1645,8 +1645,8 @@ class Post < ApplicationRecord
|
||||
where("posts.tag_index @@ to_tsquery('danbooru', E?)", tag.to_escaped_for_tsquery)
|
||||
end
|
||||
|
||||
def tag_match(query, read_only: false)
|
||||
PostQueryBuilder.new(query, read_only: read_only).build
|
||||
def tag_match(query)
|
||||
PostQueryBuilder.new(query).build
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
class PostReadOnly < Post
|
||||
establish_connection (ENV["RO_DATABASE_URL"] || "ro_#{Rails.env}".to_sym)
|
||||
attr_readonly *column_names
|
||||
|
||||
def with_timeout(n, default_value = nil)
|
||||
connection.execute("SET STATEMENT_TIMEOUT = #{n}") unless Rails.env == "test"
|
||||
yield
|
||||
rescue ::ActiveRecord::StatementInvalid => x
|
||||
return default_value
|
||||
ensure
|
||||
connection.execute("SET STATEMENT_TIMEOUT = 0") unless Rails.env == "test"
|
||||
end
|
||||
end
|
||||
@@ -31,7 +31,6 @@ services:
|
||||
- SESSION_SECRET_KEY
|
||||
- RAILS_ENV
|
||||
- DATABASE_URL
|
||||
- RO_DATABASE_URL
|
||||
- DEBUG
|
||||
- ARCHIVE_DATABASE_URL
|
||||
- DANBOORU_AWS_SQS_ARCHIVE_URL
|
||||
|
||||
@@ -24,27 +24,6 @@ production:
|
||||
timeout: 5000
|
||||
url: <%= ENV['DATABASE_URL'] %>
|
||||
|
||||
# read only databases, just point to local copies if you have no need
|
||||
ro_development:
|
||||
adapter: postgresql
|
||||
database: danbooru2
|
||||
url: <%= ENV['RO_DATABASE_URL'] %>
|
||||
|
||||
ro_test:
|
||||
adapter: postgresql
|
||||
database: danbooru2_test
|
||||
url: <%= ENV['RO_DATABASE_URL'] %>
|
||||
|
||||
ro_production:
|
||||
adapter: postgresql
|
||||
database: danbooru2
|
||||
url: <%= ENV['RO_DATABASE_URL'] %>
|
||||
|
||||
ro_staging:
|
||||
adapter: postgresql
|
||||
database: danbooru2
|
||||
url: <%= ENV['RO_DATABASE_URL'] %>
|
||||
|
||||
archive_development:
|
||||
adapter: postgresql
|
||||
database: archive_development
|
||||
|
||||
Reference in New Issue
Block a user