mirror of
https://github.com/zulip/zulip.git
synced 2025-11-11 09:27:43 +00:00
Part of our codepath for subscribing users involves fetching the users' existing subscriptions to make sure we can do things like properly report to the clients that the users were already subscribed. This codepath used to be coupled to code that helped users maintain unique stream colors. Suppose you are creating a new stream, and you are importing users from an older stream with 15k subscribers, and each of your users is subscribed to about 20 streams. The prior code, instead of filtering on recipient_id, would literally look at every subscription for every user, which was kind of crazy if you didn't understand the pick-stream-color complications. Before this commit, we would fetch 300k rows with 15 columns each (granted, all but one of the columns are bool/int). That's a total of 4.5 million tiny objects that we had to glom into Django ORM objects and slice and dice. After this commit, we would fetch exactly zero rows for the are-they-already-subscribed logic. Yes, ZERO. If we were to mistakenly try to re-add the same 15k subscribers to the new stream (under the new code), we will now fetch 15k Sub rows instead of 300k. It is worth looking at the prior commit. We go through great pains to ensure that users get new stream colors when we invite them to a stream, and we still fetch a bunch of data for that. Instead of 4.5 million cells, it's more like 600k cells (2 columns per row), and it's less than that insofar as some users may only have 24 distinct colors among their many streams. It's a lot of work.
12 KiB
12 KiB