From cca82bf0a2f0ccbf0feda00763fd7df0877845b6 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Mon, 23 Jan 2017 21:29:34 +0100 Subject: [PATCH] Move merging/unmerging of timelines into background. Move blocking into background as well since it's a computationally expensive --- app/controllers/api/v1/accounts_controller.rb | 9 +++++++-- app/lib/feed_manager.rb | 9 +++++++++ app/services/follow_service.rb | 2 +- app/services/unfollow_service.rb | 17 +---------------- app/workers/block_worker.rb | 9 +++++++++ app/workers/merge_worker.rb | 9 +++++++++ app/workers/unmerge_worker.rb | 9 +++++++++ 7 files changed, 45 insertions(+), 19 deletions(-) create mode 100644 app/workers/block_worker.rb create mode 100644 app/workers/merge_worker.rb create mode 100644 app/workers/unmerge_worker.rb diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb index bd52dfb2..234844ed 100644 --- a/app/controllers/api/v1/accounts_controller.rb +++ b/app/controllers/api/v1/accounts_controller.rb @@ -65,8 +65,13 @@ class Api::V1::AccountsController < ApiController end def block - BlockService.new.call(current_user.account, @account) - set_relationship + BlockWorker.perform_async(current_user.account_id, @account.id) + + @following = { @account.id => false } + @followed_by = { @account.id => false } + @blocking = { @account.id => true } + @requested = { @account.id => false } + render action: :relationship end diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 19f9dc16..cdd26e69 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -50,6 +50,15 @@ class FeedManager trim(:home, into_account.id) end + def unmerge_from_timeline(from_account, into_account) + timeline_key = key(:home, into_account.id) + + from_account.statuses.select('id').find_each do |status| + redis.zrem(timeline_key, status.id) + redis.zremrangebyscore(timeline_key, status.id, status.id) + end + end + def inline_render(target_account, template, object) rabl_scope = Class.new do include RoutingHelper diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb index 555f01b6..87c16a62 100644 --- a/app/services/follow_service.rb +++ b/app/services/follow_service.rb @@ -38,7 +38,7 @@ class FollowService < BaseService NotificationWorker.perform_async(follow.stream_entry.id, target_account.id) end - FeedManager.instance.merge_into_timeline(target_account, source_account) + MergeWorker.perform_async(target_account.id, source_account.id) Pubsubhubbub::DistributionWorker.perform_async(follow.stream_entry.id) follow diff --git a/app/services/unfollow_service.rb b/app/services/unfollow_service.rb index 7973a361..f469793c 100644 --- a/app/services/unfollow_service.rb +++ b/app/services/unfollow_service.rb @@ -7,21 +7,6 @@ class UnfollowService < BaseService def call(source_account, target_account) follow = source_account.unfollow!(target_account) NotificationWorker.perform_async(follow.stream_entry.id, target_account.id) unless target_account.local? - unmerge_from_timeline(target_account, source_account) - end - - private - - def unmerge_from_timeline(from_account, into_account) - timeline_key = FeedManager.instance.key(:home, into_account.id) - - from_account.statuses.select('id').find_each do |status| - redis.zrem(timeline_key, status.id) - redis.zremrangebyscore(timeline_key, status.id, status.id) - end - end - - def redis - Redis.current + UnmergeWorker.perform_async(target_account.id, source_account.id) end end diff --git a/app/workers/block_worker.rb b/app/workers/block_worker.rb new file mode 100644 index 00000000..dc00db19 --- /dev/null +++ b/app/workers/block_worker.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class BlockWorker + include Sidekiq::Worker + + def perform(account_id, target_account_id) + BlockService.new.call(Account.find(account_id), Account.find(target_account_id)) + end +end diff --git a/app/workers/merge_worker.rb b/app/workers/merge_worker.rb new file mode 100644 index 00000000..0f288f43 --- /dev/null +++ b/app/workers/merge_worker.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class MergeWorker + include Sidekiq::Worker + + def perform(from_account_id, into_account_id) + FeedManager.instance.merge_into_timeline(Account.find(from_account_id), Account.find(into_account_id)) + end +end diff --git a/app/workers/unmerge_worker.rb b/app/workers/unmerge_worker.rb new file mode 100644 index 00000000..dbf7243d --- /dev/null +++ b/app/workers/unmerge_worker.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class UnmergeWorker + include Sidekiq::Worker + + def perform(from_account_id, into_account_id) + FeedManager.instance.unmerge_from_timeline(Account.find(from_account_id), Account.find(into_account_id)) + end +end