Encapsulate redis key usage (#34840)

This commit is contained in:
David Roetzel 2025-05-28 14:34:37 +02:00 committed by GitHub
parent a73ade526a
commit b195956ecb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 54 additions and 4 deletions

View file

@ -9,4 +9,12 @@ class HomeFeed < Feed
def regenerating?
redis.exists?("account:#{@account.id}:regeneration")
end
def regeneration_in_progress!
redis.set("account:#{@account.id}:regeneration", true, nx: true, ex: 1.day.seconds)
end
def regeneration_finished!
redis.del("account:#{@account.id}:regeneration")
end
end

View file

@ -531,7 +531,11 @@ class User < ApplicationRecord
end
def regenerate_feed!
RegenerationWorker.perform_async(account_id) if redis.set("account:#{account_id}:regeneration", true, nx: true, ex: 1.day.seconds)
home_feed = HomeFeed.new(account)
unless home_feed.regenerating?
home_feed.regeneration_in_progress!
RegenerationWorker.perform_async(account_id)
end
end
def needs_feed_update?

View file

@ -46,7 +46,7 @@ class FollowService < BaseService
private
def mark_home_feed_as_partial!
redis.set("account:#{@source_account.id}:regeneration", true, nx: true, ex: 1.day.seconds)
HomeFeed.new(@source_account).regeneration_in_progress!
end
def following_not_possible?

View file

@ -12,7 +12,7 @@ class PrecomputeFeedService < BaseService
FeedManager.instance.populate_list(list) unless skip_timeline?(:list, list.id)
end
ensure
redis.del("account:#{account.id}:regeneration")
HomeFeed.new(account).regeneration_finished!
end
private

View file

@ -31,7 +31,7 @@ class MergeWorker
FeedManager.instance.merge_into_home(@from_account, @into_account)
end
ensure
redis.del("account:#{into_account_id}:regeneration")
HomeFeed.new(@into_account).regeneration_finished!
end
def merge_into_list!(into_list_id)

View file

@ -42,4 +42,42 @@ RSpec.describe HomeFeed do
end
end
end
describe '#regenerating?' do
context 'when feed is being generated' do
before do
redis.set("account:#{account.id}:regeneration", true)
end
it 'returns `true`' do
expect(subject.regenerating?).to be true
end
end
context 'when feed is not being generated' do
it 'returns `false`' do
expect(subject.regenerating?).to be false
end
end
end
describe '#regeneration_in_progress!' do
it 'sets the corresponding key in redis' do
expect(redis.exists?("account:#{account.id}:regeneration")).to be false
subject.regeneration_in_progress!
expect(redis.exists?("account:#{account.id}:regeneration")).to be true
end
end
describe '#regeneration_finished!' do
it 'removes the corresponding key from redis' do
redis.set("account:#{account.id}:regeneration", true)
subject.regeneration_finished!
expect(redis.exists?("account:#{account.id}:regeneration")).to be false
end
end
end