101 lines
3.0 KiB
Ruby
101 lines
3.0 KiB
Ruby
# typed: false
|
|
class Domain::Fa::UserEnqueuer
|
|
include HasBulkEnqueueJobs
|
|
include HasColorLogger
|
|
include HasMeasureDuration
|
|
include Domain::Fa::HasCountFailedInQueue
|
|
|
|
def initialize(start_at:, low_water_mark:, high_water_mark:)
|
|
@low_water_mark = low_water_mark
|
|
@high_water_mark = high_water_mark
|
|
raise if @high_water_mark <= @low_water_mark
|
|
@user_iterator =
|
|
Enumerator.new do |e|
|
|
Domain::Fa::User
|
|
.where("id >= ?", start_at)
|
|
.find_each { |user| e << user }
|
|
end
|
|
end
|
|
|
|
def run_once
|
|
already_enqueued = enqueued_count
|
|
if already_enqueued <= @low_water_mark
|
|
to_enqueue = @high_water_mark - already_enqueued
|
|
logger.info(
|
|
"enqueuing #{to_enqueue.to_s.bold} more users - #{already_enqueued.to_s.bold} already enqueued",
|
|
)
|
|
rows =
|
|
measure(
|
|
proc do |p|
|
|
p && "gathered #{p.length.to_s.bold} users to enqueue" ||
|
|
"gathering users..."
|
|
end,
|
|
) { to_enqueue.times.map { @user_iterator.next } }
|
|
measure("enqueue jobs") do
|
|
rows.each do |user|
|
|
types = []
|
|
if user.state == "ok"
|
|
if user.due_for_favs_scan? || user.due_for_page_scan? ||
|
|
user.due_for_follows_scan?
|
|
Domain::Fa::Job::UserIncrementalJob.perform_later({ user: user })
|
|
types << "incremental"
|
|
end
|
|
|
|
if user.due_for_favs_scan?
|
|
Domain::Fa::Job::FavsJob.perform_later({ user: user })
|
|
types << "favs"
|
|
end
|
|
if user.due_for_page_scan?
|
|
Domain::Fa::Job::UserPageJob.perform_later({ user: user })
|
|
types << "page"
|
|
end
|
|
|
|
if user.due_for_gallery_scan?
|
|
Domain::Fa::Job::UserGalleryJob.perform_later({ user: user })
|
|
types << "gallery"
|
|
end
|
|
if user.due_for_follows_scan?
|
|
Domain::Fa::Job::UserFollowsJob.perform_later({ user: user })
|
|
types << "follows"
|
|
end
|
|
end
|
|
|
|
avatar = user.ensure_avatar!
|
|
if avatar.file.nil? && avatar.state == "ok"
|
|
Domain::Fa::Job::UserAvatarJob.perform_later({ user: user })
|
|
types << "avatar"
|
|
end
|
|
|
|
types = types.map { |t| t.bold }.join("|")
|
|
logger.info "#{types} - #{user.url_name.bold} - #{user.id.to_s.bold}"
|
|
end
|
|
end
|
|
throw StopIteration if rows.empty?
|
|
else
|
|
logger.info(
|
|
"#{already_enqueued.to_s.bold} already enqueued (max #{@high_water_mark.to_s.bold}) - " +
|
|
"waiting to fall below #{@low_water_mark.to_s.bold}",
|
|
)
|
|
:sleep
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def enqueued_count
|
|
if Rails.env.test?
|
|
return SpecUtil.enqueued_jobs(Domain::Fa::Job::UserFollowsJob).count
|
|
end
|
|
|
|
%w[
|
|
fa_post
|
|
fa_user_avatar
|
|
fa_user_favs
|
|
fa_user_follows
|
|
fa_user_gallery
|
|
fa_user_page
|
|
static_file
|
|
].map { |queue_name| count_failed_in_queue(queue_name) }.max
|
|
end
|
|
end
|