]> cat aescling's git repositories - mastodon.git/commitdiff
Avoid duplicate work by merging ReplyDistributionWorker into DistributionWorker ...
authorThibG <thib@sitedethib.com>
Sun, 30 Dec 2018 18:00:04 +0000 (19:00 +0100)
committerEugen Rochko <eugen@zeonfederated.com>
Sun, 30 Dec 2018 18:00:04 +0000 (19:00 +0100)
app/services/post_status_service.rb
app/workers/activitypub/distribution_worker.rb
app/workers/activitypub/reply_distribution_worker.rb [deleted file]

index d0c4fe146eb368c78ef83421ebae48c4a511f04a..eff1b1461ccaf39960c11b17f5d2c60207bd5f70 100644 (file)
@@ -44,7 +44,6 @@ class PostStatusService < BaseService
     DistributionWorker.perform_async(status.id)
     Pubsubhubbub::DistributionWorker.perform_async(status.stream_entry.id)
     ActivityPub::DistributionWorker.perform_async(status.id)
-    ActivityPub::ReplyDistributionWorker.perform_async(status.id) if status.reply? && status.thread.account.local?
 
     if options[:idempotency].present?
       redis.setex("idempotency:status:#{account.id}:#{options[:idempotency]}", 3_600, status.id)
index 59aacabfd728bd9ecf71b51f0eafcaa175a38ab4..d83f017000896eb9dc0f9320f65a1db544da839d 100644 (file)
@@ -31,7 +31,14 @@ class ActivityPub::DistributionWorker
   end
 
   def inboxes
-    @inboxes ||= @account.followers.inboxes
+    # Deliver the status to all followers.
+    # If the status is a reply to another local status, also forward it to that
+    # status' authors' followers.
+    @inboxes ||= if @status.reply? && @status.thread.account.local? && @status.distributable?
+                   @account.followers.or(@status.thread.account.followers).inboxes
+                 else
+                   @account.followers.inboxes
+                 end
   end
 
   def signed_payload
diff --git a/app/workers/activitypub/reply_distribution_worker.rb b/app/workers/activitypub/reply_distribution_worker.rb
deleted file mode 100644 (file)
index 892cc14..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-# frozen_string_literal: true
-
-class ActivityPub::ReplyDistributionWorker
-  include Sidekiq::Worker
-
-  sidekiq_options queue: 'push'
-
-  def perform(status_id)
-    @status  = Status.find(status_id)
-    @account = @status.thread&.account
-
-    return unless @account.present? && @status.distributable?
-
-    ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url|
-      [payload, @status.account_id, inbox_url]
-    end
-  rescue ActiveRecord::RecordNotFound
-    true
-  end
-
-  private
-
-  def inboxes
-    @inboxes ||= @account.followers.inboxes
-  end
-
-  def signed_payload
-    Oj.dump(ActivityPub::LinkedDataSignature.new(unsigned_payload).sign!(@status.account))
-  end
-
-  def unsigned_payload
-    ActiveModelSerializers::SerializableResource.new(
-      @status,
-      serializer: ActivityPub::ActivitySerializer,
-      adapter: ActivityPub::Adapter
-    ).as_json
-  end
-
-  def payload
-    @payload ||= @status.distributable? ? signed_payload : Oj.dump(unsigned_payload)
-  end
-end