PERF: destroy users in batches of 50 users

This speeds up the process as we no longer need to commit a transaction
per user deleted
This commit is contained in:
Sam Saffron 2019-04-26 22:51:33 +10:00
parent b8c65cc6cf
commit 8fc2b0124f
1 changed files with 25 additions and 12 deletions

View File

@ -6,24 +6,37 @@ module Jobs
def execute(args) def execute(args)
return if SiteSetting.clean_up_inactive_users_after_days <= 0 return if SiteSetting.clean_up_inactive_users_after_days <= 0
destroyer = UserDestroyer.new(Discourse.system_user)
User.joins("LEFT JOIN posts ON posts.user_id = users.id") User.joins("LEFT JOIN posts ON posts.user_id = users.id")
.where(last_posted_at: nil, trust_level: TrustLevel.levels[:newuser], admin: false) .where(last_posted_at: nil, trust_level: TrustLevel.levels[:newuser], admin: false)
.where( .where(
"posts.user_id IS NULL AND users.last_seen_at < ?", "posts.user_id IS NULL AND users.last_seen_at < ?",
SiteSetting.clean_up_inactive_users_after_days.days.ago SiteSetting.clean_up_inactive_users_after_days.days.ago
) )
.limit(1000) .limit(1000)
.pluck(:id).each do |id| .pluck(:id).each_slice(50) do |slice|
begin destroy(slice)
user = User.find(id) end
destroyer.destroy(user, context: I18n.t("user.destroy_reasons.inactive_user"))
rescue => e end
Discourse.handle_job_exception(e,
message: "Cleaning up inactive users", private
extra: { user_id: id }
) def destroy(ids)
destroyer = UserDestroyer.new(Discourse.system_user)
User.transaction do
ids.each do |id|
begin
user = User.find(id)
destroyer.destroy(user, transaction: false, context: I18n.t("user.destroy_reasons.inactive_user"))
rescue => e
Discourse.handle_job_exception(e,
message: "Cleaning up inactive users",
extra: { user_id: id }
)
raise e
end
end end
end end
end end