[PR #6939] [client] Fix tray menu item leak on relayout #27547

Open
opened 2026-08-05 07:08:52 -04:00 by saavagebueno · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/netbirdio/netbird/pull/6939
Author: @pappz
Created: 7/28/2026
Status: 🔄 Open

Base: mainHead: fix/tray-menu-item-leak


📝 Commits (3)

  • 29b9734 [client] Fix tray menu item leak on relayout
  • 4b915e4 [client] Hold menuMu across tray item setters
  • 8a6df99 Merge branch 'main' into fix/tray-menu-item-leak

📊 Changes

3 files changed (+39 additions, -29 deletions)

View changed files

📝 client/ui/tray.go (+23 -16)
📝 client/ui/tray_profiles.go (+10 -5)
📝 client/ui/tray_session.go (+6 -8)

📄 Description

Describe your changes

Fix a memory leak in the tray menu: every relayout built a brand-new menu tree while the replaced one was never destroyed. Wails keeps each MenuItem in a process-global map until Destroy is called, so all items of every previous tree
(labels, click closures, bitmaps, submenus) stayed reachable forever and the GUI's memory grew with every status transition, profile refresh or language change.

The fix destroys the replaced tree right after SetMenu swaps in the new one. Since the old items can now be destroyed, the Connect/Disconnect click handlers no longer capture their own menu item for the async error path; they resolve
the current item under the menu lock instead. Additionally loadProfiles now relayouts only when the profile rows actually changed, which drops the redundant full menu rebuilds (previously 2-3 per status transition, now typically 1).

Stack

Checklist

  • Is it a bug fix
  • Is a typo/documentation fix
  • Is a feature enhancement
  • It is a refactor
  • Created tests that fail without the change (if possible)
  • This change does not modify the public API, gRPC protocols, functionality behavior, CLI / service flags, or introduce a new feature — OR I have discussed it with the NetBird team beforehand (link the issue / Slack thread in the description). See CONTRIBUTING.md.

By submitting this pull request, you confirm that you have read and agree to the terms of the Contributor License Agreement.

Documentation

Select exactly one:

  • I added/updated documentation for this change
  • Documentation is not needed for this change (explain why)

Docs PR URL (required if "docs added" is checked)

Paste the PR link from https://github.com/netbirdio/docs here:

https://github.com/netbirdio/docs/pull/__


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

Summary by CodeRabbit

  • Bug Fixes
    • Improved tray menu reliability for connect/disconnect actions, including safer handling while the menu is being rebuilt.
    • Prevented stale tray menu items from being referenced by current actions.
    • Reduced unnecessary tray menu relayouts by updating profiles only when user or profile list actually changes.
    • Improved tray updates when the active profile changes via background status flows.
    • Fixed concurrency issues updating the session-expires tray label to avoid conflicts during menu relayouts.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/netbirdio/netbird/pull/6939 **Author:** [@pappz](https://github.com/pappz) **Created:** 7/28/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `fix/tray-menu-item-leak` --- ### 📝 Commits (3) - [`29b9734`](https://github.com/netbirdio/netbird/commit/29b97340d6eeb33ef6e2761c62b0d8a078d621c6) [client] Fix tray menu item leak on relayout - [`4b915e4`](https://github.com/netbirdio/netbird/commit/4b915e4a5a14674a133f696ee31c54396cf9c3cb) [client] Hold menuMu across tray item setters - [`8a6df99`](https://github.com/netbirdio/netbird/commit/8a6df997b83858812d5353814f95523178f8342a) Merge branch 'main' into fix/tray-menu-item-leak ### 📊 Changes **3 files changed** (+39 additions, -29 deletions) <details> <summary>View changed files</summary> 📝 `client/ui/tray.go` (+23 -16) 📝 `client/ui/tray_profiles.go` (+10 -5) 📝 `client/ui/tray_session.go` (+6 -8) </details> ### 📄 Description ## Describe your changes Fix a memory leak in the tray menu: every relayout built a brand-new menu tree while the replaced one was never destroyed. Wails keeps each MenuItem in a process-global map until Destroy is called, so all items of every previous tree (labels, click closures, bitmaps, submenus) stayed reachable forever and the GUI's memory grew with every status transition, profile refresh or language change. The fix destroys the replaced tree right after SetMenu swaps in the new one. Since the old items can now be destroyed, the Connect/Disconnect click handlers no longer capture their own menu item for the async error path; they resolve the current item under the menu lock instead. Additionally loadProfiles now relayouts only when the profile rows actually changed, which drops the redundant full menu rebuilds (previously 2-3 per status transition, now typically 1). ## Issue ticket number and link ## Stack <!-- branch-stack --> ### Checklist - [x] Is it a bug fix - [ ] Is a typo/documentation fix - [ ] Is a feature enhancement - [ ] It is a refactor - [ ] Created tests that fail without the change (if possible) - [ ] This change does **not** modify the public API, gRPC protocols, functionality behavior, CLI / service flags, or introduce a new feature — **OR** I have discussed it with the NetBird team beforehand (link the issue / Slack thread in the description). See [CONTRIBUTING.md](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTING.md#discuss-changes-with-the-netbird-team-first). > By submitting this pull request, you confirm that you have read and agree to the terms of the [Contributor License Agreement](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT.md). ## Documentation Select exactly one: - [ ] I added/updated documentation for this change - [x] Documentation is **not needed** for this change (explain why) ### Docs PR URL (required if "docs added" is checked) Paste the PR link from https://github.com/netbirdio/docs here: https://github.com/netbirdio/docs/pull/__ <!-- codesmith:footer --> --- <a href="https://app.blacksmith.sh/netbirdio/codesmith/netbird/pr/6939"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v2.svg"><source media="(prefers-color-scheme: light)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-light-v2.svg"><img alt="View with [code]smith" src="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v2.svg"></picture></a> <a href="https://backend.blacksmith.sh/track/enable-autofix?expires=1787835850&installation_model_id=427504&pr_number=6939&repository=netbirdio%2Fnetbird&return_to=https%3A%2F%2Fgithub.com%2Fnetbirdio%2Fnetbird%2Fpull%2F6939&signature=110b714e5a405c137ab8cb8f78bb9ee4f83a220b04bc43abfe923a28fb3bb24e"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-light.svg"><img alt="Autofix with [code]smith" src="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark.svg"></picture></a> <sup>Need help on this PR? Tag <code>@codesmith-bot</code> with what you need. Autofix is disabled.</sup> <!-- codesmith:autofix:disabled --> <!-- /codesmith:footer --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved tray menu reliability for connect/disconnect actions, including safer handling while the menu is being rebuilt. * Prevented stale tray menu items from being referenced by current actions. * Reduced unnecessary tray menu relayouts by updating profiles only when user or profile list actually changes. * Improved tray updates when the active profile changes via background status flows. * Fixed concurrency issues updating the session-expires tray label to avoid conflicts during menu relayouts. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
saavagebueno added the pull-request label 2026-08-05 07:08:52 -04:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#27547