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
This commit is contained in:
		
							parent
							
								
									48f7a58799
								
							
						
					
					
						commit
						b8db386e05
					
				
					 4 changed files with 15 additions and 5 deletions
				
			
		| 
						 | 
					@ -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,6 +115,7 @@ class FeedManager
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def filter_from_home?(status, receiver_id)
 | 
					  def filter_from_home?(status, receiver_id)
 | 
				
			||||||
 | 
					    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?)
 | 
					    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]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,6 +68,9 @@ 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return if account_ids.empty?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      accounts = Account.where(id: account_ids).map { |a| [a.id, a] }.to_h
 | 
					      accounts = Account.where(id: account_ids).map { |a| [a.id, a] }.to_h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      cached_items.each do |item|
 | 
					      cached_items.each do |item|
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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…
	
		Reference in a new issue