Fix race condition when processing incoming OStatus messages (#5013)
* Avoid races in incoming OStatus toots processing * oops * oops again
This commit is contained in:
		| @ -14,14 +14,22 @@ class OStatus::Activity::Creation < OStatus::Activity::Base | ||||
|       return result if result.first.present? | ||||
|     end | ||||
|  | ||||
|     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 | ||||
|  | ||||
|     [@status, true] | ||||
|   end | ||||
|  | ||||
|   def process_status | ||||
|     Rails.logger.debug "Creating remote status #{id}" | ||||
|  | ||||
|     # Return early if status already exists in db | ||||
|     status = find_status(id) | ||||
|  | ||||
|     return [status, false] unless status.nil? | ||||
|  | ||||
|     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 | ||||
|  | ||||
		Reference in New Issue
	
	Block a user