Try fixing ThreadResolveWorker calls (#3599)

* Try fixing ThreadResolveWorker calls

From my understanding of ActiveRecord, a transaction is commited as soon as
the exit of the outmost ActiveRecord.transaction block. However, inner
transaction blocks will exit without the transaction being commited.

In this case, ThreadResolveWorker were fired *within* a transaction block,
so moving the call out of it should do the trick. However, this is somewhat
fragile, as this whole codepath could be called within yet another transaction.

* Set status thread within the transaction block if it is immediately available from database
This commit is contained in:
ThibG 2017-06-06 00:09:14 +02:00 committed by Eugen Rochko
parent e859d6f259
commit 7adac1bc51
1 changed files with 7 additions and 13 deletions

View File

@ -69,9 +69,16 @@ class ProcessFeedService < BaseService
end end
end end
status.thread = find_status(thread(@xml).first) if thread?(@xml)
status.save! status.save!
end end
if thread?(@xml) && status.thread.nil?
Rails.logger.debug "Trying to attach #{status.id} (#{id(@xml)}) to #{thread(@xml).first}"
ThreadResolveWorker.perform_async(status.id, thread(@xml).second)
end
notify_about_mentions!(status) unless status.reblog? notify_about_mentions!(status) unless status.reblog?
notify_about_reblog!(status) if status.reblog? && status.reblog.account.local? notify_about_reblog!(status) if status.reblog? && status.reblog.account.local?
@ -154,11 +161,6 @@ class ProcessFeedService < BaseService
conversation: find_or_create_conversation(entry) conversation: find_or_create_conversation(entry)
) )
if thread?(entry)
Rails.logger.debug "Trying to attach #{status.id} (#{id(entry)}) to #{thread(entry).first}"
status.thread = find_or_resolve_status(status, *thread(entry))
end
mentions_from_xml(status, entry) mentions_from_xml(status, entry)
hashtags_from_xml(status, entry) hashtags_from_xml(status, entry)
media_from_xml(status, entry) media_from_xml(status, entry)
@ -166,14 +168,6 @@ class ProcessFeedService < BaseService
[status, true] [status, true]
end end
def find_or_resolve_status(parent, uri, url)
status = find_status(uri)
ThreadResolveWorker.perform_async(parent.id, url) if status.nil?
status
end
def find_or_create_conversation(xml) def find_or_create_conversation(xml)
uri = xml.at_xpath('./ostatus:conversation', ostatus: TagManager::OS_XMLNS)&.attribute('ref')&.content uri = xml.at_xpath('./ostatus:conversation', ostatus: TagManager::OS_XMLNS)&.attribute('ref')&.content
return if uri.nil? return if uri.nil?