diff options
author | ThibG <thib@sitedethib.com> | 2017-06-06 00:09:14 +0200 |
---|---|---|
committer | Eugen Rochko <eugen@zeonfederated.com> | 2017-06-06 00:09:14 +0200 |
commit | 7adac1bc51d76fde4df51f4f3d18cf39b01516a4 (patch) | |
tree | 32b88f16e87b3a3cba89511acbf9760e7843065d /app | |
parent | e859d6f259cfe4aa61c2e68a18db95d34d460b81 (diff) |
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
Diffstat (limited to 'app')
-rw-r--r-- | app/services/process_feed_service.rb | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb index 9402baf18..56105838e 100644 --- a/app/services/process_feed_service.rb +++ b/app/services/process_feed_service.rb @@ -69,9 +69,16 @@ class ProcessFeedService < BaseService end end + status.thread = find_status(thread(@xml).first) if thread?(@xml) + status.save! 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_reblog!(status) if status.reblog? && status.reblog.account.local? @@ -154,11 +161,6 @@ class ProcessFeedService < BaseService 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) hashtags_from_xml(status, entry) media_from_xml(status, entry) @@ -166,14 +168,6 @@ class ProcessFeedService < BaseService [status, true] 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) uri = xml.at_xpath('./ostatus:conversation', ostatus: TagManager::OS_XMLNS)&.attribute('ref')&.content return if uri.nil? |