mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 04:31:56 +08:00
4fce6484fe
Databases can have a lot of user actions, self joining and running an aggregate on millions of rows can be very costly This optimisation will reduce the regular window of consistency down to 13 hours, this ensures the job runs much faster
66 lines
1.3 KiB
Ruby
66 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Jobs
|
|
# various consistency checks
|
|
class EnsureDbConsistency < Jobs::Scheduled
|
|
every 12.hours
|
|
|
|
def execute(args)
|
|
start_measure
|
|
|
|
[
|
|
UserVisit,
|
|
Group,
|
|
Notification,
|
|
TopicFeaturedUsers,
|
|
PostRevision,
|
|
Topic,
|
|
Badge,
|
|
CategoryUser,
|
|
UserOption,
|
|
Tag,
|
|
CategoryTagStat,
|
|
User,
|
|
UserAvatar,
|
|
Category
|
|
].each do |klass|
|
|
klass.ensure_consistency!
|
|
measure(klass)
|
|
end
|
|
|
|
UserAction.ensure_consistency!(13.hours.ago)
|
|
measure(UserAction)
|
|
|
|
UserStat.ensure_consistency!(13.hours.ago)
|
|
measure(UserStat)
|
|
|
|
Rails.logger.debug(format_measure)
|
|
nil
|
|
end
|
|
|
|
private
|
|
|
|
def format_measure
|
|
result = +"EnsureDbConsitency Times\n"
|
|
result << @measure_times.map do |name, duration|
|
|
" #{name}: #{duration}"
|
|
end.join("\n")
|
|
result
|
|
end
|
|
|
|
def start_measure
|
|
@measure_times = []
|
|
@measure_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
end
|
|
|
|
def measure(step = nil)
|
|
@measure_now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
if @measure_start
|
|
@measure_times << [step, @measure_now - @measure_start]
|
|
end
|
|
@measure_start = @measure_now
|
|
end
|
|
|
|
end
|
|
end
|