Incremental Updates and the Problem of N+2
There are two main ways to handle software updates: provide an updated installer, or provide a smaller updater that only includes the changes. (Either method can be automated.) Incremental updates have advantages, especially if you’re dealing with something as massive as, say, World of Warcraft, or Microsoft Office. But they do make things more complicated for the publisher.
One problem is the upgrade path. It’s one thing to provide an updater that goes from version N to version N+1. But what if someone doesn’t run the updater until N+2 is available? Or worse, N+3?
Let’s say someone needs to upgrade from version A to version C, skipping version B. There are three approaches I’ve seen to this problem.
- Sequential Updates. Update from A to B, then run the updater again to go from B to C. Simple for the vendor, but a pain for the user. This is the way Microsoft Update works, which is why you need to re-run Windows Update a million times when you set up a new system (rebooting every other time).
- Multiple patches. Provide an extra patch that goes straight from A to C. This is how phpBB provides updates, and I seem to recall it’s the way Apple’s software update works. This is simplest for the user (assuming the updater picks the patch automatically), but can get really complicated once you start adding versions D, F, G, H, and I.
- Fallback. If someone skips a patch, just send them the whole installer. This assumes most users will be keeping up to date, so it’s most useful if the users check regularly or if the system checks automatically. This is the way Firefox’s updater works.
There are hybrid approaches out there. You could provide multiple patches for N+1 and N+2, but fall back to a full update for N+3. You could automate the sequential updates so that the installer grabs the A→B patch and the B→C patch at the same time, installs the first one, then installs the second one. You could even use different approaches for each version. Adobe Reader provides a patch that will update any 7.0.x version to 7.0.5, then another one that updates 7.0.5 to 7.0.7.
There doesn’t seem to be a “right” method, at least not yet. It seems to be a matter of balancing out priorities, and it probably depends heavily on the number of products you need to manage.