Fix UserTrackingConcern firing on every request, optimize some queries (#5368)

- For some reason, :if option on before_action did not work. It got
  executed every time, returned false, and the action run anyway,
  which led to the current_sign_in_at and sign_in_count being
  updated on every request
- Return "do not filter" early in FeedManager#filter_from_home? if
  the status is authored by receiver. Usually this method is not
  called for own statuses at all, but it is called when Feed#get
  uses the database
- Return early if #reload_stale_associations! has nothing to load
  to save a database query with WHERE 1=0
master
Eugen Rochko 7 years ago committed by GitHub
parent 48f7a58799
commit b8db386e05
  1. 6
      app/controllers/concerns/user_tracking_concern.rb
  2. 3
      app/lib/feed_manager.rb
  3. 5
      app/models/notification.rb
  4. 6
      app/models/status.rb

@ -7,12 +7,14 @@ module UserTrackingConcern
UPDATE_SIGN_IN_HOURS = 24 UPDATE_SIGN_IN_HOURS = 24
included do included do
before_action :set_user_activity, if: %i(user_signed_in? user_needs_sign_in_update?) before_action :set_user_activity
end end
private private
def set_user_activity def set_user_activity
return unless user_needs_sign_in_update?
# Mark as signed-in today # Mark as signed-in today
current_user.update_tracked_fields!(request) current_user.update_tracked_fields!(request)
@ -21,7 +23,7 @@ module UserTrackingConcern
end end
def user_needs_sign_in_update? def user_needs_sign_in_update?
current_user.current_sign_in_at.nil? || current_user.current_sign_in_at < UPDATE_SIGN_IN_HOURS.hours.ago user_signed_in? && (current_user.current_sign_in_at.nil? || current_user.current_sign_in_at < UPDATE_SIGN_IN_HOURS.hours.ago)
end end
def user_needs_feed_update? def user_needs_feed_update?

@ -115,7 +115,8 @@ class FeedManager
end end
def filter_from_home?(status, receiver_id) def filter_from_home?(status, receiver_id)
return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?) return false if receiver_id == status.account_id
return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?)
check_for_mutes = [status.account_id] check_for_mutes = [status.account_id]
check_for_mutes.concat([status.reblog.account_id]) if status.reblog? check_for_mutes.concat([status.reblog.account_id]) if status.reblog?

@ -68,7 +68,10 @@ class Notification < ApplicationRecord
class << self class << self
def reload_stale_associations!(cached_items) def reload_stale_associations!(cached_items)
account_ids = cached_items.map(&:from_account_id).uniq account_ids = cached_items.map(&:from_account_id).uniq
accounts = Account.where(id: account_ids).map { |a| [a.id, a] }.to_h
return if account_ids.empty?
accounts = Account.where(id: account_ids).map { |a| [a.id, a] }.to_h
cached_items.each do |item| cached_items.each do |item|
item.from_account = accounts[item.from_account_id] item.from_account = accounts[item.from_account_id]

@ -194,7 +194,11 @@ class Status < ApplicationRecord
account_ids << item.reblog.account_id if item.reblog? account_ids << item.reblog.account_id if item.reblog?
end end
accounts = Account.where(id: account_ids.uniq).map { |a| [a.id, a] }.to_h account_ids.uniq!
return if account_ids.empty?
accounts = Account.where(id: account_ids).map { |a| [a.id, a] }.to_h
cached_items.each do |item| cached_items.each do |item|
item.account = accounts[item.account_id] item.account = accounts[item.account_id]

Loading…
Cancel
Save