Fix the disappearance of avatar backends provided by extensions.

Review Request #9403 — Created Nov. 27, 2017 and submitted

Information

Djblets
release-1.0.x
9e0168e...

Reviewers

Avatar backends provided by extensions had a tendency to disappear
periodically from the enabled list, with the default backend being unset
as well. This was the result of the AvatarServiceRegistry attempting
to self-manage the settings a bit too closely, checking during
population and attribute accessors for whether stored IDs make sense
with regards to the currently-populated backends and erasing IDs that
don't currently map.

This meant that any IDs pertaining to backends owned by an extension
that hadn't yet initialized hooks could be lost when certain operations
were performed, with the data being erased from settings. Along with
this, shutting down an extension (such as during extension manager
reload or when shutting down an Apache thread) would unregister the
backend, which would also remove the enabled/default backend IDs.

The fix is to simplify the accessors, population, and unregistration,
removing these side effects. IDs stored in settings are no longer
removed unless explicitly requested by disabling a matching backend
(which can now be done based on the ID instead of the class) or changing
the default backend. Otherwise, they're preserved and loading takes into
account that these just might not be available yet.

This means that code can attempt to look up the default backend class or
the list of enabled backend classes before an extension registers a
backend, and then after registration, and the former information will
exclude the registered class but the latter will include it, without
having to repopulate. It also means that the former will be returned
after disabling the extension, but that the latter will once again be
returned after re-enabling.

If an administrator re-saves the list of enabled avatar backends and the
default backend from the administration UI, the new settings will no
longer include any unregistered backends, which will keep settings from
forever including backends from every extension ever loaded.

Unit tests have been updated to test for this and to make some parts
more clear. There's also some improvements to documentation with the
registry that was noted while documenting new methods and building docs.

Added a custom backend, verified it was available in Avatar Settings.
Made it the default and enabled it. Then I removed that custom backend
and accessed pages, including Avatar Settings. Saw that I got log
messages about this not being available, but no crash. The backend wans't
being shown in the list of available backends anymore. However, it was
still listed in the siteconfig settings payload.

Re-enabled the backend and saw that it was once again working and
available in Avatar Settings.

Re-disabled and saved Avatar Settings. Saw that the IDs were removed
from siteconfig.

Unit tests pass.

Description From Last Updated

This should fit on one line, no?

daviddavid
chipx86
david
  1. 
      
  2. djblets/avatars/registry.py (Diff revision 2)
     
     
     
    Show all issues

    This should fit on one line, no?

  3. 
      
brennie
  1. Ship It!
  2. 
      
chipx86
Review request changed
Status:
Completed
Change Summary:
Pushed to release-1.0.x (bdd128c)