Fix empty home feed before first follow has finished processing (#16152)
Change queue of merge worker from pull to default
This commit is contained in:
		@@ -184,6 +184,14 @@ module AccountInteractions
 | 
			
		||||
    active_relationships.where(target_account: other_account).exists?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def following_anyone?
 | 
			
		||||
    active_relationships.exists?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def not_following_anyone?
 | 
			
		||||
    !following_anyone?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def blocking?(other_account)
 | 
			
		||||
    block_relationships.where(target_account: other_account).exists?
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -458,9 +458,7 @@ class User < ApplicationRecord
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def regenerate_feed!
 | 
			
		||||
    return unless Redis.current.setnx("account:#{account_id}:regeneration", true)
 | 
			
		||||
    Redis.current.expire("account:#{account_id}:regeneration", 1.day.seconds)
 | 
			
		||||
    RegenerationWorker.perform_async(account_id)
 | 
			
		||||
    RegenerationWorker.perform_async(account_id) if Redis.current.set("account:#{account_id}:regeneration", true, nx: true, ex: 1.day.seconds)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def needs_feed_update?
 | 
			
		||||
 
 | 
			
		||||
@@ -30,6 +30,11 @@ class FollowService < BaseService
 | 
			
		||||
 | 
			
		||||
    ActivityTracker.increment('activity:interactions')
 | 
			
		||||
 | 
			
		||||
    # When an account follows someone for the first time, avoid showing
 | 
			
		||||
    # an empty home feed while the follow request is being processed
 | 
			
		||||
    # and the feeds are being merged
 | 
			
		||||
    mark_home_feed_as_partial! if @source_account.not_following_anyone?
 | 
			
		||||
 | 
			
		||||
    if (@target_account.locked? && !@options[:bypass_locked]) || @source_account.silenced? || @target_account.activitypub?
 | 
			
		||||
      request_follow!
 | 
			
		||||
    elsif @target_account.local?
 | 
			
		||||
@@ -39,6 +44,10 @@ class FollowService < BaseService
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def mark_home_feed_as_partial!
 | 
			
		||||
    redis.set("account:#{@source_account.id}:regeneration", true, nx: true, ex: 1.day.seconds)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def following_not_possible?
 | 
			
		||||
    @target_account.nil? || @target_account.id == @source_account.id || @target_account.suspended?
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -3,11 +3,11 @@
 | 
			
		||||
class MergeWorker
 | 
			
		||||
  include Sidekiq::Worker
 | 
			
		||||
 | 
			
		||||
  sidekiq_options queue: 'pull'
 | 
			
		||||
 | 
			
		||||
  def perform(from_account_id, into_account_id)
 | 
			
		||||
    FeedManager.instance.merge_into_home(Account.find(from_account_id), Account.find(into_account_id))
 | 
			
		||||
  rescue ActiveRecord::RecordNotFound
 | 
			
		||||
    true
 | 
			
		||||
  ensure
 | 
			
		||||
    Redis.current.del("account:#{into_account_id}:regeneration")
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user