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:
parent
b8c65cc6cf
commit
8fc2b0124f
|
@ -6,24 +6,37 @@ module Jobs
|
|||
def execute(args)
|
||||
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")
|
||||
.where(last_posted_at: nil, trust_level: TrustLevel.levels[:newuser], admin: false)
|
||||
.where(
|
||||
"posts.user_id IS NULL AND users.last_seen_at < ?",
|
||||
SiteSetting.clean_up_inactive_users_after_days.days.ago
|
||||
)
|
||||
)
|
||||
.limit(1000)
|
||||
.pluck(:id).each do |id|
|
||||
begin
|
||||
user = User.find(id)
|
||||
destroyer.destroy(user, context: I18n.t("user.destroy_reasons.inactive_user"))
|
||||
rescue => e
|
||||
Discourse.handle_job_exception(e,
|
||||
message: "Cleaning up inactive users",
|
||||
extra: { user_id: id }
|
||||
)
|
||||
.pluck(:id).each_slice(50) do |slice|
|
||||
destroy(slice)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue