Dramatically increase cache hit rate for feed


Dramatically increase cache hit rate for feed

Ref T8631. The query plan for feed stories is really bad right now, because we miss caches we should be hitting:

  • The workspace cache is stored at each query, so adjacent queries can't benefit from the cache (only subqueries). Feed has primarily sibling queries.
    • There is no technical reason to do this. Store the workspace cache on the root query, so sibling queries can hit it.
  • In ObjectQuery, we check the workspace once, then load all the PHIDs. When the PHIDs are a mixture of transactions and objects, we always miss the workspace and load the objects twice.
    • Instead, check the workspace after loading each type of object.
  • HandleQuery does not set itself as the parent query for ObjectQuery, so handles never hit the workspace cache.
    • Pass it, so they can hit the workspace cache.
  • Feed's weird PhabricatorFeedStory::loadAllFromRows() method does not specify a parent query on its object/handle queries.
    • Just declare the object query to be the "root" query until this eventually gets cleaned up.

Test Plan: Saw queries for each object drop from 4-6x to 1x in /feed/.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T8631

Differential Revision: https://secure.phabricator.com/D13479