Apply staged upgrade when mount processes exit#1976
Draft
tyrielv wants to merge 1 commit into
Draft
Conversation
The installer replaces GVFS.Service.exe in-place even during a staged upgrade, so the running service is always the new version. Add a PendingUpgradeMonitor that registers Process.Exited callbacks on GVFS.Mount processes and applies the staged upgrade once all have exited. This is event-driven (no polling) and works regardless of which version of gvfs.exe triggered the unmount. Previously only 'gvfs unmount' triggered the upgrade check (via UnregisterRepoRequest). 'gvfs service --unmount-all' sets SkipUnregister=true to preserve automount registration, so no message reached the service and staged upgrades sat in PendingUpgrade\ indefinitely. Changes: - PendingUpgradeHandler: return UpgradeResult enum instead of void, add concurrency lock, add IsPending() helper - PendingUpgradeMonitor: new class — monitors mount process exits, debounces (5s), retries on new mounts, self-stops on completion - GVFSService: start monitor when startup upgrade is deferred, dispose on shutdown - upgrade-tests.yaml: add unmount-all-triggers-upgrade CI scenario Assisted-by: Claude Opus 4.6 Signed-off-by: Tyrie Vella <tyrielv@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
When the installer runs with mounts active, it stages new files to
PendingUpgrade\. The service applies this upgrade when all mounts aregone — but the trigger relied on
UnregisterRepoRequest, which onlygvfs unmountsends.gvfs service --unmount-allsetsSkipUnregister=true(to preserveautomount registration), so no message reached the service and staged
upgrades sat in
PendingUpgrade\indefinitely until the next servicerestart.
Solution: Process Exit Monitor
The installer always replaces
GVFS.Service.exein-place (even duringstaging), so the running service is always the new version. Instead of
requiring the client
gvfs.exe(which may be an old version) to send anew message, the service proactively monitors mount process exits:
PendingUpgradeMonitor— registersProcess.Exitedcallbacks onall
GVFS.Mountprocesses. When one exits, a debounced timer (5s)fires and calls
TryApplyPendingUpgrade. If new mounts started, itre-registers. When the upgrade completes or no pending upgrade remains,
the monitor stops itself. Zero polling cost — purely event-driven.
PendingUpgradeHandler— now returns anUpgradeResultenum(
NoPending,Applied,DeferredMountsRunning,NotReady,Failed) so callers can react. Adds a static lock to preventconcurrent apply attempts from startup, RequestHandler, and monitor.
GVFSService— starts the monitor when the startup upgrade checkis deferred due to running mounts. Disposes on shutdown.
The existing
RequestHandlerunmount trigger is preserved asbelt-and-suspenders for the normal
gvfs unmountpath.Test
New
unmount-all-triggers-upgradescenario in the CI upgrade testmatrix. Installs LKG, mounts, stages new version, uses
--unmount-all(which runs the old LKG
gvfs.exe), and verifiesPendingUpgrade\is consumed by the monitor without a service restart.