From: Thibaut Girka Date: Sat, 16 Mar 2019 19:59:33 +0000 (+0100) Subject: Merge branch 'master' into glitch-soc/merge-upstream X-Git-Url: https://git.xn--scling-oua.cat.family/?a=commitdiff_plain;h=4aa6aba6ee95ba37df7ca1d9c65f360b1b00ec04;p=mastodon.git Merge branch 'master' into glitch-soc/merge-upstream Conflicts: - app/services/remove_status_service.rb Conflict because we still handle the direct timeline. Took upstream changes, with that one extra function call. - config/locales/ca.yml Conflict because theme names were updated. Decided to *keep* the theme names even if they are useless to avoid future conflicts. - config/locales/oc.yml Decided to *keep* the theme names even if they are useless to avoid future conflicts. - config/locales/pl.yml Decided to *keep* the theme names even if they are useless to avoid future conflicts. --- 4aa6aba6ee95ba37df7ca1d9c65f360b1b00ec04 diff --cc app/services/remove_status_service.rb index 7eec11ddf,747f209f3..6e4998e07 --- a/app/services/remove_status_service.rb +++ b/app/services/remove_status_service.rb @@@ -14,17 -14,22 +14,23 @@@ class RemoveStatusService < BaseServic @stream_entry = status.stream_entry @options = options - remove_from_self if status.account.local? - remove_from_followers - remove_from_lists - remove_from_affected - remove_reblogs - remove_from_hashtags - remove_from_public - remove_from_media if status.media_attachments.any? - remove_from_direct if status.direct_visibility? - - @status.destroy! + RedisLock.acquire(lock_options) do |lock| + if lock.acquired? + remove_from_self if status.account.local? + remove_from_followers + remove_from_lists + remove_from_affected + remove_reblogs + remove_from_hashtags + remove_from_public + remove_from_media if status.media_attachments.any? ++ remove_from_direct if status.direct_visibility? + + @status.destroy! + else + raise Mastodon::RaceConditionError + end + end # There is no reason to send out Undo activities when the # cause is that the original object has been removed, since @@@ -158,10 -163,7 +164,14 @@@ redis.publish('timeline:public:local:media', @payload) if @status.local? end + def remove_from_direct + @mentions.each do |mention| + Redis.current.publish("timeline:direct:#{mention.account.id}", @payload) if mention.account.local? + end + Redis.current.publish("timeline:direct:#{@account.id}", @payload) if @account.local? + end ++ + def lock_options + { redis: Redis.current, key: "distribute:#{@status.id}" } + end end