b20d23a8cd
A significant source of latency on googlesource.com is reading in new pack files from persistent storage to parse refs/meta/external-ids, sometimes several seconds per load in the case of a virtual host with thousands of users. This crops up when external IDs are updated as well as on cold server starts. Both of these instances are pretty frequent: external IDs are updated every time a new user registers, and servers are typically updated daily. Serializing this cache is a relatively cheap engineering cost to avoid these multi-second stalls, which are quite annoying for users. A server updating the external-ids ref bypasses a cache load, and instead updates the state in-memory, then puts the result back into the cache at the new ObjectId. When persisting the cache, this put also puts the result into persistent storage. In a multi-master environment, there is a race window between updating the ref value and putting the new persistent object, which means other masters reading the ref value may not find the persisted object. If multiple servers are receiving concurrent requests, there's a good chance one or more masters will have to re-load the data from NoteDb. This can be improved, but requires more surgery to ExternalIdCache to replace the value in the cache prior to committing the ref update. Change-Id: I31d31d8ed490d01ce963a8162afba3daf9c1efff |
||
---|---|---|
.. | ||
BUILD | ||
cache.proto |