1
0
mirror of https://github.com/whippyshou/mastodon synced 2024-11-25 15:46:35 +09:00

Reduce chances of race conditions when processing deleted toots (#9815)

* Reduce chances of race conditions when processing deleted toots

* Prevent race condition when processing deleted toots
This commit is contained in:
ThibG 2019-01-16 15:42:00 +01:00 committed by Eugen Rochko
parent 5363c724fc
commit a4f07bad95
2 changed files with 11 additions and 3 deletions

View File

@ -5,10 +5,12 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
CONVERTED_TYPES = %w(Image Video Article Page).freeze CONVERTED_TYPES = %w(Image Video Article Page).freeze
def perform def perform
return if delete_arrived_first?(object_uri) || unsupported_object_type? || invalid_origin?(@object['id']) return if unsupported_object_type? || invalid_origin?(@object['id'])
RedisLock.acquire(lock_options) do |lock| RedisLock.acquire(lock_options) do |lock|
if lock.acquired? if lock.acquired?
return if delete_arrived_first?(object_uri)
@status = find_existing_status @status = find_existing_status
if @status.nil? if @status.nil?

View File

@ -21,11 +21,13 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
def delete_note def delete_note
return if object_uri.nil? return if object_uri.nil?
RedisLock.acquire(lock_options) do |_lock|
delete_later!(object_uri)
end
@status = Status.find_by(uri: object_uri, account: @account) @status = Status.find_by(uri: object_uri, account: @account)
@status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present? @status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present?
delete_later!(object_uri)
return if @status.nil? return if @status.nil?
if @status.public_visibility? || @status.unlisted_visibility? if @status.public_visibility? || @status.unlisted_visibility?
@ -68,4 +70,8 @@ class ActivityPub::Activity::Delete < ActivityPub::Activity
def payload def payload
@payload ||= Oj.dump(@json) @payload ||= Oj.dump(@json)
end end
def lock_options
{ redis: Redis.current, key: "create:#{object_uri}" }
end
end end