From 34fa305a001f18855fea2711c8d44da65b84ef24 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 19 Sep 2017 21:44:18 +0200 Subject: [PATCH] Fix race condition when processing incoming OStatus messages (#5013) * Avoid races in incoming OStatus toots processing * oops * oops again --- app/lib/ostatus/activity/creation.rb | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/app/lib/ostatus/activity/creation.rb b/app/lib/ostatus/activity/creation.rb index 4f4ef2971e..2687776f94 100644 --- 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