From a206fa80379868e1482d55a444695912ef6f3f32 Mon Sep 17 00:00:00 2001 From: alpaca-tc Date: Fri, 5 May 2017 06:44:39 +0900 Subject: [PATCH] Delete records in smaller transaction (#2802) --- app/services/suspend_account_service.rb | 22 +++++++++---- spec/fabricators/favourite_fabricator.rb | 3 +- spec/services/suspend_account_service_spec.rb | 33 +++++++++++++++++++ 3 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 spec/services/suspend_account_service_spec.rb diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb index 66517470e6..0cf574ca2f 100644 --- a/app/services/suspend_account_service.rb +++ b/app/services/suspend_account_service.rb @@ -17,12 +17,16 @@ class SuspendAccountService < BaseService RemoveStatusService.new.call(status) end - @account.media_attachments.destroy_all - @account.stream_entries.destroy_all - @account.notifications.destroy_all - @account.favourites.destroy_all - @account.active_relationships.destroy_all - @account.passive_relationships.destroy_all + [ + @account.media_attachments, + @account.stream_entries, + @account.notifications, + @account.favourites, + @account.active_relationships, + @account.passive_relationships + ].each do |association| + destroy_all(association) + end end def purge_profile @@ -35,6 +39,10 @@ class SuspendAccountService < BaseService end def unsubscribe_push_subscribers - @account.subscriptions.destroy_all + destroy_all(@account.subscriptions) + end + + def destroy_all(association) + association.in_batches.destroy_all end end diff --git a/spec/fabricators/favourite_fabricator.rb b/spec/fabricators/favourite_fabricator.rb index e598d38385..464ac8d71a 100644 --- a/spec/fabricators/favourite_fabricator.rb +++ b/spec/fabricators/favourite_fabricator.rb @@ -1,3 +1,4 @@ Fabricator(:favourite) do - + account + status end diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb new file mode 100644 index 0000000000..1cb647e8da --- /dev/null +++ b/spec/services/suspend_account_service_spec.rb @@ -0,0 +1,33 @@ +require 'rails_helper' + +RSpec.describe SuspendAccountService do + describe '#call' do + subject do + -> { described_class.new.call(account) } + end + + let!(:account) { Fabricate(:account) } + let!(:status) { Fabricate(:status, account: account) } + let!(:media_attachment) { Fabricate(:media_attachment, account: account) } + let!(:notification) { Fabricate(:notification, account: account) } + let!(:favourite) { Fabricate(:favourite, account: account) } + let!(:active_relationship) { Fabricate(:follow, account: account) } + let!(:passive_relationship) { Fabricate(:follow, target_account: account) } + let!(:subscription) { Fabricate(:subscription, account: account) } + + it 'deletes associated records' do + is_expected.to change { + [ + account.statuses, + account.media_attachments, + account.stream_entries, + account.notifications, + account.favourites, + account.active_relationships, + account.passive_relationships, + account.subscriptions + ].map(&:count) + }.from([1, 1, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0, 0]) + end + end +end