forked from treehouse/mastodon
Fix race condition when processing incoming OStatus messages (#5013)
* Avoid races in incoming OStatus toots processing * oops * oops againsignup-info-prompt
parent
bb4d005a83
commit
34fa305a00
|
@ -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}"
|
||||
|
||||
RedisLock.acquire(lock_options) do |lock|
|
||||
if lock.acquired?
|
||||
# Return early if status already exists in db
|
||||
status = find_status(id)
|
||||
@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
|
||||
|
|
Loading…
Reference in New Issue