Skip to content

Commit

Permalink
Add tootctl feeds vacuum (mastodon#33065)
Browse files Browse the repository at this point in the history
  • Loading branch information
ClearlyClaire authored Nov 29, 2024
1 parent 9ff0140 commit c58967c
Showing 1 changed file with 33 additions and 0 deletions.
33 changes: 33 additions & 0 deletions lib/mastodon/cli/feeds.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
module Mastodon::CLI
class Feeds < Base
include Redisable
include DatabaseHelper

option :all, type: :boolean, default: false
option :concurrency, type: :numeric, default: 5, aliases: [:c]
Expand Down Expand Up @@ -44,6 +45,38 @@ def clear
say('OK', :green)
end

desc 'vacuum', 'Remove home feeds of inactive users from Redis'
long_desc <<-LONG_DESC
Running this task should not be needed in most cases, as Mastodon will
automatically clean up feeds from inactive accounts every day.
However, this task is more aggressive in order to clean up feeds that
may have been missed because of bugs or database mishaps.
LONG_DESC
def vacuum
with_read_replica do
say('Deleting orphaned home feeds…')
redis.scan_each(match: 'feed:home:*').each_slice(1000) do |keys|
ids = keys.map { |key| key.split(':')[2] }.compact_blank

known_ids = User.confirmed.signed_in_recently.where(account_id: ids).pluck(:account_id)

keys_to_delete = keys.filter { |key| known_ids.exclude?(key.split(':')[2]&.to_i) }
redis.del(keys_to_delete)
end

say('Deleting orphaned list feeds…')
redis.scan_each(match: 'feed:list:*').each_slice(1000) do |keys|
ids = keys.map { |key| key.split(':')[2] }.compact_blank

known_ids = List.where(account_id: User.confirmed.signed_in_recently.select(:account_id)).where(id: ids).pluck(:id)

keys_to_delete = keys.filter { |key| known_ids.exclude?(key.split(':')[2]&.to_i) }
redis.del(keys_to_delete)
end
end
end

private

def active_user_accounts
Expand Down

0 comments on commit c58967c

Please sign in to comment.