Add `tootctl feeds vacuum` (#33065)

This commit is contained in:
Claire 2024-11-29 15:08:57 +01:00
parent 3f0d90f019
commit 5532d1c2cb
1 changed files with 33 additions and 0 deletions

View File

@ -5,6 +5,7 @@ require_relative 'base'
module Mastodon::CLI module Mastodon::CLI
class Feeds < Base class Feeds < Base
include Redisable include Redisable
include DatabaseHelper
option :all, type: :boolean, default: false option :all, type: :boolean, default: false
option :concurrency, type: :numeric, default: 5, aliases: [:c] option :concurrency, type: :numeric, default: 5, aliases: [:c]
@ -44,6 +45,38 @@ module Mastodon::CLI
say('OK', :green) say('OK', :green)
end 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 private
def active_user_accounts def active_user_accounts