Fix AccountDeletionWorker crashing and clogging sidekiq queues (#15380)
* Fix account deletion workers being queued multiple times for a single account * Fix poll votes being unnecessarily instantiated on poll deletion * Fix favourites being unnecessarily instantiated on status deletion * Remove inaccurate comments * Delete polls instead of destroying them Co-authored-by: Claire <claire.github-309c@sitedethib.com>gh/stable
parent
9734c9b6fe
commit
7bf3c6e57b
|
@ -25,7 +25,7 @@ class Poll < ApplicationRecord
|
||||||
belongs_to :account
|
belongs_to :account
|
||||||
belongs_to :status
|
belongs_to :status
|
||||||
|
|
||||||
has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :destroy
|
has_many :votes, class_name: 'PollVote', inverse_of: :poll, dependent: :delete_all
|
||||||
|
|
||||||
has_many :notifications, as: :activity, dependent: :destroy
|
has_many :notifications, as: :activity, dependent: :destroy
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ class Status < ApplicationRecord
|
||||||
belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true
|
belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :replies, optional: true
|
||||||
belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true
|
belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblogs, optional: true
|
||||||
|
|
||||||
has_many :favourites, inverse_of: :status, dependent: :destroy
|
has_many :favourites, inverse_of: :status, dependent: :delete_all
|
||||||
has_many :bookmarks, inverse_of: :status, dependent: :destroy
|
has_many :bookmarks, inverse_of: :status, dependent: :destroy
|
||||||
has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy
|
has_many :reblogs, foreign_key: 'reblog_of_id', class_name: 'Status', inverse_of: :reblog, dependent: :destroy
|
||||||
has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread
|
has_many :replies, foreign_key: 'in_reply_to_id', class_name: 'Status', inverse_of: :thread
|
||||||
|
|
|
@ -4,8 +4,6 @@ class BatchedRemoveStatusService < BaseService
|
||||||
include Redisable
|
include Redisable
|
||||||
|
|
||||||
# Delete given statuses and reblogs of them
|
# Delete given statuses and reblogs of them
|
||||||
# Dispatch PuSH updates of the deleted statuses, but only local ones
|
|
||||||
# Dispatch Salmon deletes, unique per domain, of the deleted statuses, but only local ones
|
|
||||||
# Remove statuses from home feeds
|
# Remove statuses from home feeds
|
||||||
# Push delete events to streaming API for home feeds and public feeds
|
# Push delete events to streaming API for home feeds and public feeds
|
||||||
# @param [Enumerable<Status>] statuses A preferably batched array of statuses
|
# @param [Enumerable<Status>] statuses A preferably batched array of statuses
|
||||||
|
@ -19,7 +17,6 @@ class BatchedRemoveStatusService < BaseService
|
||||||
|
|
||||||
@json_payloads = statuses.each_with_object({}) { |s, h| h[s.id] = Oj.dump(event: :delete, payload: s.id.to_s) }
|
@json_payloads = statuses.each_with_object({}) { |s, h| h[s.id] = Oj.dump(event: :delete, payload: s.id.to_s) }
|
||||||
|
|
||||||
# Ensure that rendered XML reflects destroyed state
|
|
||||||
statuses.each do |status|
|
statuses.each do |status|
|
||||||
status.mark_for_mass_destruction!
|
status.mark_for_mass_destruction!
|
||||||
status.destroy
|
status.destroy
|
||||||
|
|
|
@ -122,7 +122,9 @@ class DeleteAccountService < BaseService
|
||||||
@account.polls.reorder(nil).find_each do |poll|
|
@account.polls.reorder(nil).find_each do |poll|
|
||||||
next if @options[:reserve_username] && reported_status_ids.include?(poll.status_id)
|
next if @options[:reserve_username] && reported_status_ids.include?(poll.status_id)
|
||||||
|
|
||||||
poll.destroy
|
# We can safely delete the poll rather than destroy it, as any non-reported
|
||||||
|
# status should have been deleted already
|
||||||
|
poll.delete
|
||||||
end
|
end
|
||||||
|
|
||||||
associations_for_destruction.each do |association_name|
|
associations_for_destruction.each do |association_name|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
class AccountDeletionWorker
|
class AccountDeletionWorker
|
||||||
include Sidekiq::Worker
|
include Sidekiq::Worker
|
||||||
|
|
||||||
sidekiq_options queue: 'pull'
|
sidekiq_options queue: 'pull', lock: :until_executed
|
||||||
|
|
||||||
def perform(account_id, options = {})
|
def perform(account_id, options = {})
|
||||||
reserve_username = options.with_indifferent_access.fetch(:reserve_username, true)
|
reserve_username = options.with_indifferent_access.fetch(:reserve_username, true)
|
||||||
|
|
Reference in New Issue