commit: 34fa305a001f18855fea2711c8d44da65b84ef24
parent: bb4d005a8381091911697175416eb9c37379155e
Author: ThibG <thib@sitedethib.com>
Date: Tue, 19 Sep 2017 21:44:18 +0200
Fix race condition when processing incoming OStatus messages (#5013)
* Avoid races in incoming OStatus toots processing
* oops
* oops again
Diffstat:
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/app/lib/ostatus/activity/creation.rb b/app/lib/ostatus/activity/creation.rb
@@ -14,14 +14,22 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
return result if result.first.present?
end
- Rails.logger.debug "Creating remote status #{id}"
-
- # Return early if status already exists in db
- status = find_status(id)
+ RedisLock.acquire(lock_options) do |lock|
+ if lock.acquired?
+ # Return early if status already exists in db
+ @status = find_status(id)
+ return [@status, false] unless @status.nil?
+ @status = process_status
+ end
+ end
- return [status, false] unless status.nil?
+ [@status, true]
+ end
+ def process_status
+ Rails.logger.debug "Creating remote status #{id}"
cached_reblog = reblog
+ status = nil
ApplicationRecord.transaction do
status = Status.create!(
@@ -55,7 +63,7 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
LinkCrawlWorker.perform_async(status.id) unless status.spoiler_text?
DistributionWorker.perform_async(status.id)
- [status, true]
+ status
end
def perform_via_activitypub
@@ -179,4 +187,8 @@ class OStatus::Activity::Creation < OStatus::Activity::Base
Account.where(uri: href).or(Account.where(url: href)).first || FetchRemoteAccountService.new.call(href)
end
end
+
+ def lock_options
+ { redis: Redis.current, key: "create:#{id}" }
+ end
end