use replica db for calculating post counts
This commit is contained in:
@@ -1061,8 +1061,8 @@ class Post < ActiveRecord::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def fast_count_search(tags, options = {})
|
def fast_count_search(tags, options = {})
|
||||||
count = Post.with_timeout(options[:statement_timeout] || 500, nil, :tags => tags) do
|
count = PostReadOnly.with_timeout(3_000, nil) do
|
||||||
Post.tag_match(tags).count
|
PostReadOnly.tag_match(tags).count
|
||||||
end
|
end
|
||||||
|
|
||||||
if count == nil && tags !~ / /
|
if count == nil && tags !~ / /
|
||||||
@@ -1083,8 +1083,8 @@ class Post < ActiveRecord::Base
|
|||||||
i = Post.maximum(:id)
|
i = Post.maximum(:id)
|
||||||
sum = 0
|
sum = 0
|
||||||
while i > 0
|
while i > 0
|
||||||
count = Post.with_timeout(options[:statement_timeout] || 500, nil, :tags => tags) do
|
count = PostReadOnly.with_timeout(1_000, nil) do
|
||||||
sum += Post.tag_match(tags).where("id <= ? and id > ?", i, i - 25_000).count
|
sum += PostReadOnly.tag_match(tags).where("id <= ? and id > ?", i, i - 25_000).count
|
||||||
i -= 25_000
|
i -= 25_000
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,13 @@
|
|||||||
class PostReadOnly < Post
|
class PostReadOnly < Post
|
||||||
establish_connection "ro_#{Rails.env}".to_sym
|
establish_connection "ro_#{Rails.env}".to_sym
|
||||||
attr_readonly *column_names
|
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
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user