REFACTOR: Move queue_jobs out of SiteSetting

It is not a setting, and only relevant in specs. The new API is:

```
Jobs.run_later!        # jobs will be thrown on the queue
Jobs.run_immediately!  # jobs will run right away, avoid the queue
```
This commit is contained in:
Robin Ward 2019-03-14 10:47:38 -04:00
parent f3c76ad482
commit fa5a158683
40 changed files with 75 additions and 72 deletions

View File

@ -4,6 +4,22 @@ module Jobs
Sidekiq::Stats.new.enqueued Sidekiq::Stats.new.enqueued
end end
def self.run_later?
!@run_immediately
end
def self.run_immediately?
!!@run_immediately
end
def self.run_immediately!
@run_immediately = true
end
def self.run_later!
@run_immediately = false
end
def self.last_job_performed_at def self.last_job_performed_at
Sidekiq.redis do |r| Sidekiq.redis do |r|
int = r.get('last_job_perform_at') int = r.get('last_job_perform_at')
@ -169,7 +185,7 @@ module Jobs
def perform(*args) def perform(*args)
opts = args.extract_options!.with_indifferent_access opts = args.extract_options!.with_indifferent_access
if SiteSetting.queue_jobs? if Jobs.run_later?
Sidekiq.redis do |r| Sidekiq.redis do |r|
r.set('last_job_perform_at', Time.now.to_i) r.set('last_job_perform_at', Time.now.to_i)
end end
@ -272,7 +288,7 @@ module Jobs
end end
# If we are able to queue a job, do it # If we are able to queue a job, do it
if SiteSetting.queue_jobs? if Jobs.run_later?
hash = { hash = {
'class' => klass, 'class' => klass,
'args' => [opts] 'args' => [opts]

View File

@ -63,14 +63,12 @@ Discourse::Application.configure do
s.set_regardless_of_locale(:crawl_images, false) s.set_regardless_of_locale(:crawl_images, false)
s.set_regardless_of_locale(:download_remote_images_to_local, false) s.set_regardless_of_locale(:download_remote_images_to_local, false)
s.set_regardless_of_locale(:unique_posts_mins, 0) s.set_regardless_of_locale(:unique_posts_mins, 0)
# Running jobs are expensive and most of our tests are not concern with
# code that runs inside jobs
s.set_regardless_of_locale(:queue_jobs, true)
# disable plugins # disable plugins
if ENV['LOAD_PLUGINS'] == '1' if ENV['LOAD_PLUGINS'] == '1'
s.set_regardless_of_locale(:discourse_narrative_bot_enabled, false) s.set_regardless_of_locale(:discourse_narrative_bot_enabled, false)
end end
end end
SiteSetting.refresh! SiteSetting.refresh!
end end
end end

View File

@ -1395,9 +1395,6 @@ developer:
port: port:
hidden: true hidden: true
default: "" default: ""
queue_jobs:
hidden: true
default: true
enable_long_polling: enable_long_polling:
client: true client: true
default: true default: true

View File

@ -2,7 +2,7 @@ require 'rails_helper'
describe <%= name %>::ActionsController do describe <%= name %>::ActionsController do
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
it 'can list' do it 'can list' do

View File

@ -3,7 +3,7 @@ require 'rails_helper'
describe Post do describe Post do
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
describe '#local_dates' do describe '#local_dates' do

View File

@ -22,7 +22,7 @@ RSpec.describe DiscourseNarrativeBot::AdvancedUserNarrative do
let(:reset_trigger) { DiscourseNarrativeBot::TrackSelector.reset_trigger } let(:reset_trigger) { DiscourseNarrativeBot::TrackSelector.reset_trigger }
before do before do
run_jobs_synchronously! Jobs.run_immediately!
SiteSetting.discourse_narrative_bot_enabled = true SiteSetting.discourse_narrative_bot_enabled = true
end end

View File

@ -25,7 +25,7 @@ describe DiscourseNarrativeBot::NewUserNarrative do
let(:reset_trigger) { DiscourseNarrativeBot::TrackSelector.reset_trigger } let(:reset_trigger) { DiscourseNarrativeBot::TrackSelector.reset_trigger }
before do before do
run_jobs_synchronously! Jobs.run_immediately!
SiteSetting.discourse_narrative_bot_enabled = true SiteSetting.discourse_narrative_bot_enabled = true
end end

View File

@ -37,7 +37,7 @@ describe DiscourseNarrativeBot::TrackSelector do
end end
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
describe '#select' do describe '#select' do

View File

@ -13,7 +13,7 @@ describe User do
end end
before do before do
run_jobs_synchronously! Jobs.run_immediately!
SiteSetting.discourse_narrative_bot_enabled = true SiteSetting.discourse_narrative_bot_enabled = true
end end

View File

@ -55,7 +55,7 @@ end
require File.expand_path(File.dirname(__FILE__) + "/../config/environment") require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
SiteSetting.queue_jobs = false Jobs.run_immediately!
unless Rails.env == "profile" unless Rails.env == "profile"
puts "This script should only be used in the profile environment" puts "This script should only be used in the profile environment"

View File

@ -902,7 +902,7 @@ describe PostCreator do
end end
it 'can post to a group correctly' do it 'can post to a group correctly' do
run_jobs_synchronously! Jobs.run_immediately!
expect(post.topic.archetype).to eq(Archetype.private_message) expect(post.topic.archetype).to eq(Archetype.private_message)
expect(post.topic.topic_allowed_users.count).to eq(1) expect(post.topic.topic_allowed_users.count).to eq(1)

View File

@ -617,7 +617,7 @@ describe PostDestroyer do
context '@mentions' do context '@mentions' do
it 'removes notifications when deleted' do it 'removes notifications when deleted' do
run_jobs_synchronously! Jobs.run_immediately!
user = Fabricate(:evil_trout) user = Fabricate(:evil_trout)
post = create_post(raw: 'Hello @eviltrout') post = create_post(raw: 'Hello @eviltrout')
expect { expect {

View File

@ -608,7 +608,7 @@ describe PostRevisor do
let(:mentioned_user) { Fabricate(:user) } let(:mentioned_user) { Fabricate(:user) }
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
it "generates a notification for a mention" do it "generates a notification for a mention" do

View File

@ -163,7 +163,7 @@ describe WatchedWord do
end end
it "flags on revisions" do it "flags on revisions" do
run_jobs_synchronously! Jobs.run_immediately!
post = Fabricate(:post, topic: Fabricate(:topic, user: tl2_user), user: tl2_user) post = Fabricate(:post, topic: Fabricate(:topic, user: tl2_user), user: tl2_user)
expect { expect {
PostRevisor.new(post).revise!(post.user, { raw: "Want some #{flag_word.word} for cheap?" }, revised_at: post.updated_at + 10.seconds) PostRevisor.new(post).revise!(post.user, { raw: "Want some #{flag_word.word} for cheap?" }, revised_at: post.updated_at + 10.seconds)

View File

@ -5,9 +5,9 @@ describe Jobs do
describe 'enqueue' do describe 'enqueue' do
describe 'when queue_jobs is true' do describe 'run_later!' do
before do before do
SiteSetting.expects(:queue_jobs?).at_least_once.returns(true) Jobs.run_later!
end end
it 'enqueues a job in sidekiq' do it 'enqueues a job in sidekiq' do
@ -74,9 +74,9 @@ describe Jobs do
end end
end end
describe 'when queue_jobs is false' do describe 'run_immediately!' do
before do before do
SiteSetting.expects(:queue_jobs?).at_least_once.returns(false) Jobs.run_immediately!
end end
it "doesn't enqueue in sidekiq" do it "doesn't enqueue in sidekiq" do

View File

@ -32,7 +32,7 @@ describe Jobs::PullHotlinkedImages do
describe '#execute' do describe '#execute' do
before do before do
run_jobs_synchronously! Jobs.run_immediately!
FastImage.expects(:size).returns([100, 100]).at_least_once FastImage.expects(:size).returns([100, 100]).at_least_once
end end
@ -72,7 +72,6 @@ describe Jobs::PullHotlinkedImages do
let(:api_url) { "https://en.wikipedia.org/w/api.php?action=query&titles=#{media}&prop=imageinfo&iilimit=50&iiprop=timestamp|user|url&iiurlwidth=500&format=json" } let(:api_url) { "https://en.wikipedia.org/w/api.php?action=query&titles=#{media}&prop=imageinfo&iilimit=50&iiprop=timestamp|user|url&iiurlwidth=500&format=json" }
before do before do
SiteSetting.queue_jobs = true
stub_request(:head, url) stub_request(:head, url)
stub_request(:get, url).to_return(body: '') stub_request(:get, url).to_return(body: '')
stub_request(:get, api_url).to_return(body: "{ stub_request(:get, api_url).to_return(body: "{

View File

@ -31,7 +31,7 @@ RSpec.describe UploadRecovery do
before do before do
SiteSetting.authorized_extensions = 'png|pdf' SiteSetting.authorized_extensions = 'png|pdf'
run_jobs_synchronously! Jobs.run_immediately!
end end
after do after do

View File

@ -68,7 +68,7 @@ describe CategoryUser do
context 'integration' do context 'integration' do
before do before do
run_jobs_synchronously! Jobs.run_immediately!
NotificationEmailer.enable NotificationEmailer.enable
end end

View File

@ -8,7 +8,7 @@ describe DiscourseSingleSignOn do
SiteSetting.sso_url = @sso_url SiteSetting.sso_url = @sso_url
SiteSetting.enable_sso = true SiteSetting.enable_sso = true
SiteSetting.sso_secret = @sso_secret SiteSetting.sso_secret = @sso_secret
run_jobs_synchronously! Jobs.run_immediately!
end end
def make_sso def make_sso

View File

@ -1072,7 +1072,7 @@ describe PostAction do
end end
it "should create a notification in the related topic" do it "should create a notification in the related topic" do
run_jobs_synchronously! Jobs.run_immediately!
post = Fabricate(:post) post = Fabricate(:post)
user = Fabricate(:user) user = Fabricate(:user)
action = PostAction.act(user, post, PostActionType.types[:spam], message: "WAT") action = PostAction.act(user, post, PostActionType.types[:spam], message: "WAT")
@ -1089,7 +1089,7 @@ describe PostAction do
end end
it "should not add a moderator post when post is flagged via private message" do it "should not add a moderator post when post is flagged via private message" do
run_jobs_synchronously! Jobs.run_immediately!
post = Fabricate(:post) post = Fabricate(:post)
user = Fabricate(:user) user = Fabricate(:user)
action = PostAction.act(user, post, PostActionType.types[:notify_user], message: "WAT") action = PostAction.act(user, post, PostActionType.types[:notify_user], message: "WAT")

View File

@ -41,7 +41,7 @@ describe PostMover do
before do before do
SiteSetting.tagging_enabled = true SiteSetting.tagging_enabled = true
run_jobs_synchronously! Jobs.run_immediately!
p1.replies << p3 p1.replies << p3
p2.replies << p4 p2.replies << p4
UserActionCreator.enable UserActionCreator.enable
@ -570,7 +570,7 @@ describe PostMover do
before do before do
SiteSetting.tagging_enabled = true SiteSetting.tagging_enabled = true
run_jobs_synchronously! Jobs.run_immediately!
p1.replies << p3 p1.replies << p3
p2.replies << p4 p2.replies << p4
UserActionCreator.enable UserActionCreator.enable

View File

@ -995,7 +995,7 @@ describe Post do
end end
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
describe 'when user can not mention a group' do describe 'when user can not mention a group' do

View File

@ -2,7 +2,7 @@ require 'rails_helper'
describe QuotedPost do describe QuotedPost do
it 'correctly extracts quotes' do it 'correctly extracts quotes' do
run_jobs_synchronously! Jobs.run_immediately!
topic = Fabricate(:topic) topic = Fabricate(:topic)
post1 = create_post(topic: topic, post_number: 1, raw: "foo bar") post1 = create_post(topic: topic, post_number: 1, raw: "foo bar")
@ -34,7 +34,7 @@ describe QuotedPost do
end end
it "doesn't count quotes from the same post" do it "doesn't count quotes from the same post" do
run_jobs_synchronously! Jobs.run_immediately!
topic = Fabricate(:topic) topic = Fabricate(:topic)
post = create_post(topic: topic, post_number: 1, raw: "foo bar") post = create_post(topic: topic, post_number: 1, raw: "foo bar")

View File

@ -75,7 +75,7 @@ describe TagUser do
context "with some tag notification settings" do context "with some tag notification settings" do
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
let :watched_post do let :watched_post do

View File

@ -1280,7 +1280,7 @@ describe Topic do
describe 'user that is watching the new category' do describe 'user that is watching the new category' do
it 'should generate the notification for the topic' do it 'should generate the notification for the topic' do
run_jobs_synchronously! Jobs.run_immediately!
topic.posts << Fabricate(:post) topic.posts << Fabricate(:post)
@ -1602,7 +1602,7 @@ describe Topic do
let(:topic) { Fabricate(:topic, category: category) } let(:topic) { Fabricate(:topic, category: category) }
it "should be able to override category's default auto close" do it "should be able to override category's default auto close" do
run_jobs_synchronously! Jobs.run_immediately!
expect(topic.topic_timers.first.duration).to eq(4) expect(topic.topic_timers.first.duration).to eq(4)

View File

@ -190,7 +190,7 @@ RSpec.describe TopicTimer, type: :model do
end end
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
it 'should close the topic' do it 'should close the topic' do
@ -219,7 +219,7 @@ RSpec.describe TopicTimer, type: :model do
end end
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
it 'should open the topic' do it 'should open the topic' do

View File

@ -451,7 +451,7 @@ describe TopicUser do
it "will receive email notification for every topic" do it "will receive email notification for every topic" do
user1 = Fabricate(:user) user1 = Fabricate(:user)
run_jobs_synchronously! Jobs.run_immediately!
SiteSetting.default_email_mailing_list_mode = true SiteSetting.default_email_mailing_list_mode = true
SiteSetting.default_email_mailing_list_mode_frequency = 1 SiteSetting.default_email_mailing_list_mode_frequency = 1

View File

@ -1088,7 +1088,7 @@ describe User do
context "with a reply" do context "with a reply" do
before do before do
run_jobs_synchronously! Jobs.run_immediately!
PostCreator.new(Fabricate(:user), PostCreator.new(Fabricate(:user),
raw: 'whatever this is a raw post', raw: 'whatever this is a raw post',
topic_id: topic.id, topic_id: topic.id,

View File

@ -176,6 +176,11 @@ RSpec.configure do |config|
$test_cleanup_callbacks.reverse_each(&:call) $test_cleanup_callbacks.reverse_each(&:call)
$test_cleanup_callbacks = nil $test_cleanup_callbacks = nil
end end
# Running jobs are expensive and most of our tests are not concern with
# code that runs inside jobs. run_later! means they are put on the redis
# queue and never processed.
Jobs.run_later!
end end
config.before(:each, type: :multisite) do config.before(:each, type: :multisite) do

View File

@ -37,7 +37,7 @@ RSpec.describe Admin::FlagsController do
context '#agree' do context '#agree' do
it 'should raise a reasonable error if a flag was deferred and then someone else agreed' do it 'should raise a reasonable error if a flag was deferred and then someone else agreed' do
run_jobs_synchronously! Jobs.run_immediately!
_post_action = PostAction.act(user, post_1, PostActionType.types[:spam], message: 'bad') _post_action = PostAction.act(user, post_1, PostActionType.types[:spam], message: 'bad')
@ -52,7 +52,7 @@ RSpec.describe Admin::FlagsController do
end end
it 'should be able to agree and keep content' do it 'should be able to agree and keep content' do
run_jobs_synchronously! Jobs.run_immediately!
post_action = PostAction.act(user, post_1, PostActionType.types[:spam], message: 'bad') post_action = PostAction.act(user, post_1, PostActionType.types[:spam], message: 'bad')
@ -69,7 +69,7 @@ RSpec.describe Admin::FlagsController do
it 'should be able to hide spam' do it 'should be able to hide spam' do
SiteSetting.allow_user_locale = true SiteSetting.allow_user_locale = true
run_jobs_synchronously! Jobs.run_immediately!
post_action = PostAction.act(user, post_1, PostActionType.types[:spam], message: 'bad') post_action = PostAction.act(user, post_1, PostActionType.types[:spam], message: 'bad')
admin.update!(locale: 'ja') admin.update!(locale: 'ja')
@ -90,7 +90,7 @@ RSpec.describe Admin::FlagsController do
end end
it 'should not delete category topic' do it 'should not delete category topic' do
run_jobs_synchronously! Jobs.run_immediately!
category.update_column(:topic_id, first_post.topic_id) category.update_column(:topic_id, first_post.topic_id)
PostAction.act(user, first_post, PostActionType.types[:spam], message: 'bad') PostAction.act(user, first_post, PostActionType.types[:spam], message: 'bad')

View File

@ -78,7 +78,7 @@ RSpec.describe Admin::GroupsController do
let(:user2) { Fabricate(:user, trust_level: 4) } let(:user2) { Fabricate(:user, trust_level: 4) }
it "can assign users to a group by email or username" do it "can assign users to a group by email or username" do
run_jobs_synchronously! Jobs.run_immediately!
put "/admin/groups/bulk.json", params: { put "/admin/groups/bulk.json", params: {
group_id: group.id, users: [user.username.upcase, user2.email, 'doesnt_exist'] group_id: group.id, users: [user.username.upcase, user2.email, 'doesnt_exist']

View File

@ -78,7 +78,7 @@ describe CategoriesController do
describe "logged in" do describe "logged in" do
before do before do
run_jobs_synchronously! Jobs.run_immediately!
sign_in(admin) sign_in(admin)
end end
@ -226,7 +226,7 @@ describe CategoriesController do
context '#update' do context '#update' do
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
it "requires the user to be logged in" do it "requires the user to be logged in" do

View File

@ -74,7 +74,7 @@ describe EmbedController do
let(:headers) { { 'REFERER' => embed_url } } let(:headers) { { 'REFERER' => embed_url } }
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
it "raises an error with no referer" do it "raises an error with no referer" do

View File

@ -298,10 +298,6 @@ describe InvitesController do
end end
context '.post_process_invite' do context '.post_process_invite' do
before do
SiteSetting.queue_jobs = true
end
it 'sends a welcome message if set' do it 'sends a welcome message if set' do
user.send_welcome_message = true user.send_welcome_message = true
put "/invites/show/#{invite.invite_key}.json" put "/invites/show/#{invite.invite_key}.json"
@ -466,7 +462,6 @@ describe InvitesController do
end end
it "resends the invite" do it "resends the invite" do
SiteSetting.queue_jobs = true
post "/invites/reinvite.json", params: { email: invite.email } post "/invites/reinvite.json", params: { email: invite.email }
expect(response.status).to eq(200) expect(response.status).to eq(200)
expect(Jobs::InviteEmail.jobs.size).to eq(1) expect(Jobs::InviteEmail.jobs.size).to eq(1)
@ -496,7 +491,6 @@ describe InvitesController do
end end
it "allows admin to bulk invite" do it "allows admin to bulk invite" do
SiteSetting.queue_jobs = true
sign_in(Fabricate(:admin)) sign_in(Fabricate(:admin))
post "/invites/upload_csv.json", params: { file: file, name: filename } post "/invites/upload_csv.json", params: { file: file, name: filename }
expect(response.status).to eq(200) expect(response.status).to eq(200)

View File

@ -730,7 +730,7 @@ describe PostsController do
end end
it 'allows to create posts in import_mode' do it 'allows to create posts in import_mode' do
run_jobs_synchronously! Jobs.run_immediately!
NotificationEmailer.enable NotificationEmailer.enable
post_1 = Fabricate(:post) post_1 = Fabricate(:post)
user = Fabricate(:user) user = Fabricate(:user)

View File

@ -4,7 +4,7 @@ RSpec.describe GroupMentionsUpdater do
let(:post) { Fabricate(:post) } let(:post) { Fabricate(:post) }
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
describe '.update' do describe '.update' do

View File

@ -213,7 +213,7 @@ describe PostAlerter do
let(:linking_post) { create_post(raw: "my magic topic\n##{Discourse.base_url}#{post1.url}") } let(:linking_post) { create_post(raw: "my magic topic\n##{Discourse.base_url}#{post1.url}") }
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
it "will notify correctly on linking" do it "will notify correctly on linking" do
@ -289,7 +289,7 @@ describe PostAlerter do
let(:topic) { mention_post.topic } let(:topic) { mention_post.topic }
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
it 'notifies a user' do it 'notifies a user' do
@ -591,7 +591,7 @@ describe PostAlerter do
end end
it "correctly pushes notifications if configured correctly" do it "correctly pushes notifications if configured correctly" do
run_jobs_synchronously! Jobs.run_immediately!
SiteSetting.allowed_user_api_push_urls = "https://site.com/push|https://site2.com/push" SiteSetting.allowed_user_api_push_urls = "https://site.com/push|https://site2.com/push"
2.times do |i| 2.times do |i|
@ -935,7 +935,7 @@ describe PostAlerter do
before do before do
SiteSetting.tagging_enabled = true SiteSetting.tagging_enabled = true
SiteSetting.queue_jobs = false Jobs.run_immediately!
end end
it "triggers a notification" do it "triggers a notification" do

View File

@ -136,7 +136,7 @@ describe UserAnonymizer do
end end
it "updates the avatar in posts" do it "updates the avatar in posts" do
run_jobs_synchronously! Jobs.run_immediately!
upload = Fabricate(:upload, user: user) upload = Fabricate(:upload, user: user)
user.user_avatar = UserAvatar.new(user_id: user.id, custom_upload_id: upload.id) user.user_avatar = UserAvatar.new(user_id: user.id, custom_upload_id: upload.id)
user.uploaded_avatar_id = upload.id # chosen in user preferences user.uploaded_avatar_id = upload.id # chosen in user preferences
@ -214,7 +214,7 @@ describe UserAnonymizer do
context "executes job" do context "executes job" do
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
it "removes invites" do it "removes invites" do
@ -302,7 +302,7 @@ describe UserAnonymizer do
end end
it "exhaustively replaces all user ips" do it "exhaustively replaces all user ips" do
run_jobs_synchronously! Jobs.run_immediately!
link = IncomingLink.create!(current_user_id: user.id, ip_address: old_ip, post_id: post.id) link = IncomingLink.create!(current_user_id: user.id, ip_address: old_ip, post_id: post.id)
screened_email = ScreenedEmail.create!(email: user.email, ip_address: old_ip) screened_email = ScreenedEmail.create!(email: user.email, ip_address: old_ip)

View File

@ -2,7 +2,7 @@ require 'rails_helper'
describe UsernameChanger do describe UsernameChanger do
before do before do
run_jobs_synchronously! Jobs.run_immediately!
end end
describe '#change' do describe '#change' do

View File

@ -5,12 +5,6 @@ module Helpers
@next_seq = (@next_seq || 0) + 1 @next_seq = (@next_seq || 0) + 1
end end
# If you don't `queue_jobs` it means you want to run them synchronously. This method
# makes that more clear in tests. It is automatically reset after every test.
def run_jobs_synchronously!
SiteSetting.queue_jobs = false
end
def log_in(fabricator = nil) def log_in(fabricator = nil)
user = Fabricate(fabricator || :user) user = Fabricate(fabricator || :user)
log_in_user(user) log_in_user(user)