Firefox has it's own built-in update system. The update system supports
2 types of updates: complete and incremental. Completes can be
applied to any older version, unless there are some incompatible changes
in the MAR format.
Incremental updates can be applied only to a release they were generated
for.
Usually for the beta and release channels we generate incremental
updates against 3-4 versions. This way we try to minimize bandwidth
consumption for our end users and increase the number of users on the
latest version. For Nightly and Developer Edition builds we generate 5
incremental updates using funsize.
Both methods assume that we know ahead of time what versions should be
used for incremental updates. For releases and betas we use ADI stats to be as precise as
possible. However, these methods are static and don't use real-time
data.
The idea to generate incremental updates on demand has been around for
ages. Some of the challenges are:
- Acquiring real-time (or close to real-time) data for making decisions
on incremental update versions
- Size of the incremental updates. If the size is very close to the size
of the corresponding complete, there is reason to serve incremental
updates. One of the reasons is that the that the updater tries to use
the incremental update first, and then falls back to the complete in
case if something goes wrong. In this case the updater downloads both
the incremental and the complete.
Ben and I talked about this today
and to recap some of the ideas we had, I'll put them here.
- We still want to "pre-seed" most possible incremental updates before
we publish any updates
- Whenever Balrog serves a
complete-only update, it should generate a structured log entry and/or
an event to be consumed by some service, which should contain all
information required to generate a incremental update.
- The "new system" should be able to decide if we want to discard
incremental update generation, based on the size. These decisions
should be stored, so we don't try to generate incremental update again
next time. This information may be stored in Balrog to prevent further
events/logs.
- Before publishing the incremental update, we should test if they can
be applied without issues, similar to the update verify tests we run
for releases, but without hitting Balrog. After they pass this test,
we can publish them to Balrog and check if Balrog returns expected XML
with partial info in it.
- Minimize the amount of served completes, if we plan to generate
incremental updates. One of the ideas was to modify the client to
support responses like "Come in 5 minutes, I may have something for
you!"
The only remaining thing is to implement all these changes. :)