bug fix: Fix stream deactivation being super slow.

This fix prevents stream deactivation from being basically
un-usable for medium to large sites.  Instead of calling
bulk_remove_subscriptions one at a time for every individual
member of the realm, we call it once for all the users that
care about the stream.  This change makes a huge difference, but
the feature is still a bit clunky, and we should only temporarily
revert to this fix if future, more-invasive fixes have flaws.

Fixes #3631.
This commit is contained in:
Steve Howell 2017-02-15 08:08:57 -08:00 committed by Tim Abbott
parent c61d0a78f4
commit b215a23456
1 changed files with 10 additions and 3 deletions

View File

@ -648,9 +648,16 @@ def do_deactivate_user(user_profile, log=True, _cascade=True):
def do_deactivate_stream(stream, log=True): def do_deactivate_stream(stream, log=True):
# type: (Stream, bool) -> None # type: (Stream, bool) -> None
user_profiles = UserProfile.objects.filter(realm=stream.realm) subscriptions = Subscription.objects.select_related('user_profile').filter(
for user_profile in user_profiles: recipient__type=Recipient.STREAM,
bulk_remove_subscriptions([user_profile], [stream]) recipient__type_id=stream.id,
active=True)
user_profiles = [
sub.user_profile
for sub in subscriptions]
bulk_remove_subscriptions(user_profiles, [stream])
was_invite_only = stream.invite_only was_invite_only = stream.invite_only
stream.deactivated = True stream.deactivated = True