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:
Eugen Rochko 2021-05-04 04:45:08 +02:00 committed by GitHub
parent 8c44b723bb
commit fab65848d2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 20 additions and 5 deletions

View file

@ -184,6 +184,14 @@ module AccountInteractions
active_relationships.where(target_account: other_account).exists? active_relationships.where(target_account: other_account).exists?
end end
def following_anyone?
active_relationships.exists?
end
def not_following_anyone?
!following_anyone?
end
def blocking?(other_account) def blocking?(other_account)
block_relationships.where(target_account: other_account).exists? block_relationships.where(target_account: other_account).exists?
end end

View file

@ -458,9 +458,7 @@ class User < ApplicationRecord
end end
def regenerate_feed! def regenerate_feed!
return unless Redis.current.setnx("account:#{account_id}:regeneration", true) RegenerationWorker.perform_async(account_id) if Redis.current.set("account:#{account_id}:regeneration", true, nx: true, ex: 1.day.seconds)
Redis.current.expire("account:#{account_id}:regeneration", 1.day.seconds)
RegenerationWorker.perform_async(account_id)
end end
def needs_feed_update? def needs_feed_update?

View file

@ -30,6 +30,11 @@ class FollowService < BaseService
ActivityTracker.increment('activity:interactions') 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? if (@target_account.locked? && !@options[:bypass_locked]) || @source_account.silenced? || @target_account.activitypub?
request_follow! request_follow!
elsif @target_account.local? elsif @target_account.local?
@ -39,6 +44,10 @@ class FollowService < BaseService
private 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? def following_not_possible?
@target_account.nil? || @target_account.id == @source_account.id || @target_account.suspended? @target_account.nil? || @target_account.id == @source_account.id || @target_account.suspended?
end end

View file

@ -3,11 +3,11 @@
class MergeWorker class MergeWorker
include Sidekiq::Worker include Sidekiq::Worker
sidekiq_options queue: 'pull'
def perform(from_account_id, into_account_id) def perform(from_account_id, into_account_id)
FeedManager.instance.merge_into_home(Account.find(from_account_id), Account.find(into_account_id)) FeedManager.instance.merge_into_home(Account.find(from_account_id), Account.find(into_account_id))
rescue ActiveRecord::RecordNotFound rescue ActiveRecord::RecordNotFound
true true
ensure
Redis.current.del("account:#{into_account_id}:regeneration")
end end
end end