Skip to content
Snippets Groups Projects
Commit bb4d1eb2 authored by Eugen Rochko's avatar Eugen Rochko
Browse files

Improve feed regeneration

parent 096bfbad
No related branches found
No related tags found
No related merge requests found
......@@ -76,8 +76,8 @@ class FeedManager
end
def filter_from_mentions?(status, receiver)
should_filter = false
should_filter = receiver.blocking?(status.account) # Filter if it's from someone I blocked
should_filter = receiver.id == status.account_id # Filter if I'm mentioning myself
should_filter = should_filter || receiver.blocking?(status.account) # or it's from someone I blocked
should_filter
end
end
......@@ -11,7 +11,8 @@ class Feed
# If we're after most recent items and none are there, we need to precompute the feed
if unhydrated.empty? && max_id == '+inf' && since_id == '-inf'
PrecomputeFeedService.new.call(@type, @account, limit)
RegenerationWorker.perform_async(@account.id, @type)
Status.send("as_#{@type}_timeline", @account).paginate_by_max_id(limit, nil, nil)
else
status_map = Status.where(id: unhydrated).with_includes.with_counters.map { |status| [status.id, status] }.to_h
unhydrated.map { |id| status_map[id] }.compact
......
......@@ -33,7 +33,7 @@ class FanOutOnWriteService < BaseService
status.mentions.includes(:account).each do |mention|
mentioned_account = mention.account
next if !mentioned_account.local? || mentioned_account.id == status.account_id || FeedManager.instance.filter?(:mentions, status, mentioned_account)
next if !mentioned_account.local? || FeedManager.instance.filter?(:mentions, status, mentioned_account)
FeedManager.instance.push(:mentions, mentioned_account, status)
end
end
......
......@@ -2,17 +2,13 @@ class PrecomputeFeedService < BaseService
# Fill up a user's home/mentions feed from DB and return a subset
# @param [Symbol] type :home or :mentions
# @param [Account] account
# @return [Array]
def call(type, account, limit)
def call(type, account)
instant_return = []
Status.send("as_#{type}_timeline", account).order('id desc').limit(FeedManager::MAX_ITEMS).find_each do |status|
Status.send("as_#{type}_timeline", account).limit(FeedManager::MAX_ITEMS).each do |status|
next if FeedManager.instance.filter?(type, status, account)
redis.zadd(FeedManager.instance.key(type, account.id), status.id, status.id)
instant_return << status unless instant_return.size > limit
redis.zadd(FeedManager.instance.key(type, account.id), status.id, status.reblog? ? status.reblog_of_id : status.id)
end
instant_return
end
private
......
class RegenerationWorker
include Sidekiq::Worker
def perform(account_id, timeline_type)
PrecomputeFeedService.new.call(timeline_type, Account.find(account_id))
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment