Class: Jobs::PeriodicalUpdates

Inherits:
Scheduled show all
Defined in:
app/jobs/scheduled/periodical_updates.rb

Overview

This job will run on a regular basis to update statistics and denormalized data. If it does not run, the site will not function properly.

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Scheduled

#perform

Methods inherited from Base

acquire_cluster_concurrency_lock!, clear_cluster_concurrency_lock!, cluster_concurrency, cluster_concurrency_redis_key, delayed_perform, #error_context, get_cluster_concurrency, #last_db_duration, #log, #perform, #perform_immediately

Class Method Details

.should_update_long_topics?Boolean

Returns:

  • (Boolean)


9
10
11
12
13
14
15
# File 'app/jobs/scheduled/periodical_updates.rb', line 9

def self.should_update_long_topics?
  @call_count ||= 0
  @call_count += 1

  # once every 6 hours
  (@call_count % 24) == 1
end

Instance Method Details

#execute(args = nil) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/jobs/scheduled/periodical_updates.rb', line 17

def execute(args = nil)
  # Feature topics in categories
  CategoryFeaturedTopic.feature_topics(batched: true)

  # Update the scores of posts
  args = { min_topic_age: 1.day.ago }
  args[:max_topic_length] = 500 unless self.class.should_update_long_topics?
  ScoreCalculator.new.calculate(args)

  # Forces rebake of old posts where needed, as long as no system avatars need updating
  if !SiteSetting.automatically_download_gravatars ||
       !UserAvatar.where("last_gravatar_download_attempt IS NULL").limit(1).first
    problems = Post.rebake_old(SiteSetting.rebake_old_posts_count, priority: :ultra_low)
    problems.each do |hash|
      post_id = hash[:post].id
      Discourse.handle_job_exception(
        hash[:ex],
        error_context(args, "Rebaking post id #{post_id}", post_id: post_id),
      )
    end
  end

  # rebake out of date user profiles
  problems = UserProfile.rebake_old(250)
  problems.each do |hash|
    user_id = hash[:profile].user_id
    Discourse.handle_job_exception(
      hash[:ex],
      error_context(args, "Rebaking user id #{user_id}", user_id: user_id),
    )
  end

  offset = (SiteSetting.max_new_topics).to_i
  last_new_topic = Topic.order("created_at desc").offset(offset).select(:created_at).first
  SiteSetting.min_new_topics_time = last_new_topic.created_at.to_i if last_new_topic

  Category.auto_bump_topic!

  nil
end