Scalability work on user backup stream generation.
authorBrion Vibber <brion@pobox.com>
Fri, 25 Feb 2011 19:04:57 +0000 (11:04 -0800)
committerBrion Vibber <brion@pobox.com>
Fri, 25 Feb 2011 20:15:38 +0000 (12:15 -0800)
commit55b1f3d84c7390528634db5b95396a181e13003c
tree26b62caaa03fb9bb48dee62f61ed137b85580abd
parent77c280a48b3c3a5582b20a2a1b7c1b0d045760c1
Scalability work on user backup stream generation.

UserActivityStream -- used to create a full activity stream including subscriptions, favorites, notices, etc -- normally buffers everything into memory at once. This is infeasible for accounts with long histories of serious usage; it can take tens of seconds just to pull all records from the database, and working with them all in memory is very likely to hit resource limits.
This commit adds an alternate mode for this class which avoids pulling notices until during the actual output. Instead of pre-sorting and buffering all the notices, empty spaces between the other activities are filled in with notices as we're making output. This means more smaller queries spread out during operations, and less stuff kept in memory.

Callers (backupaccount action, and backupuser.php) which can stream their output pass an $outputMode param of UserActivityStream::OUTPUT_RAW, and during getString() it'll send straight to output as well as slurping the notices in this extra funky fashion.
Other callers will let it default to the OUTPUT_STRING mode, which keeps the previous behavior.

There should be a better way to do this, swapping out the stringer output for raw output more consitently.
actions/backupaccount.php
lib/useractivitystream.php
scripts/backupuser.php