android: fix exit-node intent worker completion - #848
Open
zs311521 wants to merge 1 commit into
Open
Conversation
Updates tailscale/tailscale#12720 Updates tailscale/tailscale#17960 Signed-off-by: Zura <clau@zura.rocks>
zs311521
force-pushed
the
fix/use-exit-node-worker-structured-concurrency
branch
from
September 1, 2026 02:50
870a8a5 to
0af5732
Compare
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.
Summary
editPrefscallback inside the worker-owned coroutine scopeProblem
UseExitNodeWorkercreates a detachedCoroutineScope(Dispatchers.Default + Job()), startseditPrefs, and then joins the rootJob. A standalone rootJobdoes not complete when its children finish, and nothing explicitly completes it. The non-completing worker can be stopped or rescheduled by WorkManager, consistent with the delayed preference replays reported in tailscale/tailscale#17960.This change bridges the one-shot callback with structured cancellation, keeps the LocalAPI request under the worker lifecycle, applies a 35-second bound over the existing 30-second LocalAPI timeout, and reports success only when the returned effective exit-node ID and LAN setting match the request.
Cancellation prevents late callback completion but cannot undo a preferences PATCH already accepted by the backend.
Testing
make fmt-checkmake testmake go-test./tool/go mod tidywith a clean diffmake tailscale-debug.apkRelated work
Fixes tailscale/tailscale#12720.
Fixes tailscale/tailscale#17960.
PR #793 also changes this worker as part of a broader Android 11 foreground-work change. This PR isolates the callback lifecycle correction and its regression tests. It does not add receiver cached-state shortcuts or foreground notifications.
PR #810 addresses a separate cold-start LocalAPI initialization crash. This change does not modify cold-start initialization.