summaryrefslogtreecommitdiffstats
path: root/app
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2021-05-04 04:45:08 +0200
committerGitHub <noreply@github.com>2021-05-04 04:45:08 +0200
commitfab65848d2eb8065ef3e49aaca4e4fb33f94f2b1 (patch)
tree1f6d597465d8f5e6e73aa7f3543339a36891eac3 /app
parent8c44b723bb7505eb5923019b454ce9abd7ea59c0 (diff)
Fix empty home feed before first follow has finished processing (#16152)
Change queue of merge worker from pull to default
Diffstat (limited to 'app')
-rw-r--r--app/models/concerns/account_interactions.rb8
-rw-r--r--app/models/user.rb4
-rw-r--r--app/services/follow_service.rb9
-rw-r--r--app/workers/merge_worker.rb4
4 files changed, 20 insertions, 5 deletions
diff --git a/app/models/concerns/account_interactions.rb b/app/models/concerns/account_interactions.rb
index 51e8e04a80d..958f6c78e2a 100644
--- a/app/models/concerns/account_interactions.rb
+++ b/app/models/concerns/account_interactions.rb
@@ -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
diff --git a/app/models/user.rb b/app/models/user.rb
index 5a149f573ed..0440627c598 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -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?
diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb
index d3db07a743b..329262cca08 100644
--- a/app/services/follow_service.rb
+++ b/app/services/follow_service.rb
@@ -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
diff --git a/app/workers/merge_worker.rb b/app/workers/merge_worker.rb
index 74ef7d4daa7..6ebb9a40035 100644
--- a/app/workers/merge_worker.rb
+++ b/app/workers/merge_worker.rb
@@ -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