DEV: TopicTrackingState calls should happen in the background (#11682)

DEV: TopicTrackingState calls should happen in the background (#11682)

  • DEV: TopicTrackingState calls should happen in the background

It was observed that calling TopicTrackingState on popular topics could result in a large number of calls to redis, resulting in slow response times when posting replies.

These calls should be moved to a background job.

  • DEV: PostUpdateTopicTrackingState should execute on default queue
diff --git a/app/jobs/regular/post_update_topic_tracking_state.rb b/app/jobs/regular/post_update_topic_tracking_state.rb
new file mode 100644
index 0000000..c68a67b
--- /dev/null
+++ b/app/jobs/regular/post_update_topic_tracking_state.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+module Jobs
+  class PostUpdateTopicTrackingState < ::Jobs::Base
+
+    def execute(args)
+      post = Post.find_by(id: args[:post_id])
+
+      if post
+        TopicTrackingState.publish_unmuted(post.topic)
+        if post.post_number > 1
+          TopicTrackingState.publish_muted(post.topic)
+          TopicTrackingState.publish_unread(post)
+        end
+        TopicTrackingState.publish_latest(post.topic, post.whisper?)
+      end
+    end
+
+  end
+end
diff --git a/lib/post_jobs_enqueuer.rb b/lib/post_jobs_enqueuer.rb
index cd80eaa..1fbbe01 100644
--- a/lib/post_jobs_enqueuer.rb
+++ b/lib/post_jobs_enqueuer.rb
@@ -57,12 +57,7 @@ class PostJobsEnqueuer
   end
 
   def after_post_create
-    TopicTrackingState.publish_unmuted(@post.topic)
-    if @post.post_number > 1
-      TopicTrackingState.publish_muted(@post.topic)
-      TopicTrackingState.publish_unread(@post)
-    end
-    TopicTrackingState.publish_latest(@topic, @post.whisper?)
+    Jobs.enqueue(:post_update_topic_tracking_state, post_id: @post.id)
 
     Jobs.enqueue_in(SiteSetting.email_time_window_mins.minutes,
       :notify_mailing_list_subscribers,
diff --git a/spec/components/post_creator_spec.rb b/spec/components/post_creator_spec.rb
index 310ba1a..536015b 100644
--- a/spec/components/post_creator_spec.rb
+++ b/spec/components/post_creator_spec.rb
@@ -128,8 +128,13 @@ describe PostCreator do
         expect(channels.find { |s| s =~ /new/ }).to eq(nil)
       end
 
-      it "generates the correct messages for a secure topic" do
+      it 'enqueues job to generate messages' do
+        p = creator.create
+        expect(job_enqueued?(job: :post_update_topic_tracking_state, args: { post_id: p.id })).to eq(true)
+      end
 
+      it "generates the correct messages for a secure topic" do
+        Jobs.run_immediately!
         UserActionManager.enable
 
         admin = Fabricate(:admin)
@@ -169,7 +174,7 @@ describe PostCreator do
       end
 
       it 'generates the correct messages for a normal topic' do
-
+        Jobs.run_immediately!
         UserActionManager.enable
 
         p = nil

GitHub sha: b1f32f2f

1 Like

This commit appears in #11682 which was approved by eviltrout. It was merged by jbrw.

This commit has been mentioned on Discourse Meta. There might be relevant details there: